LSTM网络期望目标在最后一层具有2个维度,但具有形状的数组(996、1、1)



我正在尝试使用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)

相关内容

最新更新