以 MindSpore 情感分类教程中的参数为例(batch_size=64seq_len=500embedding_size=100、LSTM 隐藏层维度 256、双向 LSTM),各层输入输出大小变化如下,用具体数值清晰展示维度流转逻辑。

一、基础参数与教程代码对应(前提)

先明确教程中固定的核心参数,所有维度变化均基于此,且参数定义可在教程代码中直接找到:

参数名称 教程代码中的定义位置 数值 作用说明
batch_size imdb_train = imdb_train.batch(64, ...) 64 每批次送入模型的样本数量(64 条影评)
seq_len C.PadEnd([500], pad_value=pad_token_id) 500 每条影评统一后的长度(500 个单词 index)
embedding_dim 模型初始化时 embedding_dim=100 100 每个单词的词向量维度(Glove 预训练向量维度)
hidden_dim 模型初始化时 hidden_dim=256 256 LSTM 单方向隐藏层维度
bidirectional 模型初始化时 bidirectional=True True 启用双向 LSTM,需拼接两个方向的隐藏状态
output_dim 模型初始化时 output_dim=1 1 最终输出维度(二分类:正面 / 负面情感)

二、各层输入输出大小变化(带教程代码对应)

按 nn.Embedding → nn.LSTM → nn.Dense 顺序拆解,每个步骤标注 “输入维度→教程代码逻辑→输出维度”,确保与链接代码完全对应。

1. 第一层:nn.Embedding(词嵌入层)
  • 输入大小(64, 500)对应 “64 个样本 / 批次,每个样本 500 个单词 index”,输入数据来自教程中预处理后的批次数据(imdb_train.batch(64) 输出)。

  • 教程代码对应(链接内模型定义部分):

    python

    运行

    # Embedding层初始化:输入维度为(batch_size, seq_len),输出维度增加embedding_dim
    self.embedding = nn.Embedding(
        vocab_size=vocab_size,  # 词表大小(教程中为400002)
        embedding_size=embedding_dim,  # 即100,词向量维度
        padding_idx=pad_idx  # 忽略<pad>的index,不参与计算
    )
    
    # 前向传播:接收(64,500)的text输入,输出(64,500,100)
    embedded = self.embedding(text)  # text维度=(64,500),embedded维度=(64,500,100)
    
  • 输出大小(64, 500, 100)变化逻辑:为每个单词 index 匹配 100 维词向量(embedding_dim=100),在原有维度基础上新增 “词向量维度”,最终输出 “64 个样本,每个样本 500 个单词,每个单词 100 维向量”。

2. 第二层:nn.LSTM(循环神经网络层)
  • 输入大小(64, 500, 100)直接接收 Embedding 层的输出,即 “带语义向量的序列数据”,与教程中 LSTM 层的输入要求完全匹配。

  • 教程代码对应(链接内模型定义部分):

    python

    运行

    # LSTM层初始化:关键参数batch_first=True,适配(batch_size, seq_len, embedding_dim)输入
    self.rnn = nn.LSTM(
        input_size=embedding_dim,  # 输入特征维度=100(与Embedding输出一致)
        hidden_size=hidden_dim,    # 单方向隐藏层维度=256
        num_layers=n_layers,       # 层数=2(教程中默认)
        bidirectional=bidirectional,  # 双向=True
        batch_first=True           # 必须设置,确保输入第一维是batch_size
    )
    
    # 前向传播:接收(64,500,100)的embedded输入,取最后一层双向隐藏状态
    _, (hidden, _) = self.rnn(embedded)  # hidden原始维度=(4, 64, 256)(2层×2方向=4)
    # 拼接最后一层的前向和后向隐藏状态:(64,256) + (64,256) → (64,512)
    hidden_concat = ops.concat((hidden[-2,:,:], hidden[-1,:,:]), axis=1)
    
  • 输出大小(64, 512)变化逻辑:双向 LSTM 会输出两个方向的隐藏状态,单方向维度为 256,拼接后维度为 256×2=512;同时丢弃序列维度(500),仅保留 “每个样本的整体语义向量”,最终输出 “64 个样本,每个样本 512 维语义向量”。

3. 第三层:nn.Dense(全连接层)
  • 输入大小(64, 512)接收 LSTM 层拼接后的隐藏状态,即 “每个样本的 512 维语义向量”,与教程中 Dense 层的输入维度严格对应。

  • 教程代码对应(链接内模型定义部分):

    python

    运行

    # Dense层初始化:输入维度=512(双向LSTM拼接后),输出维度=1(二分类)
    self.fc = nn.Dense(
        in_channels=hidden_dim * 2,  # 256×2=512,输入特征数
        out_channels=output_dim      # 1,输出特征数(二分类结果)
    )
    
    # 前向传播:接收(64,512)的hidden_concat输入,输出(64,1)
    output = self.fc(hidden_concat)  # output维度=(64, 1)
    
  • 输出大小(64, 1)变化逻辑:通过线性变换将 512 维语义向量压缩为 1 维,每个数值对应 “该样本为正面情感的概率”,最终输出 “64 个样本,每个样本 1 个情感预测值”。

三、完整维度流转与教程代码对应图

plaintext

# 教程代码流程                维度变化
1. 预处理后批次数据 → (64, 500)  # imdb_train.batch(64) + PadEnd([500])
2. nn.Embedding输入 → (64, 500)  # self.embedding(text)
   nn.Embedding输出 → (64, 500, 100)
3. nn.LSTM输入 → (64, 500, 100)  # self.rnn(embedded)
   nn.LSTM输出 → (64, 512)       # ops.concat(...)拼接双向隐藏状态
4. nn.Dense输入 → (64, 512)      # self.fc(hidden_concat)
   nn.Dense输出 → (64, 1)        # 最终情感预测结果

关键代码匹配说明

  • 所有维度变化的参数(如 batch_size=64seq_len=500)均来自教程中数据预处理和模型初始化代码,无额外假设。
  • LSTM 层的 batch_first=True 是维度匹配的核心,教程代码中明确设置该参数,确保输入维度顺序为 (batch_size, seq_len, 特征维度)
  • 双向 LSTM 的隐藏状态拼接(ops.concat)是教程代码中自带逻辑,直接决定 LSTM 输出维度为 (64, 512)
Logo

鲲鹏昇腾开发者社区是面向全社会开放的“联接全球计算开发者,聚合华为+生态”的社区,内容涵盖鲲鹏、昇腾资源,帮助开发者快速获取所需的知识、经验、软件、工具、算力,支撑开发者易学、好用、成功,成为核心开发者。

更多推荐