【发布时间】:2019-07-08 15:27:03
【问题描述】:
所以我一直在研究LSTM Autoencoder model。我还创建了这个模型的各种版本。
1. 使用已经训练好的词嵌入创建模型: 在这种情况下,我使用已经训练好的 Glove 向量的权重,作为特征(文本数据)的权重。 这是结构:
inputs = Input(shape=(SEQUENCE_LEN, EMBED_SIZE), name="input")
encoded = Bidirectional(LSTM(LATENT_SIZE), merge_mode="sum", name="encoder_lstm")(inputs)
encoded =Lambda(rev_entropy)(encoded)
decoded = RepeatVector(SEQUENCE_LEN, name="repeater")(encoded)
decoded = Bidirectional(LSTM(EMBED_SIZE, return_sequences=True), merge_mode="sum", name="decoder_lstm")(decoded)
autoencoder = Model(inputs, decoded)
autoencoder.compile(optimizer="sgd", loss='mse')
autoencoder.summary()
checkpoint = ModelCheckpoint(filepath='checkpoint/{epoch}.hdf5')
history = autoencoder.fit_generator(train_gen, steps_per_epoch=num_train_steps, epochs=NUM_EPOCHS, validation_data=test_gen, validation_steps=num_test_steps, callbacks=[checkpoint])
- 在第二种情况下,我在模型本身中实现了词嵌入层:
这是结构:
inputs = Input(shape=(SEQUENCE_LEN, ), name="input")
embedding = Embedding(input_dim=VOCAB_SIZE, output_dim=EMBED_SIZE, input_length=SEQUENCE_LEN,trainable=False)(inputs)
encoded = Bidirectional(LSTM(LATENT_SIZE), merge_mode="sum", name="encoder_lstm")(embedding)
decoded = RepeatVector(SEQUENCE_LEN, name="repeater")(encoded)
decoded = LSTM(EMBED_SIZE, return_sequences=True)(decoded)
autoencoder = Model(inputs, decoded)
autoencoder.compile(optimizer="sgd", loss='categorical_crossentropy')
autoencoder.summary()
checkpoint = ModelCheckpoint(filepath=os.path.join('Data/', "simple_ae_to_compare"))
history = autoencoder.fit_generator(train_gen, steps_per_epoch=num_train_steps, epochs=NUM_EPOCHS, validation_steps=num_test_steps)
-
在第三种情况下,我没有使用任何嵌入技术,而是使用
one hot encoding来表示功能。这是模型的结构:`inputs = Input(shape=(SEQUENCE_LEN, VOCAB_SIZE), name="input") encoded = Bidirectional(LSTM(LATENT_SIZE, kernel_initializer="glorot_normal",), merge_mode="sum", name="encoder_lstm")(inputs) encoded = Lambda(score_cooccurance, name='Modified_layer')(encoded) decoded = RepeatVector(SEQUENCE_LEN, name="repeater")(encoded) decoded = LSTM(VOCAB_SIZE, return_sequences=True)(decoded) autoencoder = Model(inputs, decoded) sgd = optimizers.SGD(lr=0.1, decay=1e-6, momentum=0.9, nesterov=True) autoencoder.compile(optimizer=sgd, loss='categorical_crossentropy') autoencoder.summary() checkpoint = ModelCheckpoint(filepath='checkpoint/50/{epoch}.hdf5') history = autoencoder.fit_generator(train_gen, steps_per_epoch=num_train_steps, epochs=NUM_EPOCHS, callbacks=[checkpoint])`如您所见,在第一个和第二个模型中,
Embed_size中的decoding是该层中的神经元数量。它导致编码器层的输出形状变为[Latent_size, Embed_size]。在第三种模型中,编码器的输出形状为
[Latent_size, Vocab_size]。
现在我的问题
是否可以以我嵌入的方式更改模型的结构以将我的单词表示到模型中,同时在解码器层中使用vocab_size?
我需要将编码器层的output_shape 设为[Latent_size, Vocab_size],同时出于显而易见的原因,我不想将我的特征表示为one_hot encoding。
如果您能与我分享您的想法,我将不胜感激。
一个想法可能是添加更多层,考虑到我不希望在最后一层有Embed_size。
【问题讨论】:
标签: tensorflow keras lstm autoencoder seq2seq