torch.nn.Linear类(nn.Module)详解(包含内部逻辑)

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>)
    

你可能感兴趣的:(pytorch,python,深度学习,开发语言,pytorch)