Как RNN работает на Керасе?

Я читал документацию по Keras на их сайте ([https://keras.io/getting-started/faq/]), и я заметил, что в их определении партии говорится, что они запускают каждый образец в партии параллельно. Почти для любого типа нейронной сети это было бы вполне приемлемо, но если я запускаю RNN с состоянием, установленным по умолчанию False, означает ли это, что скрытое состояние сбрасывается для каждого из моих образцов.

У меня сложилось впечатление, что каждый пакет запускался последовательно до того, как было выполнено обновление весов, и поэтому единственная потеря скрытых состояний была при изменении пакетов (поскольку у меня для состояния установлено значение False).

Я ошибаюсь в своем понимании?


person a1letterword    schedule 05.09.2017    source источник


Ответы (1)


Каждый образец представляет собой индивидуальную последовательность. И состояние (состояние, в котором последовательность находится на текущем временном шаге) имеет смысл только для каждой последовательности в отдельности.

Одна последовательность не может влиять на состояние другой последовательности.

Таким образом, для каждой последовательности в пакете существует параллельное состояние.

В слое с состоянием эти параллельные состояния будут сохранены (последовательности не закончились, пока вы не скажете об этом).

Вот еще один связанный с этим вопрос: Когда keras сбрасывает состояние LSTM?

person Daniel Möller    schedule 05.09.2017
comment
Если я не определяю временной шаг (окно), то как Keras будет обрабатывать этот пакет? - person a1letterword; 05.09.2017
comment
Я не уверен в том, что вы называете окном. Данные должны иметь форму (BatchSize, TimeSteps, FeaturesPerStep). Состояния обновляются по временным шагам. - person Daniel Möller; 05.09.2017
comment
model.add(LSTM(32, input_shape=(588425,26), return_sequences = True)) model.add(Dense(1)) model.compile(потеря='mean_squared_error', оптимизатор='adam', metrics=[' точность']) filepath=model_check-{epoch:02d}-{loss:.4f}.hdf5 контрольная точка = ModelCheckpoint(filepath, monitor='loss', verbose=1, save_best_only=True, mode='min') callbacks_list = [контрольная точка] model.fit(df_matrix, y_matrix, epochs=5, batch_size=100000, verbose=2) - person a1letterword; 05.09.2017
comment
хм, форматирование там не работает. но в основном я ставлю размер партии в самый конец для подгонки модели, а не раньше при вводе данных в саму модель. вроде бегает. Временные шаги - это весь поток данных, который я разрезаю на 100 000 интервалов. - person a1letterword; 05.09.2017
comment
Какова форма входных данных? Если это (1, 588425, 26), у вас есть только один образец. Размер партии в этом случае не повлияет, потому что он всегда будет равен 1. У вас есть 1 образец с 588425 временными шагами. - person Daniel Möller; 05.09.2017
comment
хорошо, я вижу, так что в этом случае он будет запускать весь поток последовательно, прежде чем сбрасывать состояние. - person a1letterword; 05.09.2017
comment
Да. Если вы хотите разделить временные интервалы, вам придется точно следовать примеру на странице, на которую вы ссылаетесь. batch_size = 1 в первом слое (ваш пакет имеет только одну последовательность, input_shape=(100000,26) (вы будете делить последовательности на части по 100k временных шагов). --- Похоже, вам придется обучать пакет за пакетом вручную, как в примере. И я не знаю, что произойдет в последней партии, где у вас нет ровно 100 тысяч шагов. - person Daniel Möller; 05.09.2017
comment
Если бы я хотел разбить его на последовательности по 200 временных шагов каждая, то размер входных данных для первого слоя был бы (500k/200, 200,26), а затем, если бы я установил размер пакета внизу равным 10 000, он запустил бы 10 000 пакетов в один раз перед обновлением весов? - person a1letterword; 05.09.2017
comment
Я не знаю. Я никогда не тестировал слои с состоянием. Но попробовать стоит, вроде получится. В худшем случае сделайте цикл, используя train_on_batch, как в примере по вашей ссылке. - person Daniel Möller; 06.09.2017