如何正确使用 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.fit
、model.predict
和 model.evaluate
的默认值 batch_size
是 32,模型迫使我将此默认值 batch_size
更改为在 batch_input_shape (batch_size, time_steps, input_dims)
.
中使用相同的 batch_size
值
我的问题是:
- 把
batch_size
传进去有什么区别
batch_input_shape
还是变成model.fit
?
- 我可以用
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: The
batch_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 时间步长批次
我正在使用 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.fit
、model.predict
和 model.evaluate
的默认值 batch_size
是 32,模型迫使我将此默认值 batch_size
更改为在 batch_input_shape (batch_size, time_steps, input_dims)
.
batch_size
值
我的问题是:
- 把
batch_size
传进去有什么区别batch_input_shape
还是变成model.fit
? - 我可以用
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: The
batch_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 时间步长批次