位置:首页 > 综合教程 > Linear标签分类使用教程:从基础到高级完整版

Linear标签分类使用教程:从基础到高级完整版

时间:2026-06-23  |  作者:318050  |  阅读:0

要用Linear层做标签分类,第一步就是让输入数据“变扁”——从多维特征图变成一维向量。

说白了,Linear层只接受[batch, features]这种二维结构。它不认识宽度、高度、通道数。

如果直接把卷积输出的四维张量喂给它,它会直接报错。

先确认输入张量的形状

动手之前,建议先用print(x.shape)看一眼当前特征图的形状。

如果打印出来是torch.Size([32, 64, 8, 8])这种四维结构——[batch, channel, height, width]——那Linear层肯定不认。

这一步不能省。强行传入四维张量会触发RuntimeError,提示形状不匹配。

用Flatten层把特征图压平

有两种常见做法。

方法一:直接加nn.Flatten()

推荐在模型定义里直接加一个nn.Flatten()层。它能自动保留batch维度,把剩下的所有维度乘到一起。

举个例子:输入[32, 64, 8, 8]经过Flatten后,输出就是[32, 4096]。一个操作搞定,省心。

方法二:手动reshape

x = x.view(x.size(0), -1)x = x.reshape(x.size(0), -1),效果一样。

注意:batch size必须在第0维,不然-1推导会乱套。

配置Linear层,让尺寸对得上

1. 计算Flatten后的总特征数

以CIFAR-10为例,假设卷积最后输出是[batch, 512, 4, 4],那么每个样本的特征数就是512 × 4 × 4 = 8192。

此时Linear层的输入尺寸就得设为8192。

2. 设定输出尺寸

标签有多少个独立类别,输出就设多少。比如10分类任务,就是nn.Linear(8192, 10)

3. 验证参数矩阵的形状

Linear层内部的权重W是[10, 8192],意思就是每个类别对应一个长度为8192的权重向量。

这个W才是线性分类器的核心——它把每个像素或特征的贡献加权求和,最终生成该类别的得分。

准备标签,让Loss认识它

标签格式要求

真实标签必须是一维的torch.long张量,里面是0到K1之间的整数,比如tensor([3, 0, 7, 2])这样。

标签值必须从0开始连续编号,这一点很容易忽略。

如果原始标签是[1, 5, 9, 12]这种跳着走的,必须先映射成[0, 1, 2, 3],否则Loss计算时会因为索引越界而报错。

CrossEntropyLoss注意事项

如果用了CrossEntropyLoss,它会自动对Linear的输出做Softmax、取对数、再算负对数似然。

所以Linear层后面不要额外加Softmax,加了反而画蛇添足。

Linear如何使用标签分类

来源:整理自互联网
免责声明:文中图文均来自网络,如有侵权请联系删除,心愿游戏发布此文仅为传递信息,不代表心愿游戏认同其观点或证实其描述。

相关文章

更多

精选合集

更多

大家都在玩

热门话题

大家都在看

更多