PyTorch LSTM-CNN MNIST图像序列分类维度适配问题咨询
课程学习卡点与相关问题描述
任务基本背景
- 任务基于经典MNIST数据集开展序列分类
- 输入与标签规则:取4个数字的组合作为输入序列,每个序列对应7类标签中的一类
- 标签1:序列为恒常趋势,示例
1111 - 标签2:序列为上升趋势,示例
1234 - 标签3:序列为下降趋势,示例
4321 - 标签7:序列为“下降-上升-下降”的波动趋势,示例
7382
- 标签1:序列为恒常趋势,示例
- 加载完成的原始张量形状为
(3,4,28,28),各维度含义依次为:批量大小=3、序列包含4张图像、单张图像尺寸为28×28像素
遇到的核心困惑
- 公开教程大多针对单图像输入场景,缺少多图序列适配PyTorch CNN-LSTM组合架构的参考
- 曾尝试将4张图像逐张展平后拼接为长度
4*28*28=3136的像素向量作为输入,无法确认该思路的合理性,需要架构设计层面的指导
已实现的代码
import numpy as np import torch import torch.nn as nn from torch import optim, softmax from sklearn.model_selection import train_test_split # 数据集:每条样本为4张MNIST图像组成的序列 # 数据标签:共7类 # 数据拆分 x_train, x_test, y_train, y_test = train_test_split( dataset.data, dataset.data_label, test_size=0.15, random_state=42 ) # 模型定义 class Mylstm(nn.Module): def __init__(self, input_size, hidden_size, n_layers, n_classes): super(Mylstm, self).__init__() self.input_size = input_size self.n_layers = n_layers self.hidden_size = hidden_size self.lstm = nn.LSTM(input_size, hidden_size, n_layers, batch_first=True) # 输出全连接层 self.fc = nn.Linear(hidden_size, n_classes) def forward(self, x): # 初始化全零隐状态 h0 = torch.zeros(self.n_layers, x.size(0), self.hidden_size).requires_grad_() # 初始化全零细胞状态 c0 = torch.zeros(self.n_layers, x.size(0), self.hidden_size).requires_grad_() out, (h_n, h_c) = self.lstm(x, (h0.detach(), c0.detach())) x = h_n[-1, :, 1] x = self.fc(x) x = softmax(x, dim=1) return x # 超参数配置 input_size = 28 hidden_size = 256 sequence_length = 28 n_layers = 2 n_classes = 7 learning_rate = 0.001 model = Mylstm(input_size, hidden_size, n_layers, n_classes) criterion = nn.CrossEntropyLoss() optimizer = torch.optim.SGD(model.parameters(), lr=learning_rate) # 训练流程 bs = 0 num_epochs = 5 batch_size = 3 # 计算单轮迭代次数 if np.mod(x_train.shape[0], batch_size) == 0.0: iter = int(x_train.shape[0] / batch_size) else: iter = int(x_train.shape[0] / batch_size) + 1 # 测试集遍历流程 bs = 0 for i in range(iter): sequences = x_test[bs:bs + batch_size, :] labels = y_test[bs:bs + batch_size] test_images = dataset.load_images(sequences) bs += batch_size # 训练循环 for epoch in range(num_epochs): for i in range(iter): sequences = x_train[bs:bs + batch_size, :] labels = y_train[bs:bs + batch_size] input_images = dataset.load_images(sequences) bs += batch_size # 张量维度调整为(batch_size, 序列长度, 展平后图像向量) images = (torch.from_numpy(input_images)).view(batch_size, 4, -1) labels = torch.from_numpy(labels) optimizer.zero_grad() output = model(images) # 计算损失 loss = criterion(output, labels) loss.backward() optimizer.step()
运行时报错
RuntimeError: input.size(-1) must be equal to input_size. Expected 28, got 784
需要获得的指导
- 适配本任务的CNN-LSTM组合架构具体设计方案
- 流程中的张量维度调整规范
- 当前运行报错的具体解决方案
内容的提问来源于stack exchange,提问作者Sal_H
相关产品推荐
相关产品推荐

