对 原 始 图 片 进 行 了 数 据 增 强 : 随 机 截 取 , 亮 度 与 色 温 的 改 变 对原始图片进行了数据增强:随机截取,亮度与色温的改变 对原始图片进行了数据增强:随机截取,亮度与色温的改变
nn.Sequential
A sequential container. Modules will be added to it in the order they are passed in the constructor. Alternatively, an ordered dict of modules can also be passed in.
一个有序的容器,神经网络模块将按照在传入构造器的顺序依次被添加到计算图中执行,同时以神经网络模块为元素的有序字典也可以作为传入参数;代码链接。
import torch
from torch import nn
# Module 类是 nn 模块⾥提供的⼀个模型构造类,是所有神经⽹络模块的基类,继承它来定义我们想要的模型。需要重写Module 类的 __init__ 函数和 forward 函数。它们分别⽤于创建模型参数和定义前向计算。
class CenteredLayer(nn.Module):
def __init__(self, **kwargs):
super(CenteredLayer, self).__init__(**kwargs)
def forward(self, x):
return x - x.mean()
# 测试一下
layer = CenteredLayer()
layer(torch.tensor([1, 2, 3, 4, 5], dtype=torch.float))
# 放入到nn.Sequential中
net = nn.Sequential(nn.Linear(8, 128), CenteredLayer())
y = net(torch.rand(4, 8))
y.mean().item()
class FancyMLP(nn.Module):
def __init__(self, **kwargs):
super(FancyMLP, self).__init__(**kwargs)
self.rand_weight = torch.rand((20, 20),requires_grad=False) # 不可训练参数(常数参数)
self.linear = nn.Linear(20, 20)
def forward(self, x):
x = self.linear(x)
# 使⽤创建的常数参数,以及nn.functional中的relu函数和mm函数
x = nn.functional.relu(torch.mm(x, self.rand_weight.data) + 1)
# 复⽤全连接层。等价于两个全连接层共享参数
x = self.linear(x)
# 控制流,这⾥我们需要调⽤item函数来返回标量进⾏⽐较
while x.norm().item() > 1:
x /= 2
if x.norm().item() < 0.8:
x *= 10
return x.sum()
class NestMLP(nn.Module):
def __init__(self, **kwargs):
super(NestMLP, self).__init__(**kwargs)
self.net = nn.Sequential(nn.Linear(40, 30), nn.ReLU())
def forward(self, x):
return self.net(x)
net = nn.Sequential(NestMLP(), nn.Linear(30, 20), FancyMLP())
如果模型中有需要学习的参数:
class MyDense(nn.Module):
def __init__(self):
# 在自己的模块中添加可学习的参数,供训练学习使用
super(MyDense, self).__init__()
self.params = nn.ParameterList([nn.Parameter(torch.randn(4,4)) for i in range(3)])
# nn.Parameter(torch.randn(4,4)): Parameter 类其实是 Tensor 的⼦类,如果⼀个 Tensor 是 Parameter ,那么它会⾃动被添加到模型的参数列表⾥
# ParameterList 接收⼀个 Parameter 实例的列表作为输⼊然后得到⼀个参数列表,使⽤的时候可以⽤索引来访问某个参数
self.params.append(nn.Parameter(torch.randn(4, 1))) # 可以使⽤ append 和 extend 在列表后⾯新增参数
def forward(self, x):
for i in range(len(self.params)):
x = torch.mm(x, self.params[i])
return x
net = MyDense()
print(net)
模型参数访问
提示:
注:多个模型嵌套的情况下,函数中传播的部分写到了初始化中,可能正向传播没有问题,但是,无法获取参数列表进行反向传播。
TypeError: cannot assign ‘torch.FloatTensor’ object to parameter ‘0’ (torch.nn.Parameter or None required)
nn.Sequential(layers)中的用法及错误TypeError: list is not a Module subclass
ValueError:optimizer got an empty parameter list,参数空传
提示:
如果在forward 中传入或new数据,需要考虑和网络在同一个device。
make layer是对每一层的层自定义创建:构造对象数组layers,然后调用nn.Sequential(*layers)