手写数字识别 python pytorch 一 之训练

手写数字识别 python pytorch 一 之训练

下一篇:手写数字识别 python pytorch 二 之手写数字预测 https://editor.csdn.net/md/?articleId=107853422
在开始前已经默认你学会了,1 .python基础 2. 知道深度网络由那些层组成

下面的代码全部复制上可以直接运行的
如果报错,可以评论,看不懂可以评论,
**
反馈的评论修改如下:
为解决网盘老是和谐下面的链接我以把网盘资源上传到csdn上只要0积分就可以下载。系统自动给加的积分我可不是我。下面的链接可以用。
csdn下载链接点击下载
添加如下:
目录结构:
训练模型的目录结构如果图片消失在下载资源里可以找到:目录.png

慢慢人生路,相遇不易,感谢每一个点赞和评论

**
在pycharm中创建一个项目和py文件,名字随意,引入上篇文章建立的环境
上一篇:pytorch python=3.6环境安装
训练代码
先来看怎么书写训练的代码。
引入包

import torch
from torchvision import datasets,transforms
from torch.autograd import Variable
import numpy as np
import cv2
import datetime

没有这个包?看下面。
如果引入报错,
在该环境下base上运行(运行这个):
Anaconda Prompt

pip install 包名

下载数据集:
如果多次下载不成功
下载这个百度网盘链接:
里面还有本教程的全部代码在 first_pytorch文件里
有手写数字
和本教程的数据集
下载好后只要把下载的放在 和存放你所写代码 一个文件夹里就会自动调用数据集 文件名不要改!!!
如果使用网盘下载 使用这个代码替换下面不使用网盘的代码块

transform = transforms.Compose([
    transforms.ToTensor(),
    transforms.Normalize((0.5,), (0.5,))
    ])
#数据下载
data_train = datasets.MNIST(root="./data/",train=True,transform = transform,download=False)
#训练数据集    是Tensor类型                         
data_test =  datasets.MNIST(root="./data/",transform=transform,train=False)
#测试数据集  是Tensor类型  

链接:https://pan.baidu.com/s/1oihdv5ftkDfT_q7TBoQBkA
提取码:6666

transform = transforms.Compose([
    transforms.ToTensor(),
    transforms.Normalize((0.5,), (0.5,))
    ])
#数据下载
data_train = datasets.MNIST(root="./data/",train=True,transform = transform,download=True)
#训练数据集    是Tensor类型                         
data_test =  datasets.MNIST(root="./data/",transform=transform,train=False)
#测试数据集  是Tensor类型  

root参数:下载地址
train参数; 要载入的是否是训练集True是训练集,False不是
transform参数:下载格式
download参数:是否联网下载

数据装载:

#数据转载  转载包的名称  一个包中的图片数  是否打乱
data_loader_train = torch.utils.data.DataLoader(dataset = data_train,batch_size = 1, shuffle = True)
data_loader_test = torch.utils.data.DataLoader(dataset = data_test , batch_size = 1, shuffle = True)

dataset参数:要装载的训练集
batch_size 参数:一匹中有多少张图片
shuffle参数:是否打乱图片顺序
搭建模型:

class Model(torch.nn.Module):#网络
    def __init__(self):
        super(Model,self).__init__()
        self.conv1=torch.nn.Sequential(
            torch.nn.Conv2d(1,64,kernel_size=3,stride=1,padding=1),
            torch.nn.ReLU(),
            torch.nn.Conv2d(64,128,kernel_size=3,stride=1,padding=1),
            torch.nn.ReLU(),
            torch.nn.MaxPool2d(stride=2,kernel_size=2)
        )
        self.dense = torch.nn.Sequential(
            torch.nn.Linear(14*14*128,1024),
            torch.nn.ReLU(),
            torch.nn.Dropout(p=0.5),
            torch.nn.Linear(1024,10)
        )
    def forward(self,x):
        x=self.conv1(x)
        x=x.view(-1,14*14*128)
        x=self.dense(x)
        return x

创建模型:

model = Model()
CUDA = torch.cuda.is_available()#如果你的gpu可用会自动用GPU训练
if CUDA:
	model = model.cuda()#加入gpu

cost = torch.nn.CrossEntropyLoss()#损失函数
optimzer = torch.optim.Adam(model.parameters())# 自动调参

输出开始时间

start = format(datetime.datetime.now())
print("开始时间:{}".format(start))

开始训练:

epoch_n = 3#数据集训练次数 如果时间太长可以置1 我的配置显卡(gpu)2060 cpu i5-10300 运行一次时间大约十分钟 
for epoch in range(epoch_n):
    running_loss = 0
    running_correct = 0
    print("Epoch{}/{}".format(epoch+1,epoch_n))
    print("-"*11)
    for data in data_loader_train:#一张一张的调用图片
        x_train , y_train = data#标签 图片

        if CUDA:
            x_train = x_train.cuda()#将标签加入GPU
            y_train = y_train.cuda()#将训练图片加入GPU Tensor
        #-----------------------------------------------------------------------------------------------
        x_train , y_train = Variable(x_train),Variable(y_train)#将Tensor 转成训练模型时 使用的数据类型

        y_pred = model(x_train.data)#x_train.data 调用出图片数据                               前行传播  输出=model(模型输入)
        _, pred = torch.max(y_pred, 1)#再加一层激活函数  小于一的全赋值为一
        #----------------------------------------------------------------------------------------------

        loss = cost(y_pred,y_train.data)#损失函数


        optimzer.zero_grad()#自动调优器 中的参数 初始化就是模型的参数

        loss.backward()#后向传播函数 通过损失函数调用
        optimzer.step()#自动调优开始
        #------------------------------------------------------------------------
        running_loss += loss#损失值
        running_correct+=torch.sum(pred == y_train.data)#成功率
    testing_correct =0
    for data in data_loader_test: #验证
        x_test , y_test = data
        if CUDA:
            x_test = x_test.cuda()
            y_test = y_test.cuda()
        x_test, y_test = Variable(x_test),Variable(y_test)
        y_pred = model(x_test.data)
        _, pred = torch.max(y_pred,1)
        testing_correct +=torch.sum(pred == y_test.data)
    print("Loss is:{:.4f},Train Aorrect is:{:.4f}%,Test Aorrect is:{:.4f}%".format(running_loss//len(data_train),
        100*running_correct//len(data_train),100*testing_correct//len(data_test)))
    if CUDA:
        torch.cuda.synchronize()#cpu 和GPU 同步 防止异步出现错误

保存模型

print("保存模型")#保存训练好的参数 下次使用直接调用不用训练
state = {'conv1':model.conv1.state_dict(),'dense':model.dense.state_dict(),}
torch.save(state,'models.pkl')#把参数写入model.pal文件

‘conv1’:神经网络训练参数,下次直接加载不用训练了
‘dense’:神经网络结构。
结束时间

end = format(datetime.datetime.now())
print("结束时间:{}".format(end))

输出结果 只要保存好模型这个代码就测试成功,输出只不过是为了看一下损失值。这个数据集已经被预处理过我们不需要预处理。
调用GPU是为了加快训练速度,没有GPU也可以训练,速度会非常慢
我的GPU是2060 的训练一轮需要20分左右
loss is : 损失值就是预测结果与实际值的差值
Train Aorrect is :训练成功率100张图片有50张训练时预测成功就是50%
Text Aorrect is :测试成功率100张图片有50张预测成功就是50%

输出结果图片:
由于我是演示所以只训练一轮

输出

下一篇:手写数字识别 python pytorch 二 之手写数字预测https://editor.csdn.net/md/?articleId=107853422

  • 6
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值