torch.nn是专门为神经网络设计的模块化接口。nn构建于 Autograd之上,可用来定义和运行神经网络。
nn.functional,这个包中包含了神经网络中使用的一些常用函数,这些函数的特点是,不具有可学习的参数(如ReLU,pool,DropOut等),这些函数可以放在构造函数中,也可以不放,但是这里建议不放。
定义一个网络
PyTorch中已经为我们准备好了现成的网络模型,只要继承nn.Module
,并实现它的forward
方法,PyTorch会根据autograd
,自动实现backward
函数。
import torch
import torch.nn as nn
import torch.nn.functional as F
class MLP(nn.Module):
def __init__(self, user_num, user_dim, layers=[32, 16, 8]):
super(MLP, self).__init__() # 子类函数必须在构造函数中执行父类构造函数
self.user_Embedding = nn.Embedding(user_num, user_dim)
self.mlp = nn.Sequential()
for id in range(1, len(layers)): # 这样可以实现MLP层数和每层神经单元数的自动调整
self.mlp.add_module("Linear_layer_%d" % id, nn.Linear(layers[id - 1], layers[id]))
self.mlp.add_module("Relu_layer_%d" % id, nn.ReLU(inplace=True))
self.predict = nn.Sequential(
nn.Linear(layers[-1], 1),
nn.Sigmoid(),
)
def forward(self, x):
user = self.user_Embedding(x)
user = self.mlp(user)
score = self.predict(user)
return score
model = MLP(1000, 64)
print(model)
MLP(
(user_Embedding): Embedding(1000, 64)
(mlp): Sequential(
(Linear_layer_1): Linear(in_features=32, out_features=16, bias=True)
(Relu_layer_1): ReLU(inplace=True)
(Linear_layer_2): Linear(in_features=16, out_features=8, bias=True)
(Relu_layer_2): ReLU(inplace=True)
)
(predict): Sequential(
(0): Linear(in_features=8, out_features=1, bias=True)
(1): Sigmoid()
)
)
for parameters in model.parameters():
print(parameters)
Parameter containing:
tensor([[ 0.4192, -1.0525, 1.4208, 0.5376, 2.1371, 0.7074, 0.1017, 0.9701, 1.2824, -0.0436],
[-0.6374, 0.0153, -0.1862, -0.6061, 0.5522, -1.1526, 0.3913, 0.3103,
-0.1055, 0.6098],
[-0.0367, -0.9573, -0.5106, -1.2440, 1.2201, -0.5424, 0.2045, 0.2208,
-0.7557, -0.7811],
[ 0.5457, 0.3586, 0.9871, -0.2117, 1.0885, 1.7162, -0.2125, 0.2652,
-0.3262, 0.3047],
[ 0.1039, 0.8132, 0.6638, 0.2618, 0.8552, 0.8300, 0.2349, 1.8830,
-0.5149, -1.0468]], requires_grad=True)
Parameter containing:
tensor([[-0.2395, 0.1461, -0.0161, 0.0267, -0.0353, 0.2085, 0.0046, -0.1572],
[ 0.2267, 0.0129, -0.3296, -0.2270, 0.2268, 0.1771, -0.0992, 0.2148],
[ 0.1906, 0.1896, -0.2703, -0.3506, 0.0248, 0.1949, -0.3117, 0.0721],
[-0.3197, 0.2782, -0.1553, 0.2509, 0.0279, 0.2040, -0.1478, 0.2943]],
requires_grad=True)
Parameter containing:
tensor([ 0.0808, -0.3252, -0.0015, -0.0666], requires_grad=True)
Parameter containing:
tensor([[-0.3243, 0.4393, -0.2430, 0.4330]], requires_grad=True)
Parameter containing:
tensor([-0.0739], requires_grad=True)
for name,parameters in model.named_parameters():
print(name,':',parameters.size())
user_Embedding.weight : torch.Size([5, 10])
mlp.Linear_layer_1.weight : torch.Size([4, 8])
mlp.Linear_layer_1.bias : torch.Size([4])
predict.0.weight : torch.Size([1, 4])
predict.0.bias : torch.Size([1])