torch.nn.Linear就是神经网络中的线性层,可以实现形如y=X*weight^T+b的功能。
代码很简单(见后图),但有许多细节需要声明:
1)nn.Linear是一个类(继承自nn.Module),使用时需要先实例化;
2)实例化时,nn.Linear需要输入两个参数,in_features为上一层神经元的个数(输入),out_features为这一层的神经元个数(输出);
3)不需要人为定义w和b,内部自动定义。(可以调用属性weight和bias来查看生成的w和b。其中w是必然会生成的,b可指定是否生成。默认 bias = True。如果我们不希望拟合训练b,实例化时将bias设置为False即可。)
4)由于w和b是随机生成的,所以同样的代码多次重复运行的结果是不一样的。如果希望每次相同,则可以使用torch中的random类。如:torch.random.manual_seed(420) ,人为设置随机数种子。
5)由于不需要定义常量b,因此在特征张量中,不需要留出与常数项相乘的那一列,只需要输入特征张量。
6)输入层只有一层,并且输入层的结构(神经元的个数)由输入的特征张量X决定,因此在PyTorch中构筑神经网络时,不需要定义输入层。
7)实例化之后,将特征张量输入到实例化后的对象中。
举例:
import torch
my_linear = nn.Linear(2, 3) # in_features,out_features
print(my_linear.weight) # 查看初始权重
print(my_linear.bias) # 查看初始偏置项
# 输出:
Parameter containing:
tensor([[ 0.3783, 0.1461],
[ 0.2027, -0.4043],
[ 0.1937, 0.2775]], requires_grad=True)
Parameter containing:
tensor([ 0.0334, 0.4122, -0.6125], requires_grad=True)
input_data = torch.randn(10, 2) # 生成输入数据(data_number,in_features)
output_data = my_linear(input_data) # 利用模型对输入数据进行处理
print(output_data) # 查看输出结果
print(output_data.size()) # 查看输入数据的size,(data_number,out_features)
# 输出:
tensor([[ 0.2690, -0.1473, -0.2038],
[ 0.6059, 1.3554, -0.5868],
[ 0.2602, 0.2520, -0.3781],
[-0.3441, 0.5592, -0.9525],
[-0.4214, 0.8922, -1.1494],
[-0.4387, 0.5287, -1.0094],
[-0.3729, 0.7819, -1.0672],
[ 0.3403, 1.0366, -0.6486],
[ 0.2101, 0.3200, -0.4435],
[-0.6475, 0.9181, -1.3268]], grad_fn=<AddmmBackward0>)
torch.Size([10, 3])
参考:
忘记参考哪个网页了,但肯定是参考的。见到可提醒我!谢谢