Как я могу использовать разные размеры обучающих данных и тестовых данных и разные размеры batch_s во время подбора и прогнозирования данных с использованием Keras LSTM? - PullRequest
0 голосов
/ 07 января 2019

Мой исходный код выглядит так, как показано ниже. Он работает только тогда, когда batch_sizes имеют одинаковый размер, в данном случае 300 и одинаковую форму, в данном случае (300, 50, 74). У кого-нибудь есть идеи, как я могу использовать разные размеры обучающих данных и тестовых данных и разные размеры batch_s во время подбора и прогнозирования данных с использованием Keras LSTM?

shape = input_one_hot_encoded.shape
print('input_one_hot_encoded: ' + str(shape))

shape = output_one_hot_encoded.shape
print('output_one_hot_encoded: ' + str(shape))

shape = test_input_one_hot_encoded.shape
print('test_input_one_hot_encoded: ' + str(shape))


model = Sequential()
model.add(LSTM(len(dict), return_sequences=True, stateful=True,
               batch_input_shape=shape))
model.add(LSTM(len(dict), return_sequences=True, stateful=True))
model.add(LSTM(len(dict), return_sequences=True, stateful=True))
model.add(Dense(len(dict), activation='softmax'))

model.compile(loss='categorical_crossentropy',
              optimizer='rmsprop',
              metrics=['accuracy'])

print(model.summary())

model.fit(input_one_hot_encoded, output_one_hot_encoded, epochs=20, batch_size=300)

data = model.predict(test_input_one_hot_encoded, batch_size=300)

Возвращает:

input_one_hot_encoded: (300, 50, 74)
output_one_hot_encoded: (300, 50, 74)
test_input_one_hot_encoded: (300, 50, 74)
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
lstm_1 (LSTM)                (300, 50, 74)             44104     
_________________________________________________________________
lstm_2 (LSTM)                (300, 50, 74)             44104     
_________________________________________________________________
lstm_3 (LSTM)                (300, 50, 74)             44104     
_________________________________________________________________
dense_1 (Dense)              (300, 50, 74)             5550      
=================================================================
Total params: 137,862
Trainable params: 137,862
Non-trainable params: 0

Ответы [ 2 ]

0 голосов
/ 08 января 2019

Причина, по которой вы не можете использовать пакеты разных размеров во время обучения и выполнения теста, заключается в том, что ваша модель имеет LSTM с состоянием, т. Е. Значение параметра с состоянием установлено на True

Теперь есть два способа решить эту проблему:

  1. Используйте LSTM с контролем состояния во время тренировки. В конце процесса обучения сохраните веса вашей модели локально в файл и определите новую архитектуру модели, такую ​​же, как существующая, с той лишь разницей, что lstms не являются statefule:

    model.save_weights("your_weights.h5")
    

    например. lstm слои

    model.add(LSTM(len(dict), return_sequences=True, stateful=False, batch_input_shape=shape))
    
  2. Просто сделайте свои слои lstm не сохраняющими состояние, т.е. установите значение аргумента с сохранением состояния в False, как указано выше.

Для более подробного описания, пожалуйста, перейдите по этой ссылке https://machinelearningmastery.com/use-different-batch-sizes-training-predicting-python-keras/

0 голосов
/ 07 января 2019

Судя по документам относительно формы ввода ячеек LSTM:

3D-тензор с формой (batch_size, timesteps, input_dim).

Это означает, что вам понадобятся временные шаги с постоянным размером для каждой партии, следовательно, для обучения и тестирования будет невозможно иметь разные размеры пакетов.

Однако вы можете изменить длину входной последовательности, например, с помощью pad_sequences (см. https://keras.io/preprocessing/sequence/#pad_sequence для получения более подробной информации)

Пример:

from keras.preprocessing.sequence import pad_sequences
# define sequences
sequences = [
    [1, 2, 3, 4],
       [1, 2, 3],
             [1]
    ]
# pad sequence
padded = pad_sequences(sequences, maxlen=5)
print(padded)
[[0 1 2 3 4]
[0 0 1 2 3]
[0 0 0 0 1]]

РЕДАКТИРОВАТЬ после комментариев:

вам нужно настроить размеры тестовых данных. Например, см. Документы по последовательным моделям (https://keras.io/getting-started/sequential-model-guide/). Здесь x_train и y_train определены следующим образом:

data_dim = 16
timesteps = 8
num_classes = 10
batch_size = 32

# Generate dummy training data
x_train = np.random.random((batch_size * 10, timesteps, data_dim))
y_train = np.random.random((batch_size * 10, num_classes))

обратите внимание, что фигуры

x_train.shape
>> (320, 8, 16)
y_train.shape
>> (320, 10)

Ваши фигуры должны читать:

input_one_hot_encoded.shape
>> (300, timesteps, data_dim)
output_one_hot_encoded.shape
>>(300, num_classes)

соответственно

...