要用linear层实现标签分类,必须先将输入数据展平为二维张量[batch, features];若卷积输出为[32, 64, 8, 8],需用nn.flatten()或x.reshape(x.size(0), -1)转为[32, 4096];linear输入尺寸须匹配展平后特征数(如512×4×4=8192),输出尺寸等于类别数(如10);标签须为torch.long型且从0开始连续编号。

要用Linear层实现标签分类,必须先让输入数据变成一维向量,否则Linear层无法接收多维特征图作为输入;直接把卷积输出喂给Linear会报错。
确认输入张量形状是否符合Linear要求
检查你当前的特征张量形状,比如用print(x.shape)输出。如果结果类似torch.Size([32, 64, 8, 8]),说明是四维:[batch, channel, height, width]。Linear层只接受二维输入:[batch, features]。
这一步不能跳过——强行传入四维张量会触发RuntimeError: mat1 and mat2 shapes cannot be multiplied。
用Flatten层把特征图压成一维
方法一:在模型定义中插入nn.Flatten()(推荐)
在PyTorch中,直接在卷积层后加nn.Flatten(),它会自动保留batch维度,把后面所有维度相乘。例如输入[32, 64, 8, 8] → 输出[32, 4096]。
方法二:手动reshape
用x = x.view(x.size(0), -1)或x = x.reshape(x.size(0), -1),效果相同。但【必须确保batch size在第0维】,否则-1推导会出错。
配置Linear层匹配压平后的特征数
第一步:计算Flatten后总特征数
拿CIFAR-10为例,若卷积最后输出是[batch, 512, 4, 4],则每个样本特征数为512 × 4 × 4 = 8192,Linear层输入尺寸就得设为8192。
第二步:设定输出类别数
标签有多少个独立类别,Linear层输出尺寸就设多少。比如10分类任务,nn.Linear(8192, 10)。
第三步:验证参数矩阵W形状
Linear层内部权重W是[10, 8192],即每类一个长度为8192的权重向量。这个W就是线性分类器的核心——它把每个像素/特征的贡献加权求和,生成该类得分。
训练时用标签索引匹配Loss函数
准备真实标签时,确保是dtype=torch.long的一维张量,内容为0~K−1的整数,比如tensor([3, 0, 7, 2])。
使用CrossEntropyLoss时,它内部会自动对Linear输出做Softmax+log+NLL,所以Linear层**不要**额外加Softmax。
【标签值必须从0开始连续编号】,若你的原始标签是[1, 5, 9, 12],必须先映射为[0, 1, 2, 3],否则loss计算会越界报错。











