我正在尝试keras.layers.LSTM。 以下代码有效。
#!/usr/bin/python3
import tensorflow as tf
import numpy as np
from tensorflow import keras
data = np.array([1, 2, 3]).reshape((1, 3, 1))
x = keras.layers.Input(shape=(3, 1))
y = keras.layers.LSTM(10)(x)
model = keras.Model(inputs=x, outputs=y)
print (model.predict(data))
如上所示,输入数据形状为(1, 3, 1)
,而输入层中的实际输入形状为(3, 1)
。我对此维度的不一致感到有些困惑。
如果我在“输入”层中使用以下形状,则将不起作用:
x = keras.layers.Input(shape=(1, 3, 1))
错误消息如下:
ValueError: Input 0 of layer lstm is incompatible with the layer: expected ndim=3, found ndim=4. Full shape received: [None, 1, 3, 1]
输入的等级似乎必须为3,但是为什么我们要在输入层中使用等级2的形状?
答案 0 :(得分:1)
查看tf.keras.Input的文档。语法为-
tf.keras.Input(
shape=None,
batch_size=None,
name=None,
dtype=None,
sparse=False,
tensor=None,
**kwargs
)
形状:定义单个样品的形状,并具有可变的批量大小。
注意,它期望第一个值为batch_size,否则将batch_size
作为参数明确传递
答案 1 :(得分:1)
Keras处理“样本”的“批次”。由于大多数模型使用的可变批量大小仅在拟合时定义,因此为方便起见,您不必关心批量尺寸,而只关心样本尺寸。
也就是说,当您使用shape = (3,1)
时,这与定义batch_shape = (None, 3, 1)
或batch_input_shape = (None, 3, 1)
相同。
这三个选项表示:
None
(3, 1)
的样本。 了解这一区别非常重要,尤其是当您要创建自定义图层,损失或指标时。实际的张量都具有批处理尺寸,使用张量进行操作时应考虑到这一点。