PyTorch构建文本输入-数值序列输出Seq2Seq模型的技术疑问
1. 是否可以构建此类输入为文本、输出为数值序列的Seq2Seq模型?
完全可以,这类模型属于序列到序列回归任务,区别于传统文本生成的离散分类输出,核心是将文本编码后,生成连续数值构成的序列。这类模型常用于文本描述生成时间序列、音频特征序列、传感器数值序列等场景,只要调整Decoder的输出逻辑适配连续数值即可。
2. Decoder层是否需要添加Embedding层?
不需要。Embedding层的作用是将离散的词索引映射到连续向量空间,而你的输出是连续数值序列——Decoder每一步的输入是上一步生成的连续数值,而非离散索引,因此Embedding层完全无用,反而会增加不必要的维度转换开销。
3. 该维度错误的成因是什么,如何解决?
成因
从你的代码来看,当前Decoder的forward方法中,直接将input(维度[batch size],unsqueeze后变为[1, batch size])送入LSTM,但你的LSTM配置的input_size是embedding_dim=300,而输入的单数值维度仅为1,二者维度不匹配,导致LSTM无法处理,抛出维度越界错误。
解决步骤
(1)修改Decoder结构,适配数值输入
删除无用的Embedding层,调整LSTM的输入维度为1(对应单数值输入),同时将输出层改为回归用的单维度输出:
class Decoder(nn.Module): def __init__(self, hidden_dim, n_layers, dropout): super().__init__() self.hidden_dim = hidden_dim self.n_layers = n_layers # 输入为单数值,LSTM input_size设为1 self.rnn = nn.LSTM(1, hidden_dim, n_layers, dropout=dropout) # 回归任务,输出单个数值,fc_out输出维度为1 self.fc_out = nn.Linear(hidden_dim, 1) self.dropout = nn.Dropout(dropout) def forward(self, input, hidden, cell): # 将输入调整为LSTM要求的(seq_len, batch_size, input_size)格式 input = input.unsqueeze(0).unsqueeze(-1) # 变为[1, batch size, 1] output, (hidden, cell) = self.rnn(input, (hidden, cell)) # 压缩维度后送入全连接层 prediction = self.fc_out(output.squeeze(0)) return prediction, hidden, cell
(2)调整Seq2Seq模型的Decoder初始化
由于输出是单数值序列,无需output_dim参数,初始化Decoder时直接传入hidden_dim、n_layers、dropout即可。
(3)对齐数据维度
确保训练时的目标序列trg(即NPY_DATA)维度为[trg_len, batch_size],与输入文本序列src的维度格式对齐。
(4)更换损失函数
回归任务不能使用分类任务的CrossEntropyLoss,需改用MSELoss(均方误差)或L1Loss(平均绝对误差)等回归损失函数。
内容的提问来源于stack exchange,提问作者Ninlawat Phuangchoke

