这是有效的seq2seq lstm模型吗?

时间:2020-06-08 14:13:20

标签: python keras lstm seq2seq

您好,我正在尝试构建seq2seq模型以生成一些音乐。 我真的对此并不了解。 在互联网上,我找到了这种模型:

def createSeq2Seq():
    #seq2seq model

    #encoder
    model = Sequential()
    model.add(LSTM(input_shape = (None, input_dim), units = num_units, activation= 'tanh', return_sequences = True ))
    model.add(BatchNormalization())
    model.add(Dropout(0.3))
    model.add(LSTM(num_units, activation= 'tanh'))

    #decoder
    model.add(RepeatVector(y_seq_length))
    num_layers= 2
    for _ in range(num_layers):
        model.add(LSTM(num_units, activation= 'tanh', return_sequences = True))
        model.add(BatchNormalization())
        model.add(Dropout(0.3))

    model.add(TimeDistributed(Dense(output_dim, activation= 'softmax')))
    return model

我的数据是钢琴卷的列表。钢琴卷是一个矩阵,其中的列表示不同音高的单次编码(在我的情况下为49),每列表示时间(在我的情况下为0,02s)。钢琴谱矩阵只有一个和零。

我已经准备好了我的训练数据,将我的钢琴乐曲重塑(一首又一首) 形状=(某物,批处理大小,49)。因此,我的输入数据是所有歌曲一首又一首地分开,大小成批大小。然后,我的训练数据是相同的输入,但延迟了一批。

x_seq_length和y_seq_length等于batch_size。 Input_dim = 49

我的输入和输出序列具有相同的维度。

我在推理中犯了任何错误吗?我找到的seq2seq模型正确吗?

1 个答案:

答案 0 :(得分:0)

这不是seq2seq模型。 RepeatVector采用最后一个编码器LSTM的最后状态,并为每个输出令牌制作一个副本。然后,将这些副本输入到“解码器” LSTM中,从而在每个时间步都有相同的输入。

适当的自回归解码器将其先前的输出作为输入,即,在训练时,解码器的输入与其输出相同,但移位一个位置。这也意味着您的模型错过了解码器输入的嵌入层。