Pytorch
一、训练模型
1.导入资源包
import torch.optim as optim: 导入PyTorch的优化工具包,其中包括了各种优化算法,如SGD、Adam等。
import torchvision.transforms as transforms: 导入PyTorch的视觉变换工具包,用于对图像进行预处理和变换,如调整大小、裁剪、归一化等。
from torchvision import models: 从torchvision模块中导入预训练的模型,如ResNet、AlexNet、VGG等。
from sched import scheduler
import torch.optim as optim
import torch
import torch.nn as nn
import torch.utils.data
import torchvision.transforms as transforms
import torchvision.datasets as datasets
from torch.utils.data import DataLoader
import torch.optim.lr_scheduler as lr_scheduler
import os
from torchvision import models
2.定义数据预处理
这些预处理操作的目的是为了增强模型的泛化能力,并确保模型在训练和验证时输入数据的格式一致。通过这些操作,模型能够接受不同尺寸、角度和方向的图像,从而提高其在实际应用中的表现。同时,归一化处理有助于稳定训练过程,加速模型收敛。,这些预处理操作的目的是为了增强模型的泛化能力,并确保模型在训练和验证时输入数据的格式一致。通过这些操作,模型能够接受不同尺寸、角度和方向的图像,从而提高其在实际应用中的表现。同时,归一化处理有助于稳定训练过程,加速模型收敛。
# 定义数据预处理
transform = {
'train': transforms.Compose([
transforms.RandomResizedCrop(size=256, scale=(0.8, 1.0)),
transforms.RandomRotation(degrees=15),
transforms.RandomHorizontalFlip(),
transforms.CenterCrop(size=224),
transforms.ToTensor(),
transforms.Normalize([0.485, 0.456, 0.406],
[0.229, 0.224, 0.225])
]),
'val': transforms.Compose([
transforms.Resize(size=256),
transforms.CenterCrop(size=224),
transforms.ToTensor(),
transforms.Normalize([0.485, 0.456, 0.406],
[0.229, 0.224, 0.225])
])
}
3.读取数据
# 读取数据
dataset = './dataset'
train_directory = os.path.join(dataset, 'train')
valid_directory = os.path.join(dataset, 'val')
batch_size = 32
num_classes = 2 # 修改为您的分类数
data = {
'train': datasets.ImageFolder(root=train_directory, transform=transform['train']),
'val': datasets.ImageFolder(root=valid_directory, transform=transform['val'])
}
train_loader = DataLoader(data['train'], batch_size=batch_size, shuffle=True, num_workers=8)
test_loader = DataLoader(data['val'], batch_size=batch_size, shuffle=False, num_workers=8)
注:这段代码的主要目的是读取和准备图像数据集,以便用于训练和验证深度学习模型,这段代码设置了数据加载器,它们将在训练和验证过程中提供经过预处理的图像数据。这些数据加载器是PyTorch中用于批量加载数据并使其易于迭代的重要工具。
二、定义卷积神经网络
1.导入必要的库
from torch.autograd import Variable: 从torch.autograd模块中导入Variable类。Variable是PyTorch中自动微分的关键类,它封装了张量,并提供了自动计算梯度等功能。然而,从PyTorch 0.4版本开始,Variable已经被整合到torch.Tensor中,因此不再需要显式地从torch.autograd中导入Variable。在最新的PyTorch版本中,直接使用torch.Tensor即可,它继承了Variable的所有功能。
# 神经网络
import torch
import torch.nn as nn
from torch.autograd import Variable
2.定义名为convolutional_block的卷积块类
这个convolutional_block类定义了一个卷积块,它将输入张量通过两个并行路径(step1和step2),然后将它们的结果相加,并应用ReLU激活函数。这种结构通常用于残差网络(ResNet)中,有助于解决深度网络训练过程中的梯度消失问题。
class convolutional_block(nn.Module):#convolutional_block层
def __init__(self,cn_input,cn_middle,cn_output,s=2):
super(convolutional_block,self).__init__()
self.step1=nn.Sequential(nn.Conv2d(cn_input,cn_middle,(1,1),(s,s),padding=0,bias=False),nn.BatchNorm2d(cn_middle,affine=False),nn.ReLU(inplace=True),
nn.Conv2d(cn_middle,cn_middle,(3,3),(1,1),padding=