Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python LSTM网络期望最后一层的目标具有二维,但得到了形状为(996,1,1)的阵列_Python_Tensorflow_Keras_Lstm - Fatal编程技术网

Python LSTM网络期望最后一层的目标具有二维,但得到了形状为(996,1,1)的阵列

Python LSTM网络期望最后一层的目标具有二维,但得到了形状为(996,1,1)的阵列,python,tensorflow,keras,lstm,Python,Tensorflow,Keras,Lstm,我正在尝试使用TensorFlow后端对玩具数据使用keras来训练LSTM,但得到了以下错误: ValueError:检查目标时出错:预期稠密_39有2维,但得到了形状为(996,1,1)的数组 调用model.fit时立即发生错误;似乎什么也没发生。在我看来,Keras正在检查维度,但忽略了一个事实,即它应该在我的每一批输入中获取我的目标批次。这个错误显示了我的目标数组的完整维度,这对我来说意味着Keras从未将其拆分为批次,至少在检查维度时是这样。就我的一生而言,我不明白为什么会这样,或者

我正在尝试使用TensorFlow后端对玩具数据使用keras来训练LSTM,但得到了以下错误:

ValueError:检查目标时出错:预期稠密_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\u 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)
我的训练循环:

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\u sequence=True
    在第二个LSTM中,后面是一个
    flant
    层。同样的错误
  • return\u sequence=True
    展平
    层。这会产生一个不同的错误,因为它期望目标与输出具有相同的形状,此时目标是
    (batch\u size,5,1)
    ,而不是
    (batch\u size,1,1)
  • 一次在整个序列上运行相同的体系结构(批量大小为1),无需滚动窗口。这是可行的,但只是学习接近我的目标的平均值,对我的目的是无用的
请注意,这些问题似乎都不能直接回答我的问题,尽管我对以下几个问题抱有希望:


    • 发布我在评论中写下的解决方案: 因为有一个额外的维度,“-1”使维度自我调整到任何数字,以适应其他维度。由于只给出了两个维度,“(-1,1)”将使其成为“(996,1)”

      以前

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

      target_rolling=target_rolling.在target_rolling.shape#(996,1,1)处重塑(-1,1)似乎已经完成了!谢谢你@Tom!
      target_rolling = target_rolling.reshape(-1,1)
      
      at target_rolling.shape # (996, 1, 1)