Conv2D从张量中丢失了一个维度.导致不兼容的尺寸错误



我想为我的大学项目做一些LSTM和CNN的混合。

基本上,我有两种数据:一个网格是10x12矩阵,包含过去10天股票价格的12个技术指标,以及价格本身

这个想法是用CNN处理网格,然后使用输出作为LSTM的输入以及价格

这是我的代码

def model_robo():
grid=tf.keras.Input(shape=(10,12,1),dtype=tf.float32) #grid input
#processing with CNN
cnn_result=tf.keras.layers.TimeDistributed(Conv2D(1,kernel_size=(3,3),data_format="channels_first"))(grid) #here's the error 
cnn_result=tf.keras.layers.TimeDistributed(MaxPooling2D(2,2))(cnn_result)
cnn_result=tf.keras.layers.TimeDistributed(flatten())(cnn_result)
#processing with LSTM
lstm_input=Concatenate()([price,cnn_result])
masked_position=Masking(mask_value=-1)(lstm_input)
result=LSTM(50, name='LSTM')(masked_position)
prediction=(TimeDistributed(Dense(1,activation="relu")))(result)
model=tf.keras.Model(inputs=[grid,price],outputs=[prediction])
return model

但是当我试图用

调用模型时
model=model_robo()

它给:

ValueError: Input 0 of layer conv2d_1 is incompatible with the layer: : expected min_ndim=4, found ndim=3. Full shape received: (None, 12, 1)

源自:

cnn_result=tf.keras.layers.TimeDistributed(Conv2D(1,kernel_size=(3,3),data_format="channels_first"))(grid)

我还试着把:

grid=tf.keras.layers.Reshape((10,12,1))(grid)

在错误线上,没有运气

我已经用print(grid.shape)检查了网格的尺寸,它给了我(None,10,12,1),我确信这是正确的尺寸,但代码出于某种原因删除了第二维。

有人知道如何解决这个问题吗?如果您需要更多信息,请告诉我,谢谢。

在再次检查了每个函数的功能后,我意识到我不应该使用TimeDistributed,因为每个批处理已经代表了一段时间。

将行改为cnn_result=tf.keras.layers.Conv2D(1,kernel_size=(3,3))(grid)可以解决问题。

最新更新