1.什么时候调用forward()函数
因为Module类是nn模块里提供的一个模型构造类,是所有神经网络模块的基类,我们可以继承它来定义我们想要的模型。
import torch
from torch import nn
class MLP(nn.Module):
# 声明带有模型参数的层,这里声明了两个全连接层
def __init__(self, **kwargs):
# 调用MLP父类Module的构造函数来进行必要的初始化。这样在构造实例时还可以指定其他函数
super(MLP, self).__init__(**kwargs)
self.hidden = nn.Linear(784, 256) # 隐藏层
self.act = nn.ReLU()
self.output = nn.Linear(256, 10) # 输出层
# 定义模型的前向计算,即如何根据输入x计算返回所需要的模型输出
def forward(self, x):
a = self.act(self.hidden(x))
return self.output(a)
X = torch.rand(2, 784)
net = MLP()
print(net)
net(X)
为什么会调用forward()呢,是因为Module中定义了__call__()函数,该函数调用了forward()函数,当执行net(x)的时候,会自动调用__call__()函数。也就是说只要进入了Module就会自动执行forward()函数。
2.图片预处理
import transforms as T
trans = [T.RandomResize(min_size, max_size)]# 将图片随机缩放
if hflip_prob > 0: #hflip_prob 随机水平翻转的概率
trans.append(T.RandomHorizontalFlip(hflip_prob))# 随机翻转,添加新的对象到列表末尾
trans.extend([#在已存在的列表中添加新的列表内容
T.RandomCrop(crop_size),# 随机裁剪
T.ToTensor(),
T.Normalize(mean=mean, std=std),#标准化处理:减均值,除以标准差
])
self.transforms = T.Compose(trans)#将多种变换组合在一起,即将多种预处理方法打包到transforms中
- 在return中的if…else…语句
def get_transform(train):#train为true的话
base_size = 520
crop_size = 480
# 如果train为True的话,返回SegmentationPresetTrain(base_size, crop_size),否则返回SegmentationPresetEval(base_size)
return SegmentationPresetTrain(base_size, crop_size) if train else SegmentationPresetEval(base_size)#后者是验证集的图片大小
4.torchvision.transforms.functional 中与图像预处理相关的函数
from torchvision.transforms import functional as F
image = F.resize(image, size) # 将图像的最小边长缩放到size大小
img = F.pad(img, (0, 0, padw, padh), fill=fill)#(0, 0, padw, padh)分别表示左、上、右、下的填充宽度;