如何正确使用 Keras LSTM batch_input_size

How to use Keras LSTM batch_input_size properly

我正在使用 Keras 框架构建堆叠 LSTM 模型,如下所示:

model.add(layers.LSTM(units=32,
                      batch_input_shape=(1, 100, 64),
                      stateful=True,
                      return_sequences=True))
model.add(layers.LSTM(units=32, stateful=True, return_sequences=True))
model.add(layers.LSTM(units=32, stateful=True, return_sequences=False))
model.add(layers.Dense(1))
model.compile(loss='mean_squared_error', optimizer='adam')
model.fit(train_dataset,
          train_labels,
          epochs=1,
          validation_split = 0.2,
          verbose=1,
          batch_size=1,
          shuffle=False)

知道 mode.fitmodel.predictmodel.evaluate 的默认值 batch_size 是 32,模型迫使我将此默认值 batch_size 更改为在 batch_input_shape (batch_size, time_steps, input_dims).

中使用相同的 batch_size

我的问题是:

  1. batch_size传进去有什么区别 batch_input_shape 还是变成model.fit
  2. 我可以用 batch_size 来训练吗,比方说 10,然后评估单个批次(而不是 10 批次)如果我将 batch_size 传递到 LSTM层通过batch_input_shape?

当您创建 Sequential() 模型时,它被定义为支持任何批量大小。特别是,在 TensorFlow 1.* 中,输入是一个占位符,其第一个维度是 None

import tensorflow as tf

model = tf.keras.models.Sequential()
model.add(tf.keras.layers.Dense(units=2, input_shape=(2, )))
print(model.inputs[0].get_shape().as_list()) # [None, 2] <-- supports any batch size
print(model.inputs[0].op.type == 'Placeholder') # True

如果您使用 tf.keras.InputLayer(),您可以像这样定义一个固定的批量大小:

import tensorflow as tf

model = tf.keras.models.Sequential()
model.add(tf.keras.layers.InputLayer((2,), batch_size=50)) # <-- same as using batch_input_shape
model.add(tf.keras.layers.Dense(units=2, input_shape=(2, )))
print(model.inputs[0].get_shape().as_list()) # [50, 2] <-- supports only batch_size==50
print(model.inputs[0].op.type == 'Placeholder') # True

model.fit() 方法的批量大小用于将数据拆分为多个批次。例如,如果您使用 InputLayer() 并定义固定的批量大小,同时向 model.fit() 方法提供不同的批量大小值,您将得到 ValueError:

import tensorflow as tf
import numpy as np

model = tf.keras.models.Sequential()
model.add(tf.keras.layers.InputLayer((2,), batch_size=2)) # <--batch_size==2
model.add(tf.keras.layers.Dense(units=2, input_shape=(2, )))
model.compile(optimizer=tf.keras.optimizers.Adam(),
              loss='categorical_crossentropy')
x_train = np.random.normal(size=(10, 2))
y_train = np.array([[0, 1] for _ in range(10)])

model.fit(x_train, y_train, batch_size=3) # <--batch_size==3 

这将提高: ValueError: Thebatch_sizeargument value 3 is incompatible with the specified batch size of your Input Layer: 2

总而言之:如果您定义批量大小 None,您可以传递任意数量的样本进行训练或评估,甚至可以一次传递所有样本而不拆分成批次(如果数据太大,您将获得OutOfMemoryError)。如果您定义固定批量大小,则必须使用相同的固定批量大小进行训练和评估。

当lstm层为stateful模式时,batch size必须给出,不能None。 这是因为 lstm 是有状态的,需要知道如何将隐藏状态从 t-1 时间步批次连接到 t 时间步长批次