Pytorch nn.Linear的基本用法与原理详解

nn.Linear的基本定义

nn.Linear定义一个神经网络的线性层,方法签名如下:

torch.nn.Linear(in_features, # 输入的神经元个数
           out_features, # 输出神经元个数
           bias=True # 是否包含偏置
           )

Linear其实就是对输入 X n × i X_{n \times i} Xn×i 执行了一个线性变换,即:

Y n × o = X n × i W i × o + b Y_{n \times o} = X_{n \times i}W_{i\times o} + b Yn×o=Xn×iWi×o+b

其中 W W W是模型要学习的参数, W W W 的维度为 W i × o W_{i \times o} Wi×o , b b b 是o维的向量偏置 n n n 为输入向量的行数(例如,你想一次输入10个样本,即batch_size为10,则 n = 10 n=10 n=10 ), i i i 为输入神经元的个数(例如你的样本特征数为5,则 i = 5 i=5 i=5 ), o o o 为输出神经元的个数。

使用演示:

from torch import nn
import torch

model = nn.Linear(2, 1) # 输入特征数为2,输出特征数为1
input = torch.Tensor([1, 2]) # 给一个样本,该样本有2个特征(这两个特征的值分别为1和2)
output = model(input)
output
tensor([-1.4166], grad_fn=<AddBackward0>)

我们的输入为[1,2],输出了[-1.4166]。可以查看模型参数验证一下上述的式子:

# 查看模型参数
for param in model.parameters():
    print(param)
Parameter containing:
tensor([[ 0.1098, -0.5404]], requires_grad=True)
Parameter containing:
tensor([-0.4456], requires_grad=True)

可以看到,模型有3个参数,分别为两个权重和一个偏执。计算可得:

y = [ 1 , 2 ] ∗ [ 0.1098 , − 0.5404 ] T − 0.4456 = − 1.4166 y = [1, 2] * [0.1098, -0.5404]^T - 0.4456 = -1.4166 y=[1,2][0.1098,0.5404]T0.4456=1.4166

实战

假设我们的一次输入三个样本A,B,C(即batch_size为3),每个样本的特征数量为5:

A: [0.1,0.2,0.3,0.3,0.3]
B: [0.4,0.5,0.6,0.6,0.6]
C: [0.7,0.8,0.9,0.9,0.9]

则我们的输入向量 X 3 × 5 X_{3\times 5} X3×5 为:

X = torch.Tensor([
    [0.1,0.2,0.3,0.3,0.3],
    [0.4,0.5,0.6,0.6,0.6],
    [0.7,0.8,0.9,0.9,0.9],
])
X
tensor([[0.1000, 0.2000, 0.3000, 0.3000, 0.3000],
        [0.4000, 0.5000, 0.6000, 0.6000, 0.6000],
        [0.7000, 0.8000, 0.9000, 0.9000, 0.9000]])

定义线性层,我们的输入特征为5,所以in_feature=5,我们想让下一层的神经元个数为10,所以out_feature=10,则模型参数为: W 5 × 10 W_{5\times 10} W5×10

model = nn.Linear(in_features=5, out_features=10, bias=True)

经过线性层,其实就是做了一件事,即: Y 3 × 10 = X 3 × 5 W 5 × 10 + b Y_{3\times 10}=X_{3\times 5}W_{5\times 10} + b Y3×10=X3×5W5×10+b

具体表示则为:
[ Y 00 Y 01 ⋯ Y 08 Y 09 Y 10 Y 11 ⋯ Y 18 Y 19 Y 20 Y 21 ⋯ Y 28 Y 29 ] = [ X 00 X 01 X 02 X 03 X 04 X 10 X 11 X 12 X 13 X 14 X 20 X 21 X 22 X 23 X 24 ] [ W 00 W 01 ⋯ W 08 W 09 W 10 W 11 ⋯ W 18 W 19 W 20 W 21 ⋯ W 28 W 29 W 30 W 31 ⋯ W 38 W 39 W 40 W 41 ⋯ W 48 W 49 ] + b \begin{bmatrix} Y_{00} & Y_{01} & \cdots & Y_{08} & Y_{09} \\ Y_{10} & Y_{11} & \cdots & Y_{18} & Y_{19} \\ Y_{20} & Y_{21} & \cdots & Y_{28} & Y_{29} \\ \end{bmatrix}=\begin{bmatrix} X_{00} & X_{01} & X_{02} & X_{03} & X_{04} \\ X_{10} & X_{11} & X_{12} & X_{13} & X_{14} \\ X_{20} & X_{21} & X_{22} & X_{23} & X_{24} \\ \end{bmatrix}\begin{bmatrix} W_{00} & W_{01} & \cdots & W_{08} & W_{09} \\ W_{10} & W_{11} & \cdots & W_{18} & W_{19} \\ W_{20} & W_{21} & \cdots & W_{28} & W_{29} \\ W_{30} & W_{31} & \cdots & W_{38} & W_{39} \\ W_{40} & W_{41} & \cdots & W_{48} & W_{49} \\ \end{bmatrix} + b Y00Y10Y20Y01Y11Y21Y08Y18Y28Y09Y19Y29 = X00X10X20X01X11X21X02X12X22X03X13X23X04X14X24 W00W10W20W30W40W01W11W21W31W41W08W18W28W38W48W09W19W29W39W49 +b

其中 X i ⋅ X_{i\cdot} Xi就表示第 i i i个样本, W ⋅ j W_{\cdot j} Wj 表示所有输入神经元到第 j j j个输出神经元的权重。

在这里插入图片描述

注意:这里图有点问题,应该是 W 00 , W 01 , W 02 , . . . , W 07 , W 08 , W 09 W_{00}, W_{01}, W_{02}, ..., W_{07}, W_{08}, W_{09} W00,W01,W02,...,W07,W08,W09

因为有三个样本,所以相当于依次进行了三次 Y 1 × 10 = X 1 × 5 W 5 × 10 Y_{1\times 10} = X_{1\times 5}W_{5\times 10} Y1×10=X1×5W5×10,然后再将三个 Y 1 × 10 Y_{1\times 10} Y1×10 叠在一起

经过线性层后,我们最终的到了 3 × 10 3 \times 10 3×10维的矩阵,即 输入3个样本,每个样本维度为5,输出为3个样本,将每个样本扩展成了10维

model(X).size()
torch.Size([3, 10])

参考资料

nn.Linear官方文档:https://pytorch.org/docs/stable/generated/torch.nn.Linear.html

  • 391
    点赞
  • 1164
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 34
    评论
nn.LinearPyTorch中的一个类,用于定义一个全连接层。它接受两个参数,输入特征数和输出特征数。通过调用该类的实例,可以创建一个全连接层模型。 引用\[1\]中的代码展示了如何使用nn.Linear创建一个全连接层模型。在这个例子中,输入特征数为1,输出特征数为2。模型的结构包括一个线性层和一个ReLU激活函数。 引用\[2\]中的代码展示了另一个例子,使用nn.Linear实现了一个全连接层。在这个例子中,输入特征数为5,输出特征数为3。 引用\[3\]中的代码演示了如何使用nn.Linear进行预测。在这个例子中,输入特征数为2,输出特征数为1。通过将输入样本传递给模型,可以得到一个输出结果。 总结来说,nn.LinearPyTorch中用于定义全连接层的类,可以根据需要设置输入特征数和输出特征数,然后使用该类创建一个全连接层模型。 #### 引用[.reference_title] - *1* *2* [Pytorch入门之一文看懂nn.Linear](https://blog.csdn.net/MR_kdcon/article/details/108918272)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [Pytorch nn.Linear基本用法原理详解](https://blog.csdn.net/zhaohongfei_358/article/details/122797190)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 34
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

iioSnail

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值