Я знаю, что при вводе переменной длины последовательности для 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()
Я использую оптимизатор 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)
Кажется, моя модель может тренироваться.
Хорошо, мой вопрос, что я не могу сделать проверку. Как я могу обработать этот код для оценки обученной модели на валидацию в КАЖДУЮ эпоху? Я попробовал пару подходов, но безрезультатно.
Я не мог найти много онлайн об этом процессе.
Должен ли мой проверочный набор быть одного размера с тренировочным набором в каждую эпоху? Есть ли какой-нибудь фрагмент кода или пример?