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