手写数字识别 python pytorch 一 之训练
下一篇:手写数字识别 python pytorch 二 之手写数字预测 https://editor.csdn.net/md/?articleId=107853422
在开始前已经默认你学会了,1 .python基础 2. 知道深度网络由那些层组成
下面的代码全部复制上可以直接运行的
如果报错,可以评论,看不懂可以评论,
**
反馈的评论修改如下:
为解决网盘老是和谐下面的链接我以把网盘资源上传到csdn上只要0积分就可以下载。系统自动给加的积分我可不是我。下面的链接可以用。
csdn下载链接点击下载
添加如下:
目录结构:
慢慢人生路,相遇不易,感谢每一个点赞和评论
**
在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上运行(运行这个):
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