一。层和块
1.多层感知机
import torch
from torch import nn
from torch.nn import functional as Fnet = nn.Sequential(nn.Linear(20, 256), nn.ReLU(), nn.Linear(256, 10)) # 定义网络
X = torch.rand(2, 20) # 2*20随机矩阵
print(net(X))
输出结果:
tensor([[ 0.0205, -0.0037, 0.0914, 0.1545, 0.1693, -0.1086, 0.0351, -0.1155,-0.0167, 0.0730],[-0.0184, -0.0351, 0.1344, 0.1300, 0.3674, -0.2407, 0.0150, 0.0474,-0.0537, 0.1941]], grad_fn=<AddmmBackward0>)
nn.Sequential构建模型,层的执行顺序是按照参数传递的。nn.Sequential是特殊的Module,维护了有序列表。
net(X)的调用过程:
实际调用的是net.__call__(X)
将列表的每一个块连接在一起,前一个块的输出是后一个快的输入。
2.自定义块包含一个多层感知机,其具有256个隐藏单元的隐藏层和一个10维输出层
实例化网络net = MLP()
net(X)的执行过程:
执行net.__call__(X)函数,在call函数里面调用forward函数
输出结果:
tensor([[-0.1729, -0.1916, 0.1419, 0.0144, -0.2258, -0.2547, 0.1492, 0.0843,-0.0807, 0.1584],[-0.1160, -0.0921, 0.2902, 0.0131, 0.0273, -0.1875, 0.0120, 0.0546,-0.0591, 0.1023]], grad_fn=<AddmmBackward0>)
3.自己编写Sequential函数:
net=MySequential(nn.Linear(20, 256), nn.ReLU(), nn.Linear(256, 10))
net(X)的执行过程:
①在初始化网络MySequential(nn.Linear(20, 256), nn.ReLU(), nn.Linear(256, 10))时通过构造方法把网络层通过循环添加到链表里
for idx, module in enumerate(args):
# 变量_modules中。_module的类型是OrderedDict
self._modules[str(idx)] = module
②net(X):
先调用call函数,然后call方法调用forward方法。
def forward(self, X):# OrderedDict保证了按照成员添加的顺序遍历它们for block in self._modules.values():X = block(X)return X
前一个层的输出作为后一个层的输入
4.在正向传播函数执行代码:
5.混合搭配使用