как изменить текстовые данные, чтобы они подходили для модели LSTM в керасе - PullRequest
6 голосов
/ 24 июня 2019

Update1:

Код, на который я ссылаюсь, - это именно тот код в книге, который вы можете найти здесь .

Единственное, что я не хочу иметь embed_size в части декодера. Вот почему я думаю, что мне вообще не нужен слой для встраивания, потому что если я добавлю слой для встраивания, мне нужно иметь embed_size в части декодера (пожалуйста, исправьте меня, если я ошибаюсь).

В целом, я пытаюсь принять тот же код без использования слоя встраивания, потому что мне нужно иметь vocab_size в части декодера.

Я думаю, что предложение, приведенное в комментарии, может быть правильным (using one_hot_encoding), как только я столкнулся с этой ошибкой:

Когда я это сделал one_hot_encoding:

tf.keras.backend.one_hot(indices=sent_wids, classes=vocab_size)

Я получил эту ошибку:

in check_num_samples you should specify the + steps_name + argument ValueError: If your data is in the form of symbolic tensors, you should specify the steps_per_epoch argument (instead of the batch_size argument, because symbolic tensors are expected to produce batches of input data)

То, как я подготовил данные, выглядит следующим образом:

форма sent_lens равна (87716, 200), и я хочу изменить ее так, чтобы я мог передать ее в LSTM. здесь 200 обозначает sequence_lenght, а 87716 - количество образцов, которые у меня есть.

ниже код для LSTM Autoencoder:

inputs = Input(shape=(SEQUENCE_LEN,VOCAB_SIZE), name="input")
encoded = Bidirectional(LSTM(LATENT_SIZE), merge_mode="sum", name="encoder_lstm")(inputs)
decoded = RepeatVector(SEQUENCE_LEN, name="repeater")(encoded)
decoded = LSTM(VOCAB_SIZE, return_sequences=True)(decoded)
autoencoder = Model(inputs, decoded)
autoencoder.compile(optimizer="sgd", loss='mse')
autoencoder.summary()
history = autoencoder.fit(Xtrain, Xtrain,batch_size=BATCH_SIZE, 
epochs=NUM_EPOCHS)

Нужно ли мне что-то делать дополнительно, если нет, почему я не могу получить это работает?

Пожалуйста, дайте мне знать, какая часть не ясна, я объясню.

Спасибо за вашу помощь:)

Ответы [ 2 ]

1 голос
/ 01 июля 2019

Вам необходимо изменить данные следующим образом:

  • Образцы .Одна последовательность - один образец.Партия состоит из одного или нескольких образцов.
  • Шаги времени .Один временной шаг - это одна точка наблюдения в образце.
  • Особенности .Одна особенность - это одно наблюдение за шагом времени.

(samples, time_steps, features)

Тогда ваша модель должна выглядеть следующим образом (упрощенная версия):

visible = Input(shape=(time_steps, features))
encoder = LSTM(100, activation='relu')(visible)
# define reconstruct decoder
decoder = RepeatVector(time_steps)(encoder)
decoder = LSTM(100, activation='relu', return_sequences=True)(decoder)
decoder = TimeDistributed(Dense(features))(decoder)
model = Model(visible, decoder)

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

Однако , при этом вам может потребоваться только расширение размеров массива.

Проверка это , а также это может прояснить ситуацию.

Надеюсь, что вышесказанное полезно.

0 голосов
/ 04 июля 2019

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

когда я выполнял кодирование one_hot с использованием tf.keras.backend, оно выдает ошибку, которую я обновил в своем вопросе.

Затем я попытался to_categorical(sent_wids, num_classes=VOCAB_SIZE), и это исправило (однако столкнулось с memory error: D, что является другой историей) !!!

Я должен также упомянуть, что я попытался sparse_categorical_crossentropy вместо one_hot_encoding, хотя это не сработало!

Спасибо за вашу помощь:)

...