⼿写数字识别pythonpytorch⼀之训练
易语言 吾爱破解⼿写数字识别 python pytorch ⼀之训练
下⾯的代码全部复制上可以直接运⾏的
如果报错,可以评论,看不懂可以评论,
**
反馈的评论修改如下:
为解决⽹盘⽼是和谐下⾯的链接我以把⽹盘资源上传到csdn上只要0积分就可以下载。系统⾃动给加的积分我可不是我。下⾯的链接可以⽤。
添加如下:
⽬录结构:
慢慢⼈⽣路,相遇不易,感谢每⼀个点赞和评论
**
在pycharm中创建⼀个项⽬和py⽂件,名字随意,引⼊上篇⽂章建⽴的环境
训练代码:
先来看怎么书写训练的代码。
引⼊包:
import torch
from torchvision import datasets,transforms
from torch.autograd import Variable
import numpy as np
import cv2
import datetime
openstack rocky没有这个包?看下⾯。
如果引⼊报错,
在该环境下base上运⾏(运⾏这个):
pip install 包名python入门教程网盘
下载数据集:
如果多次下载不成功
下载这个百度⽹盘链接:
正则匹配第二个符合的⾥⾯还有本教程的全部代码在 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类型
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 Module):#⽹络
def__init__(self):
super(Model,self).__init__()
)
self.dense = Sequential(
)
def forward(self,x):
v1(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 = CrossEntropyLoss()#损失函数
optimzer = torch.optim.Adam(model.parameters())# ⾃动调参
输出开始时间
start =format(w())
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:#⼀张⼀张的调⽤图⽚
net user adminx_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)#损失函数
<_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':v1.state_dict(),'dense':model.dense.state_dict(),}
torch.save(state,'models.pkl')#把参数写⼊model.pal⽂件
‘conv1’:神经⽹络训练参数,下次直接加载不⽤训练了
‘dense’:神经⽹络结构。
结束时间
end =format(w())
print("结束时间:{}".format(end))
输出结果 只要保存好模型这个代码就测试成功,输出只不过是为了看⼀下损失值。这个数据集已经被预处理过我们不需要预处理。调⽤GPU是为了加快训练速度,没有GPU也可以训练,速度会⾮常慢
我的GPU是2060 的训练⼀轮需要20分左右
loss is : 损失值就是预测结果与实际值的差值
Train Aorrect is :训练成功率100张图⽚有50张训练时预测成功就是50%
Text Aorrect is :测试成功率100张图⽚有50张预测成功就是50%
输出结果图⽚:
由于我是演⽰所以只训练⼀轮
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论