ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2021-03-27 17:29:28  阅读:341  来源: 互联网

标签:10 torch epoch cifar pytorch cuda time device GPU


一,开始之前(不使用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函数库
在这里插入图片描述
关于cifar-10数据集的介绍已经很多了,下载好的cifar-10不需要更改。文件层次如下,‘data’和py文件在同一层即可
在这里插入图片描述

二,调参

#需要修改的参数在这里!!!!!!!!!!!!!!
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

三,代码分析


在这里插入图片描述

四,输出结果

Accuracy of the network on the 10000 test images: 84.920 %
在这里插入图片描述
在这里插入图片描述
输出结果图像会被自动保存,不过准确率需要手动记录一下

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

标签:10,torch,epoch,cifar,pytorch,cuda,time,device,GPU
来源: https://blog.csdn.net/weixin_45854456/article/details/115266449

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有