Набор проверки для обучения LSTM переменной длины - PullRequest
0 голосов
/ 27 января 2020

Я знаю, что при вводе переменной длины последовательности для LSTM есть несколько вариантов: (1) заполнение, (2) ввод одинаковых значений длины в партии и (3) подача наблюдений по одному один (размер партии = 1). Вопрос, который я собираюсь задать, относится к вариантам 2 и 3. Меня не интересует заполнение, и я уже знаю, как это сделать.

В этом посте создается генератор для создания партия с одинаковым количеством наблюдений одинаковой длины последовательностей. Это дает и X_train и y_train как кортеж. Давайте для этого минимального примера предположим, что мы делаем бинарную классификацию. Это называется маркировкой последовательности.

#Load libraries
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers, metrics
import numpy as np
from tensorflow.keras.utils import to_categorical

def train_generator():
    while True:
        sequence_length = np.random.randint(10, 100)
        x_train = np.random.random((1000, sequence_length, 5))
        # y_train will depend on past 5 timesteps of x
        y_train = x_train[:, :, 0]
        for i in range(1, 5):
            y_train[:, i:] += x_train[:, :-i, i]
        y_train = to_categorical(y_train > 2.5)
        yield (x_train, y_train)

training_iterator = train_generator()

#First Batch
first_batch = next(training_iterator)
print('The shape of X_train in the first batch:{}'.format(first_batch[0].shape))
#The shape of X_train in the first batch:(100, 26, 5)
print('The shape of y_train in the first batch:{}'.format(first_batch[1].shape))
#The shape of y_train in the first batch:(100, 26, 2)

#Second Batch
second_batch = next(training_iterator)
print('The shape of X_train in the second batch:{}'.format(second_batch[0].shape))
#The shape of X_train in the second batch:(100, 94, 5)
print('The shape of X_train in the second batch:{}'.format(second_batch[1].shape))
#The shape of X_train in the second batch:(100, 94, 2)

Для моделирующей детали я использую Tensorflow 2.0, и у меня есть 2 слоя LSTM с одним плотным выходным слоем с оболочкой TimeDistributed. Поскольку у меня разная длина последовательностей, для input я должен выбрать None для формы временных шагов ввода.

inputs = keras.Input(shape=(None,5), name='inputs')
#<tf.Tensor 'digits:0' shape=(None, None, 5) dtype=float32>

whole_sequence_output= keras.layers.LSTM(32, return_sequences=True, return_state=False)(inputs)
#<tf.Tensor 'lstm_1/Identity:0' shape=(None, None, 32) dtype=float32>

whole_sequence_output2 = keras.layers.LSTM(8, return_sequences=True, return_state=False)(whole_sequence_output)
#whole_sequence_output2
#<tf.Tensor 'lstm_4/Identity:0' shape=(None, None, 16) dtype=float32>

outputs = layers.TimeDistributed(layers.Dense(2, activation='sigmoid', name='predictions'))(whole_sequence_output2)
#<tf.Tensor 'time_distributed_1/Identity:0' shape=(None, None, 2) dtype=float32>

model = keras.Model(inputs=inputs, outputs=outputs)

model.summary()

enter image description here

Я использую оптимизатор Adam с функцией потери двоичной перекрестной энтропии.

model.compile(optimizer=keras.optimizers.Adam(),  # Optimizer
              # Loss function to minimize
              loss=keras.losses.BinaryCrossentropy(),
              # List of metrics to monitor
              metrics=['accuracy'])

В Tensorflow 2.0 model.fit() функция поддерживает генераторы. Для простоты я запускаю модель в течение 10 эпох и каждый раз делаю 32 прохода вперед / назад для обновления параметров модели

history = model.fit(train_generator(), steps_per_epoch=32, epochs=10, verbose=1)

Кажется, моя модель может тренироваться.

enter image description here

Хорошо, мой вопрос, что я не могу сделать проверку. Как я могу обработать этот код для оценки обученной модели на валидацию в КАЖДУЮ эпоху? Я попробовал пару подходов, но безрезультатно.

Я не мог найти много онлайн об этом процессе.

Должен ли мой проверочный набор быть одного размера с тренировочным набором в каждую эпоху? Есть ли какой-нибудь фрагмент кода или пример?

...