我对keras并不陌生,并尝试实现一个序列到序列模型。 我想做的是将HTML标签放回翻译后的句子中。
这是我要实现的目标:
Hello <b>friends</b> + Bonjour les amis => Bonjour <b>les amis</b>
我有一个翻译HTML句子的数据集。
Hello <b>friends</b> ; Bonjour <b>les amis</b>
A lot of other similar lines...
对于要实现的目标,我将数据集中的每个HTML句子都改为以下内容。
sentence: Hello <b>friends</b>
words: ['hello', 'friends']
hashes: [1, 2]
tags: [-1, 1] (-1 if the word is not tagged, 1 if it is)
这意味着我的句子中的每个单词都具有唯一的哈希值,并且数组会跟踪每个单词的标记。 (在这种情况下,“ hello”没有标记,而“ friends”标记)
所以我模型的输入为:
源HTML的哈希数组:“ Hello friends” = [1, 2]
目标HTML的哈希数组:“ Bonjour les amis” = [3, 4, 5]
源HTML的标记数组:“你好朋友 = [-1, 1]
输出/解决方案将是:
[-1, 1, 1]
我尝试了许多不同的模型形状和层,但是我之所以陷入困境,主要是因为与我的经验相比,这种模型的复杂性。因此,我会接受任何来自技术娴熟的人的建议!
这是我到目前为止实现的模型。现在只产生零,精度也固定为0。
所有三个数组都预先填充了0,以获得相同的最大长度。
def create_model(vocabulary_size, max_length):
# The three arrays inputs
source_hashes = Input(shape=(max_length,))
target_hashes = Input(shape=(max_length,))
source_tags = Input(shape=(max_length,))
# An embedding for each array
source_hashes_embeddings = Embedding(vocabulary_size, 4, mask_zero=True)(source_hashes)
target_hashes_embeddings = Embedding(vocabulary_size, 4, mask_zero=True)(target_hashes)
source_tags_embedding = Embedding(3, 4, mask_zero=True)(source_tags)
# A LSTM for each array
source_lstm = LSTM(max_length, return_sequences=True)(source_hashes_embeddings)
target_lstm = LSTM(max_length, return_sequences=True)(target_hashes_embeddings)
tags_lstm = LSTM(max_length, return_sequences=True)(source_tags_embedding)
# Concatenate the results of the three LSTM inputs
merge = Concatenate()([source_lstm, target_lstm, tags_lstm])
# The final output
lstm = LSTM(max_length)(merge)
model = Model(inputs=[source_hashes, target_hashes, source_tags], outputs=final)
model.compile(optimizer='rmsprop', loss='categorical_crossentropy', metrics=['accuracy'])
return model
我知道这个模型似乎完全荒谬,而且我的方法肯定有问题。但是我对这种模型的多种选择感到不知所措,并且肯定会从另一个人的角度受益。
也许我应该将我的三个数组串联起来,并馈给一个唯一的RNN(我觉得三个串联的LSTM不是解决问题的正确方法)?
也许我应该将标签嵌入到源HTML的哈希中:
你好朋友 = [[1, -1] [2, 1]]
?
但是我不能像现在这样简单地使用嵌入层...
在知道输出大小的情况下输出我的输出向量的正确方法是什么?我不是在seq2seq的情况下,输出长度是不确定的,例如在翻译模型中。就我而言,最终向量将始终与目标HTML句子中的单词数相同。
训练输出布尔矢量的正确损失或优化器是什么(列表:此单词是否带标签)?
感谢您的阅读!