1.基本定义

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

2.参数解释

1.in_fetaure:该参数代表输入的最后一维的通道个数,就二维来说通俗来说就是X矩阵的列数,因为X是输入的参数,而X维度为2,其最后一维就是列,所以in_feature在二维中就是矩阵X的列数
   
2.out_feature:该参数代表输出的最后一维的通道个数,就二维来说通俗来说就是Y矩阵的列数,因为Y是输出的参数,而Y维度为2,其最后一维就是列,所以out_feature在二维中就是矩阵Y的列数
    
    
 3.bias:bias就是整个线性回归方程的偏置量,使用时有True和False两种选择

3.作用说明

1.作用概述

Lunear的作用就是对n行i列的Xn×i执行了一个线性变换

Yn×o=Xn×iWi×o+b

其中W是模型要学习的参数,W的维度为ixo,b是维度o的向量偏置

2.W具体讲解

1.为什么w的维度是ixo呢?

解答:这其实很简单,没问知道W的维度是由X和Y的维度来确立的,我们最终需要的Y的维度为nxo维,而X为nxi维,根据矩阵乘法W应该为ixp维

2.WT和W

我们知道nn.Linear的作用是进行线性变换,但是我们根据linear.weight得到的权重W和学习参数WT其实维度是相反的,这也就说明了为什么我们打印weight时维度对不上矩阵乘法规则的问题。这是因为最后我们和X矩阵相乘的时候是学习参数WT也就是权重W的转置矩阵,而不是权重W。下面放代码进行说明

Input 1:

import matplotlib.pyplot as plt
import numpy as np
import torch.nn
import torch
#用Linear函数进行一个4输入神经元和3输出神经元的线性变换
lp=torch.nn.Linear(4,3)
#定义data为一个3x4维的张量(即矩阵)
data=torch.Tensor([[1.0,2.0,3.0,5.0],[7.0,8.0,9.0,6.0],[4.0,5.0,6.0,7.0]])
#打印线性变换张量的weight
print(lp.weight)

Out 1:

Parameter containing:
tensor([[ 0.2862,  0.3804,  0.1989, -0.3871],
        [-0.0658,  0.3741,  0.4172,  0.1095],
        [ 0.0776,  0.4159,  0.4704,  0.2964]], requires_grad=True)

根据要求我们需要一个4x3维的张量(矩阵)但是这里输出的权重是3x4维的,但是经过逆置,这个矩阵就会变成4x3维,所以,在回归方程中,和X矩阵相乘的应该是WT(权重W的转置矩阵)

4.代码运用

接下来我们对张量data(X)进行操作

Input 2:

import matplotlib.pyplot as plt
import numpy as np
import torch.nn
import torch
lp=torch.nn.Linear(4,3)
data=torch.Tensor([[1.0,2.0,3.0,5.0],[7.0,8.0,9.0,6.0],[4.0,5.0,6.0,7.0]])
​
out1=lp(data)
print(out1)

Out 2:

tensor([[-1.8888,  1.9536,  1.7542],
        [-5.3779,  2.6296,  0.8059],
        [-3.8249,  2.6632,  1.9876]], grad_fn=<AddmmBackward0>)

根据以上的data(即回归方程中的X)张量和in_feature和out_feature的定义可以知道,最后得到的结果Y矩阵应该是3x3维的,刚好符合要求,可以通过手工验证一下

以下进行代码验证

Input 3:

import matplotlib.pyplot as plt
import numpy as np
import torch.nn
import torch
x = torch.randn(128, 20)  # 输入的维度是(128,20)
m = torch.nn.Linear(20, 30)  # 20,30是指维度
output = m(x)
print('m.weight.shape:\n ', m.weight.shape)
print('m.bias.shape:\n', m.bias.shape)
print('output.shape:\n', output.shape)
​

Out 3:

m.weight.shape:
  torch.Size([30, 20])
m.bias.shape:
 torch.Size([30])
output.shape:
 torch.Size([128, 30])
​

5.欢迎讨论

如果以上内容有些错误和不对的地方,欢迎大家及时指正!

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐