You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

注意事项

  1. 维度对应:TF-IDF矩阵形状为(2295, 20748),因此初始化时需传入vocab_size=2295、tfidf_dim=20748
  2. 设备适配:如果用GPU训练,要把self.tfidf_embedding迁移到对应设备,比如self.tfidf_embedding = self.tfidf_embedding.to(device)
  3. 输入格式:caption必须是词索引序列,常规形状为[batch_size, seq_len],转置后才能正确匹配TF-IDF矩阵的索引维度

内容的提问来源于stack exchange,提问作者MaheenUnzeelah

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 15:03:37