文章图片
一、模型创建步骤
文章图片
二、构建模型两要素
文章图片
三、torch.nn模块
文章图片
nn.Module
? parameters : 存储管理nn.Parameter类
? modules : 存储管理nn.Module类
? buffers:存储管理缓冲属性,如BN层中的running_mean
? ***_hooks:存储管理钩子函数
self._parameters = OrderedDict()
self._buffers = OrderedDict()
self._backward_hooks = OrderedDict()
self._forward_hooks = OrderedDict()
self._forward_pre_hooks = OrderedDict()
self._state_dict_hooks = OrderedDict()
self._load_state_dict_pre_hooks = OrderedDict()
self._modules = OrderedDict()
例:
class Model(nn.Module):
def __init__(self):
super().__init__()
self.conv1 = nn.Conv2d(1, 20, 5)
self.conv2 = nn.Conv2d(20, 20, 5)def forward(self, x):
x = F.relu(self.conv1(x))
return F.relu(self.conv2(x))
四、模型容器——Containers
文章图片
4.1 nn.Sequential
nn.Sequential 是 nn.module的容器,用于按顺序包装一组网络层
? 顺序性:各网络层之间严格按照顺序构建
? 自带forward():自带的forward里,通过for循环依次执行前向传播运算
# Using Sequential to create a small model. When `model` is run,
# input will first be passed to `Conv2d(1,20,5)`. The output of
# `Conv2d(1,20,5)` will be used as the input to the first
# `ReLU`;
the output of the first `ReLU` will become the input
# for `Conv2d(20,64,5)`. Finally, the output of
# `Conv2d(20,64,5)` will be used as input to the second `ReLU`
model = nn.Sequential(
nn.Conv2d(1,20,5),
nn.ReLU(),
nn.Conv2d(20,64,5),
nn.ReLU()
)# Using Sequential with OrderedDict. This is functionally the
# same as the above code
model = nn.Sequential(OrderedDict([
('conv1', nn.Conv2d(1,20,5)),
('relu1', nn.ReLU()),
('conv2', nn.Conv2d(20,64,5)),
('relu2', nn.ReLU())
]))
4.2 nn.ModuleList
nn.ModuleList是 nn.module的容器,用于包装一组网络层,以迭代方式调用网络层主要方法:
? append():在ModuleList后面添加网络层
? extend():拼接两个ModuleList
? insert():指定在ModuleList中位置插入网络层
class MyModule(nn.Module):
def __init__(self):
super(MyModule, self).__init__()
self.linears = nn.ModuleList([nn.Linear(10, 10) for i in range(10)])def forward(self, x):
# ModuleList can act as an iterable, or be indexed using ints
for i, l in enumerate(self.linears):
x = self.linears[i // 2](x) + l(x)
return x
4.3 nn.ModuleDict
【Pytorch教程|Pytorch教程[04]torch.nn---Containers】nn.ModuleDict是 nn.module的容器,用于包装一组网络层,以索引方式调用网络层主要方法:
? clear():清空ModuleDict
? items():返回可迭代的键值对(key-value pairs)
? keys():返回字典的键(key)
? values():返回字典的值(value)
? pop():返回一对键值,并从字典中删除
class MyModule(nn.Module):
def __init__(self):
super(MyModule, self).__init__()
self.choices = nn.ModuleDict({
'conv': nn.Conv2d(10, 10, 3),
'pool': nn.MaxPool2d(3)
})
self.activations = nn.ModuleDict([
['lrelu', nn.LeakyReLU()],
['prelu', nn.PReLU()]
])def forward(self, x, choice, act):
x = self.choices[choice](x)
x = self.activations[act](x)
return x
4.4 容器总结
- nn.Sequential:顺序性,各网络层之间严格按顺序执行,常用于block构建
- nn.ModuleList:迭代性,常用于大量重复网构建,通过for循环实现重复构建
- nn.ModuleDict:索引性,常用于可选择的网络层
推荐阅读
- Pytorch教程|Pytorch教程[02]DataLoader与Dataset
- DEEP|什么是端到端神经网络()
- 问答系统|简单问答系统实现原理 - 基于机器学习的
- 深度学习|【深度学习】经典网络-VGG复现(使用Tensorflow实现)
- python|整理了 47 个 Python 人工智能库
- 图灵奖得主Yann LeCun走进百度,与世界研究工作者展开交流
- 建设领先的AI原生云,百度智能云落地新一代高性能AI计算集群
- 报名啦!中小企业如何借力AI逆势突围(飞桨中国行定档3月23日!)
- 百度连续四年亮相全球量子信息处理顶会QIP 宣布量子战略规划升级