超级详细的torch.nn.Linear()函数讲解
2.out_feature:该参数代表输出的最后一维的通道个数,就二维来说通俗来说就是Y矩阵的列数,因为Y是输出的参数,而Y维度为2,其最后一维就是列,所以out_feature在二维中就是矩阵Y的列数。1.in_fetaure:该参数代表输入的最后一维的通道个数,就二维来说通俗来说就是X矩阵的列数,因为X是输入的参数,而X维度为2,其最后一维就是列,所以in_feature在二维中就是矩阵X的列
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.欢迎讨论
如果以上内容有些错误和不对的地方,欢迎大家及时指正!
更多推荐
所有评论(0)