Python 找到正确的输入&;conv1D Keras NN的输出形状

Python 找到正确的输入&;conv1D Keras NN的输出形状,python,tensorflow,keras,input,conv-neural-network,Python,Tensorflow,Keras,Input,Conv Neural Network,我建立了一个LSTM模型来分析时间序列,其输入矩阵X的大小为(1750,20,28),长度为1750 a,序列为20和28个特征。事实上,我用我的原始X矩阵和28个特征创建了一个长度为20的滑动窗口的3D矩阵。y矩阵的大小为(1750,) 我成功地将其用于LTSM(输入形状=X_列[1],X_列[2]) 它与第一层模型.add(layerlstm1)或堆叠的LSTM配合得非常好,但是它不会给出很好的结果(如果我运行两次相同的NN,则非常不稳定)。 然后,我尝试在相同的数据集上应用conv1D N

我建立了一个LSTM模型来分析时间序列,其输入矩阵X的大小为(1750,20,28),长度为1750 a,序列为20和28个特征。事实上,我用我的原始X矩阵和28个特征创建了一个长度为20的滑动窗口的3D矩阵。y矩阵的大小为(1750,) 我成功地将其用于LTSM(输入形状=X_列[1],X_列[2])

它与第一层模型.add(layerlstm1)或堆叠的LSTM配合得非常好,但是它不会给出很好的结果(如果我运行两次相同的NN,则非常不稳定)。 然后,我尝试在相同的数据集上应用conv1D NN,并使用相同的输入形状。我得到一个错误消息,我在下面介绍。 以下是模型定义和消息:

# available layers
layer_drop = keras.layers.Dropout(rate = dropout)
layer_dense1 = Dense(units= layer_1, activation = 'relu')
layer_LSTM1 = keras.layers.LSTM(units=layer_1, activation = 'relu' , return_sequences = False, input_shape=(X_train.shape[1], X_train.shape[2]))
layer_LSTMstack1 = keras.layers.LSTM(units=layer_2, activation = 'relu' , return_sequences = True, input_shape=(X_train.shape[1], X_train.shape[2]))
layer_LSTMstack2 = keras.layers.LSTM(units=layer_2, activation = 'relu' , return_sequences = True)
layer_LSTMstackend = keras.layers.LSTM(units=layer_2, activation = 'relu')
layer_conv1D1 = keras.layers.Conv1D(filters = 28, kernel_size= 3, activation = 'relu', input_shape=(X_train.shape[1], X_train.shape[2]))
layer_output = Dense(units = 1)

# Model architecture 
model.add(layer_conv1D1)
model.add(layer_dense1)
model.add(layer_output)
我得到以下反馈(我在其中添加了model.summary()


首先,让我们来讨论输入形状。我对“大小为(1750,20,28)的输入矩阵X”的解释是,批量大小为1750,是一个由20个时间步组成的1D系列,每个时间步有28个特征

添加卷积层时,批大小保持不变,时间步数通常保持不变(取决于过滤器如何适应时间步),并且输出的特征数将等于使用的过滤器数

因此,当您在卷积之后添加一个密集层时,您正在添加一个2D密集层(每个时间步对每个特征向量应用相同的权重)。为了避免这种情况,您需要添加
keras.layers.flatte()
在代码中的某个地方。Flatte会将2D卷积输出转换为1D。为了达到我认为您要达到的效果,我会像这样修改代码

model.add(layer_conv1D1)
model.add(layer_dense1)
model.add(keras.layers.Flatten())
model.add(layer_output)

首先,让我们来讨论输入形状。我对“大小为(1750,20,28)的输入矩阵X”的解释是,批量大小为1750,是一个由20个时间步组成的1D系列,每个时间步有28个特征

添加卷积层时,批大小保持不变,时间步数通常保持不变(取决于过滤器如何适应时间步),并且输出的特征数将等于使用的过滤器数

因此,当您在卷积之后添加一个密集层时,您正在添加一个2D密集层(每个时间步对每个特征向量应用相同的权重)。为了避免这种情况,您需要添加
keras.layers.flatte()
在代码中的某个地方。Flatte会将2D卷积输出转换为1D。为了达到我认为您要达到的效果,我会像这样修改代码

model.add(layer_conv1D1)
model.add(layer_dense1)
model.add(keras.layers.Flatten())
model.add(layer_output)

你发布了失败的那一行了吗?当你做一个模型时,我预计会出现错误。fit?是的,写一个输出错误的代码。事实上,我不知道它在哪里失败。我可以添加我用作附录的参数。这是我运行程序时的错误行:你发布了失败的那一行了吗?我预计你做模型时会出现错误。fi是的,编写一个输出错误的代码。事实上,我不知道它在哪里失败。我可以添加我用作附录的参数。这是我运行程序时的错误行:这正是正确的答案(但在密集层之前会出现平坦)谢谢。非常感谢!我这么做了,但是因为我是一个没有投票问题的新手,我的投票没有公开。为此感到抱歉,没有必要为必须遵守规则而感到抱歉!这正是正确的答案(但在密集层之前会出现平坦化)谢谢。非常感谢!我这么做了,但是因为我是一个新手,没有被投票的问题,我的投票不会公开出现。对此感到抱歉。没有必要为必须遵守规则而感到抱歉!
model.add(layer_conv1D1)
model.add(layer_dense1)
model.add(keras.layers.Flatten())
model.add(layer_output)