深度学习实战2-残差神经网络ResNet
文章目录
前言
ResNet将网络层训练为残差函数以克服退化问题。退化问题是当网络层数变得非常高时,深度神经网络的准确性会随着层数的增加而增加,然后饱和,最后会开始下降。
一、残差学习
如果H(x)是需要几层学习的映射,则训练的残差函数
F(x)=H(x)−x
相反的,原来的功能变成了F(x)+x
在参数化形式中,这可以写成
F(x,{Wi})+x
当特征图大小F(x,Wi)和x不同时,使用学习权重进行线性投影Ws
F(x,{Wi})+Ws·x
二、残差块
它包含两个3×3卷积层。
三、数据集预处理
代码如下(示例):
import torch
import torch.nn as nn
import torchvision
import torchvision.transforms as transforms
import numpy as np
import random
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
# 神经网络参数设置
num_epochs = 20 # 回合数
learning_rate = 0.001 # 学习率
transform_train = transforms.Compose([
transforms.RandomCrop(32, padding=4),
transforms.RandomHorizontalFlip(),
transforms.ToTensor(),
transforms.Normalize(mean=[0.507, 0.487, 0.441], std=[0.267, 0.256, 0.276]) # 图片有RGB三个输入通道
])
transform_test = transforms.Compose([
transforms.ToTensor(),
transforms.Normalize(mean=[0.507, 0.487, 0.441], std=[0.267, 0.256, 0.276])
])
# 使用CIFAR-10数据集
# 读取数据集
trainset = torchvision.datasets.CIFAR10(root='./data',
train=True,
download=True,
transform=transform_train)
# 迭代数据集,加batch
train_loader = torch.utils.data.DataLoader(
trainset, batch_size=200, shuffle=True, num_workers=0)
testset = torchvision.datasets.CIFAR10(root='./data',
train=False,
download=True,
transform=transform_test)
test_loader = torch.utils.data.DataLoader(
testset, batch_size=200, shuffle=False, num_workers=0)
四、定义残差块的一个子卷积层
代码如下(示例):
def conv3x3(in_channels, out_channels, stride=1):
return nn.Conv2d(
in_channels=in_channels, # 输入通道