残差神经网络
残差神经网络产生的原因:为了更好的神经网络效果,研究人员想到了深层神经网络,即在浅层神经网络的基础上加更多的神经网络层,但是因为过拟合等的原因深层网络可能准确率还不如浅层网络,尽管误差值差不多,所以研究人员想到了添加恒等映射网络层,即数据在通过该层时输入和输出一样,这样结果再差也不会差过浅层网络。
然而激活函数很难拟合y=x这个函数,所以研究人员想到了将单元的输入直接与单元输出加在一起,然后再激活,即残差单元可以以跳层连接的形式实现。那么期望的输出:H(x)=F(x)+x,F(x)就是输入x经过残差模块计算的结果。
例子
import torch
import torch.nn as nn
import torch.utils.data as Data
import torchvision
import torchvision.transforms as transforms
# 判断是否启用GPU计算
device = torch.device('cuda:0' if torch.cuda.is_available() else 'cpu')
# 超参数
EPOCHS = 80 # 批处理的次数
BATCH_SIZE = 100 # 批处理时,每次提取的数据个数
LR = 0.001 # 学习效率
# 图像预处理
transform = transforms.Compose([
transforms.Pad(4), # 图片的边界以0填充
transforms.RandomHorizontalFlip(), # 随机水平翻转,概率为0.5
transforms.RandomCrop(32), # 给定大小的图片的随机剪辑
transforms.ToTensor() # 转化数据类型为tensor
])
# 训练集、测试集加载
train_data = torchvision.datasets.MNIST(
root='./mnist',
train=True,
transform=transform,
download=False
)
train_loader = Data.DataLoader(dataset=train_data, BATCH_SIZE=BATCH_SIZE, shuffle=True)
test_data = torchvision.datasets.MNIST(root='./mnist/', train=False, transform=transform)
test_loader = Data.DataLoader(dataset=test_data, BATCH_SIZE=BATCH_SIZE, shuffle=True)
# 残差模块的定义
class Residual_Block(nn.Module):
def __init__(self, i_channel, o_channel, stride=1, down_sample=None):