torch.nn.Linear类(nn.Module)
-
torch.nn.Linear(in_features, out_features, bias=True, device=None, dtype=None)
对输入使用线性变换: y = x A T + b y = xA^T + b y=xAT+b
其实上面这个不是重点,这个函数的重点在于其可以针对维度如 ( 2 × 2 × 3 ) (2\times2\times3) (2×2×3)这种多维度的输入,与我以前所一直认为的只能针对二维输入不一样,其可以支持多维
还是先说说其参数:
- in_features:输入的最后一维度的大小,如 ( 2 × 2 × 3 ) (2\times2\times3) (2×2×3)就是3
- out_features:你想要输出的最后一维度的大小,比如,如果这个参数是4,那么 ( 2 × 2 × 3 ) (2\times2\times3) (2×2×3)会变为 ( 2 × 2 × 4 ) (2\times2\times4) (2×2×4)
- bias:是否使用偏差,即上面公式是否+b
ps:这个组件的默认权重与偏差的初始化使用如下方式
- 权重A使用 U ( − k , k ) \mathcal{U}(-\sqrt{k}, \sqrt{k}) U(−k,k)初始化,即在 ( − k , k ) (-\sqrt{k}, \sqrt{k}) (−k,k)范围内的均匀分布权重初始化, k = 1 in_features k = \frac{1}{\text{in\_features}} k=in_features1
- 偏差b使用与权重一样的初始化方式
-
举例:(内部逻辑)
>>> x = torch.arange(12,dtype=torch.float32).view(2,2,3) >>> x Out: tensor([[[ 0., 1., 2.], [ 3., 4., 5.]], [[ 6., 7., 8.], [ 9., 10., 11.]]]) >>> linear=torch.nn.Linear(3,1) # in_features=3,out_features=1 >>> linear.weight # 展示权重 Out: Parameter containing: tensor([[ 0.4956, -0.0664, -0.5577]], requires_grad=True) >>> linear.bias # 展示偏差 Out: Parameter containing: tensor([0.2490], requires_grad=True) >>> y = linear(x) >>> y.shape Out: torch.Size([2, 2, 1]) >>> y Out: tensor([[[-0.9327], # 下面会展示如何得到这个-0.9327 [-1.3183]], [[-1.7040], [-2.0896]]], grad_fn=<ViewBackward0>) >>> torch.sum(torch.dot(x[0,0,:],linear.weight.t().view(3))+linear.bias) ... # 即[ 0., 1., 2.]与权重[ 0.4956, -0.0664, -0.5577]的转置做矩阵乘法,再加上偏差0.2490 Out: tensor(-0.9327, grad_fn=<SumBackward0>)