Как правильно использовать Keras LSTM batch_input_size - PullRequest
1 голос
/ 29 апреля 2019

Я использую Keras Framework для построения модели 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)

Зная, что по умолчанию batch_size для mode.fit, model.predict и model.evaluate32, модель вынуждает меня изменить значение по умолчанию batch_size на то же значение batch_size, которое используется в batch_input_shape (batch_size, time_steps, input_dims).

Мои вопросы:

  1. В чем разницамежду передачей batch_size в batch_input_shape или в model.fit?
  2. Могу ли я тренироваться с batch_size, скажем, 10, и оценивать по одной партии (а не по 10 партиям), если я передам batch_size в структуру слоя LSTM через batch_input_shape?

1 Ответ

1 голос
/ 29 апреля 2019

При создании модели 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_size argument value 3 is incompatible with the specified batch size of your Input Layer: 2

Подводя итог: если вы определите размер партии None, вы можете передать любое количество образцов для обучения или оценки, даже все образцы сразу, без разделения на партии (если данные слишком велики, вы получите OutOfMemoryError) , Если вы определите фиксированный размер партии, вам придется использовать тот же фиксированный размер партии для обучения и оценки.

...