【发布时间】:2017-03-15 17:26:53
【问题描述】:
我正在尝试在文本序列(网络文章的标题)上构建一个 LSTM 自动编码器,主要是通过复制https://blog.keras.io/building-autoencoders-in-keras.html 中提到的基本示例。输入是 80 个(最大标题长度)长度为 40(数据集中的 ascii 字符数)的 one-hot 向量。检查预测的输出与输入相同,因为它是一个自动编码器。我有大约 60k 序列用于测试模型,但最终我想在整个 320k 集上运行它。
问题
但问题是,LSTM 网络根本没有正确学习。例如,捷克语句子 'Real vyhrál slavné derby s Barcelonou' 被复制为 '###uuu...uuu'(点表示 u's 一直持续到最后)。
在上面的教程中,并没有提到要使用什么损失函数、激活函数或优化器,所以我搜索并发现,使用 LSTMs 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'])
所以问题
- 你会使用什么损失函数?
- 二进制/分类交叉熵是否计算整个输出矩阵或单个时间步长(输出矩阵中的行)的损失?我想实现后者。
- 如果您认为这种方法行不通,您会建议另一种方法吗?
【问题讨论】:
-
这个问题可能在datascience.stackexchange.com得到更好的回答
标签: python keras lstm recurrent-neural-network autoencoder