Julia实现神经网络时自定义及NNlib的softmax输出不符合预期
Julia复现神经网络softmax输出量级异常排查方向
- softmax计算轴配置错误(最高概率)
NNlib的softmax函数默认对输入张量的所有元素统一做归一化,而你需要的是对每个样本的3个输出单独归一化。要注意Julia是列优先存储:- 如果你的输入数据集形状为
(样本数, 特征数)即(300,2),全连接层输出的logits形状为(300,3),调用softmax时必须指定dims=2按行归一化,否则会对900个全局元素做归一化,每个元素的数值约为1/900≈0.001,和你遇到的0.003量级完全吻合。 - 如果你的数据集按列存储为
(特征数, 样本数)即(2,300),logits形状为(3,300),则需要指定dims=1按列归一化。
- 如果你的输入数据集形状为
- 矩阵乘法/维度匹配错误
2输入3输出的全连接层计算逻辑要和数据维度对应:- 行优先存储样本(
(300,2))时,权重形状应为(2,3),计算逻辑为X * W + b - 列优先存储样本(
(2,300))时,权重形状应为(3,2),计算逻辑为W * X + b
权重形状或乘法顺序错误会导致输出的数值分布完全偏离预期,进而导致softmax输出异常。
- 行优先存储样本(
- 权重/偏置初始化问题
若全连接层的权重、偏置被初始化为极小值(比如初始方差设置过小),经过两层全连接+ReLU后,第二层输出的logits会全部处于接近0的极小区间,softmax输出会被压缩到异常量级。可以临时将权重设为固定值(如全0.1)、偏置设为0,手动核对前向计算结果是否符合预期,快速排除层实现问题。 - 数据集尺度不匹配
检查你生成的螺旋数据集的数值范围,如果输入特征的数值远大于Python教程中的预处理后范围(比如教程输入归一化到[-1,1],你的生成数据范围在[-10,10]),经过第一层全连接后数值会过大,导致ReLU激活后大量输出被置0,第二层logits整体量级偏低。
内容的提问来源于stack exchange,提问作者Erik
相关产品推荐
相关产品推荐

