我正在尝试在文本序列(网络文章的标题)上构建LSTM自动编码器,主要是通过复制https://blog.keras.io/building-autoencoders-in-keras.html中提到的基本示例。输入是80(最大标题长度)长度为40的单热矢量(数据集中的ascii字符数)。检查预测的输出与输入相同,因为它是自动编码器。我有大约60k序列用于测试模型,但最终,我想在320k的整个集合上运行它。
但问题是,LSTM网络根本没有正确学习。例如,捷克语句“Realvyhrálslavnéderbys Barcelonou”被复制为'### uuu ... uuu'(点表示你的情况一直持续到最后)。
在上面的教程中,它没有提到要使用的损失函数,激活函数或优化器,因此我搜索并发现,使用LSTM RMSProp 优化器效果最佳。我试过RELU,Tanh,Softmax等作为激活函数,尽管它们都没有做得更好。我最犹豫的是损失功能。我认为二进制或分类交叉熵可以很好地工作,但这可能是我错的地方。平均误差也没有产生任何好的结果。
input_sentence = Input(shape=(max_title_length, number_of_chars), dtype='int32')
tofloat = Lambda(function=lambda x: tf.to_float(x))(input_sentence)
encoder = LSTM(latent_dim, activation='tanh')(tofloat)
decoder = RepeatVector(max_title_len)(encoder)
decoder = LSTM(number_of_chars, return_sequences=True, activation='tanh')(decoder)
autoencoder = Model(input=input_sentence, output=decoder)
autoencoder.compile(loss='binary_crossentropy', optimizer='rmsprop', metrics=['accuracy'])
答案 0 :(得分:0)
我认为你的案例更好的损失函数是“汉明损失”,它计算两组样本之间的平均汉明损失或汉明距离。 因此,您可以计算矩阵中所有行之间的距离。
sckit-learn
和numpy
的示例:
>>> hamming_loss(np.array([[0, 1], [1, 1]]), np.zeros((2, 2)))
0.75