You need to enable JavaScript to run this app. PyTorch LSTM-CNN MNIST图像序列分类维度适配问题咨询
优惠活动
大模型
产品
解决方案
定价
更多

PyTorch LSTM-CNN MNIST图像序列分类维度适配问题咨询

课程学习卡点与相关问题描述

任务基本背景

  • 任务基于经典MNIST数据集开展序列分类
  • 输入与标签规则:取4个数字的组合作为输入序列,每个序列对应7类标签中的一类
    • 标签1:序列为恒常趋势,示例1111
    • 标签2:序列为上升趋势,示例1234
    • 标签3:序列为下降趋势,示例4321
    • 标签7:序列为“下降-上升-下降”的波动趋势,示例7382
  • 加载完成的原始张量形状为 (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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.24 12:54:03