ValueError:“顺序”层的输入 0 与该层不兼容:预期形状 =(无,33714,12),找到形状 =(无,12)

Posted

技术标签:

【中文标题】ValueError:“顺序”层的输入 0 与该层不兼容:预期形状 =(无,33714,12),找到形状 =(无,12)【英文标题】:ValueError: Input 0 of layer "sequential" is incompatible with the layer: expected shape=(None, 33714, 12), found shape=(None, 12) 【发布时间】:2022-01-03 03:51:55 【问题描述】:

我正在尝试运行一个简单的 RNN,其中包含从 csv 文件中提取的一些数据。我已经对我的数据进行了预处理并将它们分成训练集和验证集,但是我得到了上面的错误。 这是我的网络结构,也是我到目前为止所尝试的。我的形状是 x_train 的 (33714,12)、y_train 的 (33714,)、x_val 的 (3745,12) 和 y_val 的 (3745,)。

model = Sequential()
# LSTM LAYER IS ADDED TO MODEL WITH 128 CELLS IN IT
model.add(LSTM(128, input_shape=x_train.shape, activation='tanh', return_sequences=True))
model.add(Dropout(0.2))  # 20% DROPOUT ADDED FOR REGULARIZATION
model.add(BatchNormalization())

model.add(LSTM(128, input_shape=x_train.shape, activation='tanh', return_sequences=True))   # ADD ANOTHER LAYER
model.add(Dropout(0.1))
model.add(BatchNormalization())

model.add(LSTM(128, input_shape=x_train.shape, activation='tanh', return_sequences=True))
model.add(Dropout(0.2))
model.add(BatchNormalization())

model.add(Dense(32, activation='relu'))  # ADD A DENSE LAYER
model.add(Dropout(0.2))

model.add(Dense(2, activation='softmax'))  # FINAL CLASSIFICATION LAYER WITH 2 CLASSES AND SOFTMAX
# ---------------------------------------------------------------------------------------------------

# OPTIMIZER SETTINGS
opt = tf.keras.optimizers.Adam(learning_rate=LEARNING_RATE, decay=DECAY)

# MODEL COMPILE
model.compile(loss='sparse_categorical_crossentropy', optimizer=opt, metrics=['accuracy'])

# CALLBACKS
tensorboard = TensorBoard(log_dir=f"logs/NAME")
filepath = "RNN_Final-epoch:02d-val_acc:.3f"
checkpoint = ModelCheckpoint("models/.model".format(filepath, monitor='val_acc', verbose=1,
                                                      save_best_only=True, mode='max'))  # save only the best ones

# RUN THE MODEL
history = model.fit(x_train, y_train, epochs=EPOCHS, batch_size=BATCH_SIZE,
                    validation_data=(x_val, y_val), callbacks=[tensorboard, checkpoint])

【问题讨论】:

【参考方案1】:

虽然它会给你一个很大的价值,但最好的办法是压平具有较大尺寸的那个。

一个 tensorflow.keras.layers.Flatten() 基本上会让你的输出形状值相乘,即输入:(None, 5, 5) -> Flatten() -> (None, 25)

对于你的例子,这会给你:

(无,33714,12)->(无,404568)。

我不完全确定当您更改形状大小时这是否会起作用,但这就是我克服形状不兼容问题的方法:预期:(无,x),得到:(无,y,x)。

【讨论】:

以上是关于ValueError:“顺序”层的输入 0 与该层不兼容:预期形状 =(无,33714,12),找到形状 =(无,12)的主要内容,如果未能解决你的问题,请参考以下文章

在构建和训练 3D Keras U-NET 时遇到 ValueError

caffe源码 全连接层

ValueError:lstm_45 层的输入 0 与层不兼容:预期 ndim=3,发现 ndim=4。收到的完整形状:(无,无,无,128)

ValueError:conv2d 层的输入 0 与层不兼容::预期 min_ndim=4,发现 ndim=3。收到的完整形状:(256、256、256)

ValueError:层顺序的输入 0 与层不兼容:输入形状的预期轴 -1 具有值 3,但接收到的输入具有形状

ValueError:层顺序的输入 0 与层不兼容::预期 min_ndim=4,发现 ndim=3。收到的完整形状:[8, 28, 28]