有一线性网络:torch.nn.Linear(in_features, out_features, bias=True)
,有下面两个问题:
线性变换可以简单地表示为 y = Ax + b
,其中 A 是权重矩阵,x 是输入向量,b 是偏置向量,y 是输出向量。对于矩阵左乘,Ax 将in_features维输入x映射为out_features维输出,所以A的形状是 out_features * in_features
权重矩阵的初始化如下所示:
import torch.nn.init as init
class CustomLinear(nn.Linear):
def __init__(self, in_features, out_features, bias=True):
super(CustomLinear, self).__init__(in_features, out_features, bias)
# 使用自定义的权重初始化方法
init.kaiming_uniform_(self.weight, a=math.sqrt(5))
if self.bias is not None:
fan_in, _ = init._calculate_fan_in_and_fan_out(self.weight)
bound = 1 / math.sqrt(fan_in)
init.uniform_(self.bias, -bound, bound)
# 使用自定义的线性层
custom_linear = CustomLinear(in_features=10, out_features=2)
PyTorch的模型参数期望的是一个torch.nn.Parameter对象或者None,而不是一个普通的张量。当我们尝试将一个普通张量直接赋值给模型参数的权重时,就会触发这个TypeError。
解决方法有两个:
(1)使用torch.nn.Parameter包装普通张量(推荐使用)
(2)将普通张量赋值给weight.data