固定权重的PyTorch nn.Linear相同输入输出值不同的原因
随机性来源于torch.nn.Linear层默认启用的随机初始化偏置项。
具体原因
torch.nn.Linear默认会启用可训练偏置参数,你仅手动将权重修改为了全1,没有修改偏置的取值:
- 偏置参数在层实例化时会默认从均匀分布
U(-√(1/in_features), √(1/in_features))中采样,你这里in_features=3,所以偏置的采样范围约为±0.577,和你观测到的输出在2.5~3.5区间浮动的现象完全吻合。 - 你的输入为
[1,1,1],最终计算逻辑为:1*1 + 1*1 + 1*1 + 偏置值 = 3 + 偏置值,所以每次运行输出会随偏置的随机初始化波动。
修复方法
你可以任选以下一种方案解决:
- 实例化Linear层时直接关闭偏置,去掉额外的随机参数:
self.fc1 = torch.nn.Linear(3, 1, bias=False)
- 保留偏置的同时手动将其固定为固定值(比如0),在你现有的权重赋值逻辑后添加偏置赋值代码:
with torch.no_grad(): self.fc1.weight = torch.nn.Parameter(torch.ones_like(self.fc1.weight)) # 新增偏置固定逻辑 self.fc1.bias = torch.nn.Parameter(torch.zeros_like(self.fc1.bias))
修改后重新运行代码,输出就会固定为你预期的3。
内容的提问来源于stack exchange,提问作者Justin P.
相关产品推荐
相关产品推荐

