gpt4 book ai didi

python - LSTM 网络期望最后一层的目标具有 2 维,但得到形状为 (996, 1, 1) 的数组

转载 作者:行者123 更新时间:2023-12-01 07:50:05 26 4
gpt4 key购买 nike

我尝试使用 TensorFlow 后端在玩具数据上通过 keras 训练 LSTM,但收到此错误:

ValueError: Error when checking target: expected dense_39 to have 2 dimensions, but got array with shape (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),无需滚动窗口。这可行,但只是学习近似我的目标的平均值,对我的目的来说毫无用处。

请注意,这些问题似乎都不能直接回答我的问题,尽管我对其中几个问题确实充满希望:

最佳答案

发布我在评论中写的解决方案:由于存在额外尺寸,“-1”使尺寸自行调整为适合其他尺寸的任何数字。由于只给出了两个维度,“(-1,1)”将使其变为“(996, 1)”。

target_rolling = target_rolling.reshape(-1,1)

之前

at target_rolling.shape # (996, 1, 1)

关于python - LSTM 网络期望最后一层的目标具有 2 维,但得到形状为 (996, 1, 1) 的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56278492/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com