线性层就是全连接层,以一个输入特征数为2,输出特征数为3的线性层为例,其网络结构如下图所示:
输入输出数据的关系如下:
写成矩阵的形式就是:
下面通过代码进行验证:
import torch.nn as nn
linear_layer = nn.Linear(2,3)
print('weight shape',linear_layer.weight.shape,'bias shape',linear_layer.bias.shape)
linear_layer.weight.data = torch.tensor([[1.,1.],[2.,2.],[3.,3.]])
linear_layer.bias.data = torch.tensor([1.,2.,3.])
x=torch.tensor([[1.,2.]]) # 输入张量应该是浮点数,否则报错
y=linear_layer(x)
print(y)
输出结果:
与期望的结果相符
torch.nn中的Linear类包含的变量weight就是上面定义的权重矩阵A,包含的变量bias是一个一维的张量。
线性层输入输出关系的矩阵形式中之所以将输入数据和输出数据写成行向量的形式,是因为Linear层可以自动处理多条输入数据的情况。如果输入的张量是一个二维张量,有N行,每一行代表一条数据,不同列代表一条数据的不同特征,那么Linear层会自动将每一条数据分别作为全连接层的输入,得到N条输出数据,Linear的返回值是一个shape为(N,out_features)的张量。例如:
x2=torch.tensor([[1.,2],[2,4]])
y2=linear_layer(x2)
print(y2)
这里有两条输入数据(1,2)和(2,4),输出数据也是两条。输出结果如下: