Pytorch-ResNet50-MINIST Classify 网络实现流程

分两个文件讲解:1、train.py训练文件     2、test.py测试文件.

1、train.py训练文件

1)从主函数入口开始,设置相关参数

# 主函数入口
if __name__ == '__main__':
    # ----------------------------#
    #   是否使用Cuda
    #   没有GPU可以设置成Fasle
    # ----------------------------#
    cuda = True
    # ----------------------------#
    #   是否使用预训练模型
    # ----------------------------#
    pre_train = True
    # ----------------------------#
    #   是否使用余弦退火学习率
    # ----------------------------#
    CosineLR = True
    # ----------------------------#
    #   超参数设置
    #   lr:学习率
    #   Batch_size:batchsize大小
    # ----------------------------#
    lr = 1e-3
    Batch_size = 2
    Init_Epoch = 0
    Fin_Epoch = 100

 2)创建模型

# 创建模型
model = ResNet(Bottleneck, [3, 4, 6, 3], num_classes=10)

#判断是否需要预训练模型,在1)已经设置pre_train=True,这里会加载预训练模型,
#为"logs/resnet50-mnist.pth"。
#这里加载的是预训练模型的权重参数,实例化到本地模型ResNet上
if pre_train:
    model_path = 'logs/resnet50-mnist.pth'
    model.load_state_dict(torch.load(model_path))

#判断cuda是否可用,如果cuda可用,模型将调用GPU,否则将调用CPU
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
model = model.to(device)

3)创建数据集

# ----------------------------#
root='data/' :路径
train=True   :训练设置为True
transform=transforms.ToTensor() :转化成Tensor
download=True :下载
# ----------------------------#
train_dataset = datasets.MNIST(root='data/', train=True,
                               transform=transforms.ToTensor(), download=True)
#这里train = False, download=False,此时下载验证集
test_dataset = datasets.MNIST(root='data/', train=False,
                              transform=transforms.ToTensor(), download=False)

4)加载数据集

# ----------------------------#
#DataLoader加载数据集
batch_size=Batch_size 批量输入
shuffle=True 打乱数据
num_workers=0 单个工作进程
# ----------------------------#
gen = DataLoader(dataset=train_dataset, batch_size=Batch_size, shuffle=True, num_workers=0)
gen_test = DataLoader(dataset=test_dataset, batch_size=Batch_size // 2, shuffle=True, num_workers=0)

5)设置损失函数和优化器

#损失函数为交叉熵损失
softmax_loss = torch.nn.CrossEntropyLoss()
#优化器选择Adams
optimizer = torch.optim.Adam(model.parameters(), lr)

6)设置学习率

#如果CosineLR = True,学习率为CosineAnnealingLR,否则为StepLR
if CosineLR:
    lr_scheduler = torch.optim.lr_scheduler.CosineAnnealingLR(optimizer, T_max=5, eta_min=1e-10)
else:
    lr_scheduler = torch.optim.lr_scheduler.StepLR(optimizer, step_size=1, gamma=0.92)

7)训练

# ----------------------------#
epoch_size 训练集一次加载多少个batch
epoch_size_val 验证集一次加载多少个batch
# ----------------------------#
epoch_size = len(gen) 
epoch_size_val = len(gen_test)

# ----------------------------#
Init_Epoch 起始训练为0
Fin_Epoch  终止训练为100次
fit_one_epoch()函数进行训练数据
lr_scheduler.step()一次训练结束后,学习率进行更新
# ----------------------------#
for epoch in range(Init_Epoch, Fin_Epoch):
    fit_one_epoch(net=model, softmaxloss=softmax_loss, epoch=epoch, epoch_size=epoch_size,epoch_size_val=epoch_size_val, gen=gen, gen_test=gen_test, Epoch=Fin_Epoch, cuda=cuda)
    lr_scheduler.step()

2、test.py测试文件

展示运行结果

Pytorch-ResNet50-MINIST Classify 网络实现流程_第1张图片

1)整段讲解

 

import torch
from nets.resnet50 import ResNet,Bottleneck
import os
from torchvision import datasets, transforms
from torch.utils.data import DataLoader
from torch.autograd import Variable
import torchvision
import cv2
import time

# 设置权重文件路径
PATH = './logs/resnet50-mnist.pth'
# 谁知手动输入单次识别字数
Batch_Size = int(input('每次预测手写字体图片个数:'))
# 加载模型
model = ResNet(Bottleneck, [3, 4, 6, 3], num_classes=10)
model.load_state_dict(torch.load(PATH))
model = model.cuda()

# 进入测试程序
model.eval()
# 设置测试数据集并加载
test_dataset = datasets.MNIST(root='data/', train=False,
                                    transform=transforms.ToTensor(), download=False)
gen_test = DataLoader(dataset=test_dataset, batch_size=Batch_Size, shuffle=True)

# 进入循环
while True:
    # 获取图片和标签
    images, lables = next(iter(gen_test))
    img = torchvision.utils.make_grid(images, nrow=Batch_Size)
    img_array = img.numpy().transpose(1, 2, 0)
    # 获取开始时间
    start_time = time.time()
    
    # 输出预测结果
    outputs = model(images.cuda())
    _, id = torch.max(outputs.data, 1)
    end_time = time.time()
    
    # 打印用时和预测结果,由于输出的id为tensor,这里必须转换为numpy
    print('预测用时:', end_time-start_time)
    print('预测结果为', id.data.cpu().numpy())
    # 展示图片
    cv2.imshow('img', img_array)
    cv2.waitKey(0)

 

你可能感兴趣的:(pytorch,人工智能,python)