ResNet有不同的网络层数,比较常用的是18-layer,34-layer,50-layer,101-layer,152-layer。他们都是由上述的残差模块堆叠在一起实现的。 下图展示了不同的ResNet模型。
本次使用ResNet18实现图像分类,模型使用pytorch集成的模型。
具体的实现方式可以查考这篇文章。里面说的很详细了。但是我们在实战项目中能用官方的还是优先选用官方的,有预训练模型,而且有的模型还做了优化。
手撕ResNet——复现ResNet(Pytorch)_AI浩-优快云博客
导入项目使用的库
========
import torch.optim as optim
import torch
import torch.nn as nn
import torch.nn.parallel
import torch.optim
import torch.utils.data
import torch.utils.data.distributed
import torchvision.transforms as transforms
import torchvision.datasets as datasets
import torchvision.models
from effnetv2 import effnetv2_s
from torch.autograd import Variable
设置全局参数
======
设置BatchSize、学习率和epochs,判断是否有cuda环境,如果没有设置为cpu。
设置全局参数
modellr = 1e-4
BATCH_SIZE = 64
EPOCHS = 20
DEVICE = torch.device(‘cuda’ if torch.cuda.is_available() else ‘cpu’)
图像预处理
=====
在做图像与处理时,train数据集的transform和验证集的transform分开做,train的图像处理出了resize和归一化之外,还可以设置图像的增强,比如旋转、随机擦除等一系列的操作,验证集则不需要做图像增强,另外不要盲目的做增强,不合理的增强手段很可能会带来负作用,甚至出现Loss不收敛的情况。
数据预处理
transform = transforms.Compose([
transforms.Resize((224, 224)),
transforms.ToTensor(),
transforms.Normalize([0.5, 0.5, 0.5], [0.5, 0.5, 0.5])
])
transform_test = transforms.Compose([
transforms.Resize((224, 224)),
transforms.ToTensor(),
transforms.Normalize([0.5, 0.5, 0.5], [0.5, 0.5, 0.5])
])
读取数据
=====
使用Pytorch的默认方式读取数据。数据的目录如下图:
训练集,取了猫狗大战数据集中,猫狗图像各一万张,剩余的放到验证集中。
读取数据
dataset_train = datasets.ImageFolder(‘data/train’, transform)
print(dataset_train.imgs)
对应文件夹的label
print(dataset_train.class_to_idx)
dataset_test = datasets.ImageFolder(‘data/val’, transform_test)
对应文件夹的label
print(dataset_test.class_to_idx)
导入数据
train_loader = torch.utils.data.DataLoader(dataset_train, batch_size=BATCH_SIZE, shuffle=True)
test_loader = torch.utils.data.DataLoader(dataset_test, batch_size=