设置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
我建议您恢复对问题的编辑,因为原始代码比当前代码更有意义
我正在尝试测试 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
我建议您恢复对问题的编辑,因为原始代码比当前代码更有意义