设置simpleRNN的维度(请提供第一维度相同的数据)

Set the dimension for simpleRNN (Please provide data which shares the same first dimension)

我正在尝试测试 simpleRNN

stft_librosa是numpy数据(257, 958)

我的想法被切片 (10,958) 用于输入并得到 (1,958) 用于输出。

epochs = 10
batch = 24
model.add(
    SimpleRNN(1, activation=None, input_shape=(958,1), return_sequences=True)
)
model.add(Dense(1, activation="linear")) 
model.compile(loss="mean_squared_error", optimizer="sgd")
print(model.summary())

for num in range(0, epochs):
    print(num + 1, '/', epochs, ' start')
    
    for i,data in enumerate(stft_librosa):
        if i == 0:continue
        in_data = stft_librosa[i - 1]
        out_data = stft_librosa[i]
        model.fit(in_data, out_data, epochs=1, shuffle=False, batch_size=batch)
        model.reset_states()
    print(num+1, '/', epochs, ' epoch is done!')

model.save('/data/mymodel')

出现这样的错误,我该如何解决??

ValueError: Data cardinality is ambiguous:
  x sizes: 9
  y sizes: 958
Please provide data which shares the same first dimension.

model.summary() 在这里。

Output Shape              Param #   

simple_rnn (SimpleRNN)       (None, 9, 958)            1836486   

dense (Dense)                (None, 9, 1)              959       

Total params: 1,837,445
Trainable params: 1,837,445
Non-trainable params: 0

第一个维度是批量维度。输入和输出应该相同。

试试这个:

    in_data = stft_librosa[i - 1][tf.newaxis, :]
    out_data = stft_librosa[i][tf.newaxis, :]

input_shape=(9,958) 是错误的(这是在您编辑问题之后)。正确的一个是 input_shape=(958, 1) - 您在原始问题中的那个。(请不要那样编辑您的问题,您已经通过添加 Dense 层更改了模型,并且通过更改输入形状 ).

的错误

在您更新问题之前,最初的错误是由于您输入模型的输入形状不正确造成的。该模型需要 3 维输入——第一个是批量大小,但你一次只给它一个样本。

这里是重塑数据的方法。

x = stft_librosa[:-1, :].reshape((-1, 958, 1))
y = stft_librosa[1:, :].reshape((-1, 958, 1))
print(x.shape, y.shape)

# ((256, 958, 1), (256, 958, 1))

这会将 y 向前移动一个索引并从 x 中删除最后一个索引。

一旦你有了它,你就可以只调用 fit 方法一次而不需要那个循环。

model = Sequential([
    SimpleRNN(1, activation=keras.activations.linear, input_shape=(958, 1), return_sequences=True),
    Dense(1, activation=keras.activations.linear)
])
model.compile(optimizer=SGD(lr=0.000001), loss=keras.losses.MeanSquaredError())

model.fit(x, y, epochs=5, batch_size=24)

#Epoch 1/5
#11/11 [==============================] - 3s 266ms/step - loss: 2.8277
#Epoch 2/5
#11/11 [==============================] - 3s 266ms/step - loss: 2.0028
#Epoch 3/5
#11/11 [==============================] - 2s 224ms/step - loss: 1.8698
#Epoch 4/5
#11/11 [==============================] - 3s 229ms/step - loss: 1.7877
#Epoch 5/5
#11/11 [==============================] - 2s 226ms/step - loss: 1.7307

我建议您恢复对问题的编辑,因为原始代码比当前代码更有意义