0

我正在尝试构建一个 seq2seq 自动编码器,它应该能够捕获序列的逻辑并能够从状态向量中重建它。我正在使用一些示例序列来测试模型是否能够执行非常简单的任务版本。为此,我有类似 '<><><>...' 或 '(.)(.)(.)...' 的序列。

该模型的基本代码如下所示:

n_hidden = 256
emb_dim = 16
n_tokens = 559

#Encoder
enc_inp = Input(shape=(None,))
emb_layer = Embedding(input_dim=n_tokens, output_dim=emb_dim)
enc_emb = emb_layer(enc_inp)
enc_layer = LSTM(n_hidden, return_state=True)
enc, state_h, state_c = enc_layer(enc_emb)

#Decoder
dec_inp = Input(shape=(None,))
dec_emb = emb_layer(dec_inp)
dec_layer = LSTM(n_hidden, return_sequences=True, return_state=True)
dec, _, _ = dec_layer(dec_emb, initial_state=[state_h, state_c])
dense_layer = Dense(n_tokens, activation='softmax')
res = dense_layer(dec)

model = Model([enc_inp, dec_inp], res)
model.compile(loss='categorical_crossentropy', optimizer='rmsprop', metrics=['accuracy'])


#Models for Inference

#Encoder
encoder_model = Model(enc_inp, [state_h, state_c])

#Decoder
state_inp1 = Input(shape=(n_hidden,))
state_inp2 = Input(shape=(n_hidden,))   
dec, state_h, state_c = dec_layer(dec_emb, initial_state=[state_inp1, state_inp2])
res = dense_layer(dec)

decoder_model = Model([dec_inp] + [state_inp1, state_inp2], [res] + [state_h, state_c])

编码器输入是由嵌入层转换为向量的整数编码字符。解码器输入与编码器输入相同,但在开头附加了一个开始标记,因此向右移动了一个。训练中使用的结果是 one-hot 编码的编码器输入。

现在模型的性能不是很好,只是一遍又一遍地预测第一个字符,所以对于:
原始:'<><><>...',预测:'<<<<<<...'
原始: '(。)(。)(。)...', 预言: '((((((...'

这只是一个培训问题还是我在这里犯了一些关键错误?

4

0 回答 0