正确塑造keras模型,以已知的输出大小对序列进行排序

时间:2019-11-27 14:26:01

标签: python numpy keras deep-learning lstm

我对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]

输出/解决方案将是:

  • 目标HTML的标记数组:“ Bonjour les amis = [-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句子中的单词数相同。

训练输出布尔矢量的正确损失或优化器是什么(列表:此单词是否带标签)?

感谢您的阅读!

0 个答案:

没有答案