原始代码的运行及结果截图
因为代码在colab上执行,所以要确保在运行时使用的是GPU
此处下载适合在colab上使用的训练集
分别加载训练集和测试集,并把图片进行分类,每五张图片一组,作为一个batchsize(这个batchsize可以在后续进行修改,以达到优化算法的目的)
下载训练模型
将网络的结构打印出来
开始第一次的训练,并保存模型
训练的准确率并不是很高,所以后续的优化空间很大
这是测试函数及过程
测试函数的成功率出奇的高,想来可能是跟特定的数据集有关
代码的改进
(1)前文讲过,将batchsize的值调高,可以理解为将每个分组的特征变得更加明显,训练起来也更加方便,可以提高识别的准确率
(2)改进优化的函数,将之前的SGD函数改为Adam函数,具体原理此处不做赘述
这是改进后训练过程中的准确率
这是改进后测试过程中的准确率
综上来说,两个过程的准确率都有了相当程度的提高,可以证明改进的方法是正确的
项目完整代码
import numpy as np
import matplotlib.pyplot as plt
import os
import torch
import torch.nn as nn
import torchvision
from torchvision import models,transforms,datasets
import time
import json
# 判断是否存在GPU设备
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
print('Using gpu: %s ' % torch.cuda.is_available())
! wget http://fenggao-image.stor.sinaapp.com/dogscats.zip
! unzip dogscats.zip
normalize = transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])
vgg_format = transforms.Compose([
transforms.CenterCrop(224),
transforms.ToTensor(),
normalize,
])
data_dir = './dogscats'
dsets = {
x: datasets.ImageFolder(os.path.join(data_dir, x), vgg_format)
for x in ['train', 'valid']}
dset_sizes = {
x: len(dsets[x]) for x in ['train',