我正在尝试使用TensorFlow Backend在玩具数据上训练LSTM,并且正在遇到此错误:
value error:检查目标时错误:预期的密度_39具有2个维度,但具有形状的数组(996、1、1(
呼叫model.fit
时立即发生错误;似乎什么都没有。在我看来,Keras正在检查尺寸,但忽略了我目标的每批输入的事实。该错误显示了我的目标数组的完整尺寸,这对我来说意味着至少在检查尺寸时,它永远不会被Keras批处理成批处理。对于我的一生,我无法弄清楚为什么会有所帮助。
我的网络定义具有预期层输出形状的评论:
batch_shape = (8, 5, 1)
x_in = Input(batch_shape=batch_shape, name='input') # (8, 5, 1)
seq1 = LSTM(8, return_sequences=True, stateful=True)(x_in) # (8, 5, 8)
dense1 = TimeDistributed(Dense(8))(seq1) # (8, 5, 8)
seq2 = LSTM(8, return_sequences=False, stateful=True)(dense1) # (8, 8)
dense2 = Dense(8)(seq2) # (8, 8)
out = Dense(1)(dense2) # (8, 1)
model = Model(inputs=x_in, outputs=out)
optimizer = Nadam()
model.compile(optimizer=optimizer, loss='mean_squared_error')
model.summary()
模型摘要,如预期的:
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
input (InputLayer) (8, 5, 1) 0
_________________________________________________________________
lstm_28 (LSTM) (8, 5, 8) 320
_________________________________________________________________
time_distributed_18 (TimeDis (8, 5, 8) 72
_________________________________________________________________
lstm_29 (LSTM) (8, 8) 544
_________________________________________________________________
dense_38 (Dense) (8, 8) 72
_________________________________________________________________
dense_39 (Dense) (8, 1) 9
=================================================================
Total params: 1,017
Trainable params: 1,017
Non-trainable params: 0
_________________________________________________________________
我的玩具数据,其中目标只是一条线从100减少到0,而输入只是一个零数量。我想进行一步预测,因此我使用下面定义的rolling_window()
方法创建输入和目标的滚动窗口:
target = np.linspace(100, 0, num=1000)
target_rolling = rolling_window(target[4:], 1)[:, :, None]
target_rolling.shape # (996, 1, 1) <-- this seems to be the array that's causing the error
x_train = np.zeros((1000,))
x_train_rolling = rolling_window(x_train, 5)[:, :, None]
x_train_rolling.shape # (996, 5, 1)
rolling_window()
方法:
def rolling_window(arr, window):
shape = arr.shape[:-1] + (arr.shape[-1] - window + 1, window)
strides = arr.strides + (arr.strides[-1],)
return np.lib.stride_tricks.as_strided(arr, shape=shape, strides=strides)
和我的训练循环:
reset_state = LambdaCallback(on_epoch_end=lambda _, _: model.reset_states())
callbacks = [reset_state]
history = model.fit(x_train_rolling, y_train_rolling,
batch_size=8,
epochs=100,
validation_split=0.,
callbacks=callbacks)
我尝试过:
- 非态度的LSTM,但我确实需要最终应用的状态。同样的错误。
-
return_sequence=True
在第二个LSTM中,然后使用Flatten
层。同样的错误。 -
return_sequence=True
没有Flatten
层。这给出了不同的错误,因为它期望具有与输出相同形状的目标,而该目标是(batch_size, 5, 1)
而不是(batch_size, 1, 1)
。
。 - 一次在整个序列上运行相同的体系结构(批次大小为1(,而无需滚动窗口。这起作用,但只是学会近似我的目标的均值,并且对于我的目的而言是没有用的。
请注意,这些问题似乎都没有直接回答我的,尽管我真的很有希望:
- 检查目标时的错误:预期时间_distributed_5具有3个维度,但具有形状的数组(14724,1(
- LSTM和CNN:valueError:检查目标时错误:预期时间_distributed_1具有3个维度,但具有形状的数组(400,256(
- valueerror:检查目标时错误:预期的LSTM_27具有2个维度,但具有形状的数组(1、11、1(
- 期望的密度_218_input具有2个维度,但具有形状的数组(512、28、28、1(
- 期望密集_1具有2个维度,但具有形状的数组(308,1,6(
发布我在评论中写的解决方案:由于有一个额外的维度,因此" -1"使维度自我调整为适合其他维度的数字。由于只有两个维度,因此"(-1,1("将其"(996,1("。
target_rolling = target_rolling.reshape(-1,1)
之前 at target_rolling.shape # (996, 1, 1)