довольно ново для LSTM, но я уже искал решение и не смог найти ничего удовлетворительного или даже достаточно похожего.
Итак, вот моя проблема: Я имею дело с классификацией сна и имеют аннотированные записи около 6 тыс. пациентов. Чтобы обучить свой двунаправленный LSTM, я выбираю одного пациента и подгоняю модель к этим данным вместо того, чтобы помещать все данные от всех пациентов в одну большую матрицу, потому что я хочу предотвратить смешивание образцов пациентов, когда Керас тренируется с мини-партиями. Длина последовательности или samples_size
на пациента не совпадают. Затем я l oop для всех пациентов и делаю дополнительно l oop для количества эпох, для которых я считал, что нужно обучать модель (как описано в Руководствах разработчика ). Итак, поскольку LSTM (если не с сохранением состояния) сбрасывают свою ячейку и скрытое состояние после каждого пакета, а значение по умолчанию batch_size
для tf.keras.Sequential.fit()
равно 32, я хотел, чтобы он соответствовал sample_size
пациенту, которого я показываю в сети. Если я это сделаю, то через некоторое время получаю предупреждение и ошибки тренировочного процесса. Ошибка:
ПРЕДУПРЕЖДЕНИЕ: тензорный поток: 6 из последних 11 вызовов .distributed_function по адресу 0x0000023F9D517708> сработало восстановление функции tf. Трассировка стоит дорого, и чрезмерное количество трассировок, вероятно, связано с передачей python объектов вместо тензоров. Кроме того, tf.function имеет параметр экспериментальной_relax_shapes = True, который смягчает формы аргументов, чтобы избежать ненужного повторения. Пожалуйста, обратитесь к https://www.tensorflow.org/beta/tutorials/eager/tf_function#python_or_tensor_args и https://www.tensorflow.org/api_docs/python/tf/function для более подробной информации.
Итак, я посмотрел, какой у меня самый длинный sample_size
, и установил batch_size
соответственно.
tl; dr: Что делает Keras во всех случаях, когда моя переменная sample_size
не соответствует моей batch_size=max(len(sample_size))
?
- Это просто показывает доступные образцы в сети?
- Если да: Почему появляется упомянутое выше предупреждение, когда установка
batch_size=sample_size
приводит к неудачному обучению?
- Или это показывает доступные образцы в сети а остальное заполнить нулями, чтобы соответствовать заданному
batch_size
? - Если да: Почему существует необходимость в маскировке, например, при использовании режима с отслеживанием состояния?
edit: Итак, я попробовал несколько дополнительных обходных путей и построил свой собственный генератор данных, который проверяет данные одного пациента как одну партию. Затем я установил steps_per_epoch=len(train_patients)
, чтобы включить всех пациентов в одну эпоху. Никаких предупреждений о ретрассировании, которых я тоже не понимаю. Кажется, это решает мою проблему отображения одного пациента в партии без смешивания данных пациентов и наличия переменной sample_size
, но я действительно не понимаю различий между всеми этими возможностями и их различными предупреждениями.