MindSpore 情感分类教程输入输出大小变化
以 MindSpore 情感分类教程中的参数为例(batch_size=64、seq_len=500、embedding_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=64、seq_len=500)均来自教程中数据预处理和模型初始化代码,无额外假设。 - LSTM 层的
batch_first=True是维度匹配的核心,教程代码中明确设置该参数,确保输入维度顺序为(batch_size, seq_len, 特征维度)。 - 双向 LSTM 的隐藏状态拼接(
ops.concat)是教程代码中自带逻辑,直接决定 LSTM 输出维度为(64, 512)。
鲲鹏昇腾开发者社区是面向全社会开放的“联接全球计算开发者,聚合华为+生态”的社区,内容涵盖鲲鹏、昇腾资源,帮助开发者快速获取所需的知识、经验、软件、工具、算力,支撑开发者易学、好用、成功,成为核心开发者。
更多推荐


所有评论(0)