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

Posted

技术标签:

【中文标题】ValueError:lstm_45 层的输入 0 与层不兼容:预期 ndim=3,发现 ndim=4。收到的完整形状:(无,无,无,128)【英文标题】:ValueError:Input 0 of layer lstm_45 is incompatible with the layer: expected ndim=3, found ndim=4. Full shape received: (None, None, None, 128) 【发布时间】:2021-10-18 16:48:16 【问题描述】:

我是深度学习的新手,在理解嵌入和将 4 个特征向量(所有浮点数)的序列传递给 LSTM 模型时遇到问题。我的模型如下所示:

f_data = np.array([[[259992.7, 11745.7, 0.0, 5500.0], [259068.5, 11745.7, 0.0, 5500.0]], [[250284.9, 11713.07, 1.0, 5730.0], [259043.3, 11728.2, 0.0, 5615.0], [238096.3, 11680.1, 0.0, 5730.0]]], dtype=object) 
y_data = np.array([0,1])
train_x = tf.ragged.constant(f_data)

keras_model = tf.keras.Sequential([
tf.keras.layers.Input(shape=[None], dtype=tf.float64, ragged=True),
tf.keras.layers.Embedding(260000, 12),
tf.keras.layers.LSTM(32, use_bias=False, input_shape=(None, 4)),
tf.keras.layers.Dense(32),
tf.keras.layers.Activation(tf.nn.relu),
tf.keras.layers.Dense(1),
tf.keras.layers.Dropout(0.2)])
keras_model.compile(optimizer='rmsprop', 
loss='binary_crossentropy', metrics=['acc'])

keras_model.fit(train_x, y_data, epochs=100, batch_size=32)

我在传递不同长度的序列时也遇到了麻烦,但参差不齐的输入解决了它。这是我得到的错误: ValueError: 层 lstm_45 的输入 0 与层不兼容:预期 ndim=3,发现 ndim=4。收到的完整形状:(无,无,无,128)

【问题讨论】:

我认为错误信息很清楚。您的输入与预期的输入形状不匹配。要么更正你的输入形状,要么在keras_model中更改输入层的形状参数 我应该在哪里更改输入的形状? tf.keras.layers.Input(shape=[None, 4], dtype=np.float64, ragged=True) 产生 ValueError: Input 0 of layer lstm_65 is incompatible with the layer: expected ndim=3, found ndim=4. Full shape received: (None, None, 4, 128) 错误 我无法重现您的问题。在我的机器上编译得很好。介意告诉我们你是否使用 conda,pip? tensorflow/keras 的版本? 确定我使用的是 2.6.0 tensorflow,2.6.0 keras 所以基本上keras_model = tf.keras.Sequential([ tf.keras.layers.Input(shape=[None, 4], dtype=np.float64, ragged=True), tf.keras.layers.Embedding(10001,128), tf.keras.layers.LSTM(32, use_bias=False, input_shape=(None, 4)), tf.keras.layers.Dense(32), tf.keras.layers.Activation(tf.nn.relu), tf.keras.layers.Dense(1), tf.keras.layers.Dropout(0.2) ]) 这对你有用吗? 仅供参考 - 顺序模型不需要输入层,您可以删除它 【参考方案1】:

tf.keras.layers.LSTM 层需要输入形状为 [batch, timesteps, feature] 的形状 3D 张量。在这种情况下,您将提供 4D 阵列。 改变输入形状,

通过移除嵌入层的工作,

import tensorflow as tf
import numpy as np
f_data = np.array([[[259992.7, 11745.7, 0.0, 5500.0], [259068.5, 11745.7, 0.0, 5500.0]], [[250284.9, 11713.07, 1.0, 5730.0], [259043.3, 11728.2, 0.0, 5615.0], [238096.3, 11680.1, 0.0, 5730.0]]], dtype=object) 
y_data = np.array([0,1])
train_x = tf.ragged.constant(f_data)
keras_model = tf.keras.Sequential([

tf.keras.layers.LSTM(32,use_bias=False, input_shape = (None,4)),
tf.keras.layers.Dense(32),
tf.keras.layers.Activation(tf.nn.relu),
tf.keras.layers.Dense(1)])
keras_model.compile(optimizer='rmsprop', 
loss='binary_crossentropy', metrics=['acc'])

keras_model.fit(train_x, y_data, epochs=100, batch_size=32)
keras_model.summary()

【讨论】:

以上是关于ValueError:lstm_45 层的输入 0 与层不兼容:预期 ndim=3,发现 ndim=4。收到的完整形状:(无,无,无,128)的主要内容,如果未能解决你的问题,请参考以下文章

ValueError:输入 0 与层 lstm_13 不兼容:预期 ndim=3,发现 ndim=4

ValueError: 层 lstm_12 的输入 0 与层不兼容:预期 ndim=3,发现 ndim=4

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

ValueError:检查输入时出错:预期 lstm_1_input 具有 3 个维度,但得到的数组具有形状 (393613, 50)

ValueError:检查输入时出错:预期 lstm_16_input 有 3 个维度,但得到的数组形状为 (836, 400, 3, 1)

ValueError:尝试共享变量 rnn/multi_rnn_cell/cell_0/basic_lstm_cell/kernel