在PyTorch图像字幕任务中,如何用TF-IDF矩阵替换LSTM解码器的嵌入层?
在PyTorch中用TF-IDF矩阵替代LSTM嵌入层实现图像字幕解码器
要实现用预计算的TF-IDF矩阵替代可训练的嵌入层,核心是直接用词汇索引从TF-IDF矩阵中获取固定的词表示,无需训练嵌入参数。结合你提供的TF-IDF矩阵形状(2295, 20748)(对应2295个词汇,每个词的TF-IDF向量维度为20748),修改后的PyTorch实现如下:
关键逻辑说明
- 将TF-IDF矩阵转为PyTorch张量,设置为不可训练(TF-IDF是预计算特征,无需反向更新)
- 移除原有的
nn.Embedding层,直接通过词索引从TF-IDF张量中提取词向量 - 确保LSTM输入维度与TF-IDF向量维度严格匹配
修改后的解码器代码
import torch import torch.nn as nn class decoderRNN(nn.Module): def __init__(self, vocab_size, tfidf_dim, hidden_size, num_layers, tfidf_matrix): super(decoderRNN, self).__init__() # 把TF-IDF矩阵转为PyTorch张量,固定参数不参与训练 self.tfidf_embedding = torch.tensor(tfidf_matrix, dtype=torch.float32) self.tfidf_embedding.requires_grad = False self.lstm = nn.LSTM(tfidf_dim, hidden_size, num_layers) self.linear = nn.Linear(hidden_size, vocab_size) self.dropout = nn.Dropout(0.5) def forward(self, features, caption): # 从TF-IDF矩阵中提取对应词向量:caption形状为[batch_size, seq_len],转置后索引 embeddings = self.tfidf_embedding[caption.transpose(0, 1)] embeddings = self.dropout(embeddings) # 将图像特征拼接在序列开头,调整维度适配LSTM输入格式 features = features.unsqueeze(0) embeddings = torch.cat((features, embeddings), dim=0) hiddens, _ = self.lstm(embeddings) outputs = self.linear(hiddens) return outputs
注意事项
- 维度对应:TF-IDF矩阵形状为(2295, 20748),因此初始化时需传入
vocab_size=2295、tfidf_dim=20748 - 设备适配:如果用GPU训练,要把
self.tfidf_embedding迁移到对应设备,比如self.tfidf_embedding = self.tfidf_embedding.to(device) - 输入格式:
caption必须是词索引序列,常规形状为[batch_size, seq_len],转置后才能正确匹配TF-IDF矩阵的索引维度
内容的提问来源于stack exchange,提问作者MaheenUnzeelah
相关产品推荐
相关产品推荐

