<记录>基于pytorch的cifar-10卷积神经网络(CNN)分类

一,开始之前(不使用GPU可以直接跳到第一步)

运行环境:win10+py3.7.8+pycharm
(可选部分:GPU环境:GTX 1660+cuda10.2+cudnn8.1.0)

cuda和cudnn简单的说就是两个用于机器学习的包,安装稍有点麻烦

训练模型过程中使用GPU加速是可选的,如:

device = torch.device("cuda" if torch.cuda.is_available() else "cpu")

使用CPU计算会占用过多CPU资源,使用GPU理论上可以大大减少训练时间(但由于过多的IO操作加速并不非常明显,不过可以大大减轻CPU的负担)

如何配置cuda和安装GPU版本的pytorch可以参考博客:pytorch-gpu版本安装

下面代码可以测试GPU加速是否成功

import torch
import time

print(torch.__version__)        # 返回pytorch的版本
print(torch.cuda.is_available())        # 当CUDA可用时返回True

a = torch.randn(10000, 10000)    # 返回10000行1000列的张量矩阵
b = torch.randn(10000, 20000)     # 返回1000行2000列的张量矩阵

t0 = time.time()        # 记录时间
c = torch.matmul(a, b)      # 矩阵乘法运算
t1 = time.time()        # 记录时间
print(a.device, t1 - t0, c.norm(2))     # c.norm(2)表示矩阵c的二范数

device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")      # 用GPU来运行
a = a.to(device)
b = b.to(device)

# 初次调用GPU,需要数据传送,因此比较慢
t0 = time.time()
c = torch.matmul(a, b)
t2 = time.time()
print(a.device, t2 - t0, c.norm(2))

# 这才是GPU处理数据的真实运行时间,当数据量越大,GPU的优势越明显
t0 = time.time()
c = torch.matmul(a, b)
t2 = time.time()
print(a.device, t2 - t0, c.norm(2))
print(torch.cuda.is_available())

输出结果如下:

D:\python\python37\python.exe D:/python/cnn1/2.py
1.8.1+cu102
True
cpu 6.84908390045166 tensor(1355508.1250)
cuda:0 0.33601856231689453 tensor(1414099.8750, device='cuda:0')
cuda:0 0.009666681289672852 tensor(1414099.8750, device='cuda:0')
True

进程已结束,退出代码为 0

可以看到计算矩阵乘积的时间大大缩短
6.84908390045166→0 0.33601856231689453→0 0.009666681289672852

一,数据集部分

CPU版可以直接在pycharm中下载pytorch函数库
<记录>基于pytorch的cifar-10卷积神经网络(CNN)分类
关于cifar-10数据集的介绍已经很多了,下载好的cifar-10不需要更改。文件层次如下,‘data’和py文件在同一层即可
<记录>基于pytorch的cifar-10卷积神经网络(CNN)分类

二,调参

#需要修改的参数在这里!!!!!!!!!!!!!!
learning_rate = 0.005
epoch_n = 20
Batch_size=20

1. 学习率l_r

简单地说,学习率是神经网络根据每一次迭代得到的代价函数对模型参数做出调整的程度
如果l_r过小会导致模型收敛很慢
如果l_r过大会导致过拟合和参数震荡,模型在最佳参数两边震荡但难以到达最佳参数
(参数震荡是我编的一个词,不是专业词汇/doge
最近在准备考研,想到了张宇讲的sin(1/x),x→0的图像 hhhhhh)

2. epoch
所有训练数据完整通过神经网络的迭代次数

3. batch_size
完整的训练数据有可能过大,我们不可能一次把它们放进神经网络,所以需要把训练数据分批次训练
每个批次的数据量大小就是一个batch-size
举个栗子:
训练过程中cifar10的5w张图片可以认为是混在一起的,每个epoch都要训练完5w张图片
如果batch_size=100,则一个epoch中又分为5w/100=500个“小epoch”
如果batch_size=50,则一个epoch中又分为5w/50=1000个“小epoch”

# 训练模型
for epoch in range(epoch_n):
    running_loss = 0.0  # 累积损失
    for i, data in enumerate(trainloader, 0):
    。。。。。。。。。以下部分省略。。。。。。。。

第一个for循环是epoch,第二个循环是小epoch,也就是batch_size

三,代码分析


<记录>基于pytorch的cifar-10卷积神经网络(CNN)分类

四,输出结果

Accuracy of the network on the 10000 test images: 84.920 %
<记录>基于pytorch的cifar-10卷积神经网络(CNN)分类
<记录>基于pytorch的cifar-10卷积神经网络(CNN)分类
输出结果图像会被自动保存,不过准确率需要手动记录一下

机器学习入门,如果有错的地方欢迎大佬指出
博主每天24小时高强度网上冲浪,看到评论随时回复!

上一篇:CIFAR-10数据集输出图片


下一篇:2021-03-20