我正在研究一种自动编码器,用于编码/解码文章的德语标题(约2k个样本)。我使用字节对编码作为字符编码和单词编码之间的折衷。这是我正在为此使用的模型:
def create_model(characters, enc_size, latent_dim): #my parameter values: 32, 512, 32
inputs = tf.keras.layers.Input(shape=(characters, enc_size))
encoded = tf.keras.layers.CuDNNLSTM(128, return_sequences=True)(inputs)
encoded = tf.keras.layers.CuDNNLSTM(latent_dim)(encoded)
vector = tf.keras.layers.Input(shape=(latent_dim,))
decoded = tf.keras.layers.RepeatVector(characters)(vector)
decoded = tf.keras.layers.CuDNNLSTM(128, return_sequences=True)(decoded)
decoded = tf.keras.layers.CuDNNLSTM(enc_size, return_sequences=True)(decoded)
encoder = tf.keras.models.Model(inputs, encoded)
decoder = tf.keras.models.Model(vector, decoded)
auto = encoder(inputs)
auto = decoder(auto)
auto = tf.keras.models.Model(inputs, auto)
opt = tf.keras.optimizers.Adam(lr=1e-3)
auto.compile(optimizer=opt,
loss='categorical_crossentropy',
metrics=["accuracy"])
auto.summary()
return auto, encoder, decoder
我通过修改此keras article中的Sequence-to-Sequence示例来创建其结构。训练该模型没有问题。损耗减少,而精度提高。在整个过程中,两者都永远不会变成NaN。现在,当我尝试在预测(model.predict)中使用它时,输出是一个充满NaN的数组。奇怪的是,如果我使用“ binary_crossentropy”(尽管它并不真正适合此任务,因为字节对是一个热编码的)而不是“ categorical_crossentropy”,则不会发生,并且训练后的预测不是NaN。但是看来,即使经过200个纪元之后,实际输出也并没有真正提高。由于“ binary_accuracy”的不正确性,我不能说真的。
最好的预测例子之一
原文:“在wohnhaus中的luegde einbruch” |预测:“在einbruch的moren einbruch中,这样的ininbruchbrandeses”
我也可以肯定,数据集没有被NaNs或Infs污染。 有谁知道这种奇怪行为的解决方案/原因,还是知道带有编码器和解码器模型的文本自动编码器的工作示例。 预先感谢!