编码器与解码器采用不同隐层维度的Seq2Seq实现方案问询
编码器与解码器异隐层维度的Seq2Seq实现说明
你推测的同隐层维度设计原因是对的,主流示例这么做主要是可以直接将编码器最终隐状态作为解码器初始状态传入,不需要额外的维度转换逻辑。二者用不同隐层维度的实现方案也很成熟,只需要新增状态映射层做维度适配即可,相关实现示例如下:
核心实现逻辑
- 编码器按设定的隐层维度正常搭建,输出最终的隐状态(LSTM输出h和c两个状态,GRU仅输出h一个状态)
- 新增对应数量的
Dense全连接层,将编码器输出的状态线性映射为解码器隐层维度的张量 - 解码器按自身的隐层维度搭建,接收映射后的张量作为初始状态即可,后续训练、推理逻辑和同维度的Seq2Seq完全一致
Keras实现示例
from tensorflow.keras.layers import Input, LSTM, Dense, Embedding from tensorflow.keras.models import Model # 自定义参数配置 encoder_vocab_size = 10000 decoder_vocab_size = 8000 encoder_latent_dim = 256 # 编码器隐层维度 decoder_latent_dim = 512 # 解码器隐层维度,与编码器不同 # 编码器部分 encoder_inputs = Input(shape=(None,)) enc_emb = Embedding(encoder_vocab_size, 128)(encoder_inputs) encoder_lstm = LSTM(encoder_latent_dim, return_state=True) encoder_outputs, state_h_enc, state_c_enc = encoder_lstm(enc_emb) # 维度映射:将编码器状态转换为解码器需要的维度 state_h = Dense(decoder_latent_dim)(state_h_enc) state_c = Dense(decoder_latent_dim)(state_c_enc) encoder_states = [state_h, state_c] # 解码器部分 decoder_inputs = Input(shape=(None,)) dec_emb_layer = Embedding(decoder_vocab_size, 128) dec_emb = dec_emb_layer(decoder_inputs) decoder_lstm = LSTM(decoder_latent_dim, return_sequences=True, return_state=True) decoder_outputs, _, _ = decoder_lstm(dec_emb, initial_state=encoder_states) decoder_dense = Dense(decoder_vocab_size, activation='softmax') decoder_outputs = decoder_dense(decoder_outputs) # 组装完整模型 model = Model([encoder_inputs, decoder_inputs], decoder_outputs)
如果使用GRU单元,只需要去掉对c状态的处理,仅映射h状态即可。如果是带注意力机制的Seq2Seq结构,适配逻辑更简单:注意力层对编码器所有时序输出加权计算后,新增一层全连接层将加权结果映射到解码器隐层维度即可,不需要单独处理编码器最终状态。
内容的提问来源于stack exchange,提问作者Isaribi
相关产品推荐
相关产品推荐

