【问题标题】:I am learning tensorflow2 in python and i am wondering what sets the ndim?我正在用 python 学习 tensorflow2,我想知道 ndim 是什么设置的?
【发布时间】:2021-07-03 03:05:39
【问题描述】:
def build_model(layers):
    model = Sequential()

    # By setting return_sequences to True we are able to stack another LSTM layer
    model.add(LSTM(layers[0], input_shape=(1, 2), return_sequences=True))

    model.add(LSTM(layers[0], input_shape=(1, 2),
        return_sequences=False))
    model.add(Dropout(0.2))

    model.add(Activation("linear"))

    start = time.time()
    model.compile(loss="mse", optimizer="rmsprop", metrics=['accuracy'])
    print("Compile Time : ", time.time() - start)
    return model

然后当我尝试在构建后运行 model.fit 时。那是抛出错误的时候。这是正在构建的模型和 model.fit 函数的代码的 sn-p。

window = 20
print("X_train", X_train.shape)
print("y_train", y_train.shape)
print("X_test", X_test.shape)
print("y_test", y_test.shape)

model = build_model([1374, window, 100, 1])

model.fit(X_train,
    y_train,
    batch_size=3,
    epochs=5,
    validation_split=0.1,
    verbose=0).

这是错误消息。 ValueError:“顺序”层的输入 0 与层不兼容:预期 ndim=3,发现 ndim=2。什么是ndim?它的值对模型有何调整?我如何理解我设置的 ndim。

ValueError: Input 0 of layer sequential is incompatible with the layer: expected ndim=3, found ndim=2. Full shape received: (None, 2).

这是打印出来的形状。

X_train (1032, 2)
y_train (1032, 2)
X_test (344, 2)
y_test (344, 2)

【问题讨论】:

  • LSTM layer is a recurrent layer, hence it expects a 3-dimensional input (batch_size, timesteps, input_dim)。在问题中包含 X_train 形状。

标签: python tensorflow keras deep-learning python-3.6


【解决方案1】:

正如@yudhiesh 所建议的,LSTM 期望输入形状为 3D 张量,形状为 [batch, timesteps, feature] 我可以重现你的问题

import tensorflow as tf
inputs = tf.random.normal([32, 8])
lstm = tf.keras.layers.LSTM(4)
output = lstm(inputs)
print(output.shape)

输出

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-2-160c5e8d5d9a> in <module>()
      2 inputs = tf.random.normal([32, 8])
      3 lstm = tf.keras.layers.LSTM(4)
----> 4 output = lstm(inputs)
      5 print(output.shape)

2 frames
/usr/local/lib/python3.7/dist-packages/tensorflow/python/keras/engine/input_spec.py in assert_input_compatibility(input_spec, inputs, layer_name)
    217                          'expected ndim=' + str(spec.ndim) + ', found ndim=' +
    218                          str(ndim) + '. Full shape received: ' +
--> 219                          str(tuple(shape)))
    220     if spec.max_ndim is not None:
    221       ndim = x.shape.rank

ValueError: Input 0 of layer lstm_1 is incompatible with the layer: expected ndim=3, found ndim=2. Full shape received: (32, 8)

工作示例代码

inputs = tf.random.normal([32, 10, 8])
lstm = tf.keras.layers.LSTM(4)
output = lstm(inputs)
print(output.shape)

输出:

(32, 4)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-14
    • 2020-11-12
    • 2021-08-24
    • 2012-05-20
    • 2023-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多