【Pytorch-手写字体识别】Pytorch简单介绍

  • 一、Pytorch的发展历史
  • 二、主流的的框架定义和区别
    • 2.1 主流的框架
    • 2.2 区别
  • 三、Pytorch
    • 3.1 Pytorch简介
    • 3.2 Pytorch虚拟环境的安装
  • 四、梯度下降算法
    • 4.1 梯度下降的精髓
    • 4.2 解析解
    • 4.3 线性回归和逻辑回归
    • 4.4 手写字体识别

一、Pytorch的发展历史

Torch基于Lua语言开发,一定程度上制约了Torch的发展
2016年Google改进了Pytorch开始进入大众视野(THNN后端)。
2018年12月发布Pytorch 1.0(Caffe2Caffe_2Caffe2​)
2019年5月发布Pytorch 1.1

二、主流的的框架定义和区别

2.1 主流的框架

1.Google:

  • theano(加拿大学者开发的机器学习的库)
  • Thensorflow(基于theano基础上进行的开发)
  • keras:Google收购的高级接口库,相当于一个高级API,自己可以不做任何实现,全部实现交予底层,TensorFlow里也有keras的接口:tf.keras
    现状:Tensorflow2+keras
    keras可以快速进行网络的搭建,但效率,灵活性成问题

2.Facebook:

  • Caffe
  • Caffe2
  • Torch
  • Pytorch:由于Caffe已经与Pytoch进行了相应的结合,Facebook现在重点推Pytoch。
    现状:PyToch+Caffe2

3.Amazon:

  • mxnet

4.Microsoft:

  • CNTK

2.2 区别

TensorFlow为静态图,Pytorch是基于动态图方便进行调试。 Pytorch由于基于动态图,方便调试。所以非常受学术界欢迎。而Tensorflow 1.0由谷歌开发,有很多支持和完善的生态系统所以工业界非常受欢迎。Pytoch对新手非常的友好。Tensorflow 2既有静态图又有动态图,相对好上手。但是Pytorch各版本兼容性较好,Tensorflow各版本兼容性较差。Tensorflow 1.0被Google抛弃了,所以Pytorch性能可粗略排第一,Tensorflow 2算Pytoch和Tensorflow 1.0的折中。
使用建议:研究人员使用Pytorch,更多的把精力放在算法本质上,工程师使用Tensorflow 2,Tensorflow在工业界的相应系统生态比较完善。

三、Pytorch

3.1 Pytorch简介

生态系统非常全面:

  • 自然语言处理方面:NLP、AllenNLP
  • 视觉处理方面:TorchVision
  • 图网络、图卷积方面:PyTorch geometric
  • Pytorch训练后的移植: 通过ONNX布置到移动机器上去

1.使用Pytoch可以进行GPU的加速,注意刚加载cuda需要一段时间,所以一次计算的时间会长,之后使用cuda计算的时间会相对较短。

device = torch.device('cuda')

2.Pytorch:提供自动求导功能

# 需要对a,b,c求导
x = torch.tensor(1.)
a = torch.tensor(1., requires_grad=True)
b = torch.tensor(2., requires_grad=True)
c = torch.tensor(3., requires_grad=True)y = a**2 * x + b * x + cgrads = autograd.grad(y, [a, b, c])
# 输出对应的偏微分
print('after :', grads[0], grads[1], grads[2])

3.Pytorch有许多自带的库
常用网络层
▪ nn.Linear
▪ nn.Conv2d
▪ nn.LSTM
▪ nn.ReLU
▪ nn.Sigmoid
▪ nn.Softmax
▪ nn.CrossEntropyLoss
▪ nn.MSE

3.2 Pytorch虚拟环境的安装

CUDA:是Navidia推出,可以利用显卡进行通用计算的开发语言API,像进行软件开发一样,方便调用硬件资源加速计算。首先确定你有Navidia显卡。这样才能安装CUDA。下面是CUDA,Pytorch匹配版本:

以及Pytoch和python的匹配关系

此处我们安装python3.6版本以及Cuda 10.0,首先打开cmd窗口,查看自己的虚拟环境

conda env list


新建python3.6.4环境:

conda create -n torch_1.2.0 python=3.6.4

安装torch 1.2.0

pip install torch===1.2.0 torchvision===0.4.0 -f https://download.pytorch.org/whl/torch_stable.html --target=E:\software\Anaconda\run_file\envs\torch_1.2.0\Lib\site-packages

四、梯度下降算法

4.1 梯度下降的精髓

梯度是深度学习的核心精髓,整个深度学习就是靠梯度下降算法撑起来的
梯度下降类似于高中的求极值,f′(x)=0f'(x)=0f′(x)=0,通过x∗=x−f′(x)∗(learningrate)x^*=x-f'(x)*(learning\, rate)x∗=x−f′(x)∗(learningrate)进行相应学习,该公式是梯度下降的精髓
learning rate保证了步长,learning rate一般设置0.001,像手写数字可以0.01
我们还可以通过求解器,通过加约束,使得求解的过程更快,求解到的结果更精准,一般的求解器有seg,rmsprop,adam。

4.2 解析解

解析解(closed form solution)通过严格公式进行计算出来的,现实问题中可能会有噪声。

4.3 线性回归和逻辑回归

利用梯度下降的算法解方程得到模糊解是主要目的,线性回归是所有机器学习课程刚开始引入的切入点。
线性回归(linear regression):连续域上的问题
逻辑回归(logistics regression):会通过压缩函数压缩到一定的范围内
分类(Classification):特点:所有结果可能性加起来为1
loss定义(相当于函数值):

def compute_error_for_line_given_points(b, w, points):totalError = 0for i in range(0, len(points)):x = points[i, 0]y = points[i, 1]totalError += (y - (w * x + b)) ** 2return totalError / float(len(points))

梯度信息(相当于导数,利用导数和学习率学习到合适的极值):利用梯度下降训练新的ω\omegaω和bbb

def step_gradient(b_current, w_current, points, learningRate):b_gradient = 0w_gradient = 0N = float(len(points))for i in range(0, len(points)):x = points[i, 0]y = points[i, 1]b_gradient += -(2/N) * (y - ((w_current * x) + b_current))w_gradient += -(2/N) * x * (y - ((w_current * x) + b_current))new_b = b_current - (learningRate * b_gradient)new_m = w_current - (learningRate * w_gradient)return [new_b, new_m]

循环计算梯度

def gradient_descent_runner(points, starting_b, starting_m, learning_rate, num_iterations):b = starting_bm = starting_mfor i in range(num_iterations):b, m = step_gradient(b, m, np.array(points), learning_rate)return [b, m]

对最后的二元一次方程组进行求解

def run():points = np.genfromtxt("data.csv", delimiter=",")learning_rate = 0.0001initial_b = 0 # initial y-intercept guessinitial_m = 0 # initial slope guessnum_iterations = 1000print("Starting gradient descent at b = {0}, m = {1}, error = {2}".format(initial_b, initial_m,compute_error_for_line_given_points(initial_b, initial_m, points)))print("Running...")[b, m] = gradient_descent_runner(points, initial_b, initial_m, learning_rate, num_iterations)print("After {0} iterations b = {1}, m = {2}, error = {3}".format(num_iterations, b, m,compute_error_for_line_given_points(b, m, points)))

4.4 手写字体识别

代码关注公众号“明航科研”回复:手写数字识别
MNIST数据集:每个数字有7000张照片,每张照片大小2828
将图片分为训练集和测试集,把28
28铺平成784*1
首先我们要了解矩阵 [m∗n]∗[k∗n]T=[m∗k][m*n]*[k*n]^T=[m*k][m∗n]∗[k∗n]T=[m∗k]
使用三层进行嵌套,最后一层是[m∗n]T[m*n]^T[m∗n]T,处理后会变成[1∗m][1*m][1∗m]则分类问题可以采用one hot编码,根据欧式距离进行相应的求解。

此刻的模型依然是线性模型,由于分析现实中问题需要有很强的非线性处理能力,所以引入非线性部分(来源于生物学的神经元),求三组的数据。


步骤:

  • 加载数据(Load Data)
# 帮忙完成神经网络的一些操作
from    torch import nn

由于GPU的性能比较强大,一次性可以处理多张图片,所以需要设定
batch_size,代表一次性处理的图片张数。

# step1. load dataset
#  train=True,代表分为6k和1k,download=True代表没有数据集时进行相应的下载
train_loader = torch.utils.data.DataLoader(torchvision.datasets.MNIST('mnist_data', train=True, download=True,transform=torchvision.transforms.Compose([torchvision.transforms.ToTensor(),torchvision.transforms.Normalize((0.1307,), (0.3081,))])),batch_size=batch_size, shuffle=True)

1.train=True,代表分为6k和1k,download=True代表没有数据集时进行相应的下载
2.torchvision.transforms.ToTensor()将numpy数据转化为Tensor,即Pytorch中的数据载体
3.torchvision.transforms.Normalize((0.1307,), (0.3081,))正则化过程,神经网络图片一直是[0,1],正则化后可以使得数据分布在0两侧,这样做也有助于提升模型性能。
4.shuffle=True代表加载的时候需要做随机的打散。

  • 构建网络,第一步,初始化三层,(28*28, 256)中的256是随机决定的,(256, 64)中的64也是随机决定的。
    def __init__(self):super(Net, self).__init__()# xw+bself.fc1 = nn.Linear(28*28, 256)self.fc2 = nn.Linear(256, 64)self.fc3 = nn.Linear(64, 10)

接下来通过三层线性层将神经网络进行相应的转换

    def forward(self, x):# x: [b, 1, 28, 28]# h1 = relu(xw1+b1)x = F.relu(self.fc1(x))# h2 = relu(h1w2+b2)x = F.relu(self.fc2(x))# h3 = h2w3+b3x = self.fc3(x)return x

由于x.size(0)是batch,将28∗2828*2828∗28的矩阵摊平:
x = x.view(x.size(0), 28*28)
再将摊平矩阵输入net之中:

       # => [b, 10]out = net(x)# [b, 10]y_onehot = one_hot(y)# loss = mse(out, y_onehot)loss = F.mse_loss(out, y_onehot)

定义优化器,同时定义learning rate以及momentum(动量)

optimizer = optim.SGD(net.parameters(), lr=0.01, momentum=0.9)

首先清零梯度,计算梯度然后更新梯度。
进行相应的训练:

    optimizer = optim.SGD(net.parameters(), lr=0.01, momentum=0.9)# 清零梯度optimizer.zero_grad()# 计算梯度loss.backward()# 更新梯度# w' = w - lr*gradoptimizer.step()

x是四维向量,batch*{12828}
y是标签
两个都以tensor的形式存储,下面是x的形式:
下面是y的形式:

# 定义新的网络,定义优化器,定义相应的train_loss方便作图
net = Net()
[w1, b1, w2, b2, w3,  b3]train_loss = []# 把train_loss给记录下来,loss是tensor数据类型,train_loss是numpy数据类型train_loss.append(loss.item())if batch_idx % 10 == 0:print(epoch, batch_idx, loss.item())
  • 计算accuracy
    网络输出为[batch,10],会以网络中最大值所在位置作为输出
pred = out.argmax(dim=1)
# 由于是tensor类型,所以转换成数值类型.float(),通过.item()变换成数值correct = pred.eq(y).sum().float().item()total_correct += correct

最后计算准确度:

total_num = len(test_loader.dataset)
acc = total_correct / total_num

【Pytorch-手写字体识别】手写字体识别项目相关推荐

  1. 【图像分类】基于PyTorch搭建LSTM实现MNIST手写数字体识别(双向LSTM,附完整代码和数据集)

    写在前面: 首先感谢兄弟们的关注和订阅,让我有创作的动力,在创作过程我会尽最大能力,保证作品的质量,如果有问题,可以私信我,让我们携手共进,共创辉煌. 在https://blog.csdn.net/A ...

  2. 识别手写字体app_我如何构建手写识别器并将其运送到App Store

    识别手写字体app 从构建卷积神经网络到将OCR部署到iOS (From constructing a Convolutional Neural Network to deploying an OCR ...

  3. java识别手写文字_神经网络入门 第6章 识别手写字体

    前言 神经网络是一种很特别的解决问题的方法.本书将用最简单易懂的方式与读者一起从最简单开始,一步一步深入了解神经网络的基础算法.本书将尽量避开让人望而生畏的名词和数学概念,通过构造可以运行的Java程 ...

  4. [转载] Pytorch入门实战-----逻辑回归识别手写数据集

    参考链接: 在PyTorch中使用Logistic逻辑回归识别手写数字 定义的网络比较简单,可以自行修改,调一下参数,识别率就会上去了. import torch import torch.nn as ...

  5. Pytorch快速搭建Alexnet实现手写英文字母识别+PyQt实现鼠标绘图

    Pytorch快速搭建Alexnet实现手写英文字母识别+PyQt实现鼠标绘图 前言 一.案例要求 二.训练数据准备 1.下载手写英文字母数据集 2.构建自己的数据集 三.AlexNet实现 1.Al ...

  6. Youth甜美手写粗体艺术设计字体 for mac

    Youth是一种甜美而友好的手写字体.Youth甜美手写粗体艺术设计字体 for mac将为所有设计项目增添独特的感觉,并且看起来令人惊叹,Mac甜美手写字体非常适合海报,标题,版式艺术作品,演出海报 ...

  7. Pytorch实战1:LeNet手写数字识别 (MNIST数据集)

    版权说明:此文章为本人原创内容,转载请注明出处,谢谢合作! Pytorch实战1:LeNet手写数字识别 (MNIST数据集) 实验环境: Pytorch 0.4.0 torchvision 0.2. ...

  8. 手写识别python_Python徒手实现识别手写数字—图像识别算法(K最近邻)

    Python徒手实现识别手写数字-图像识别算法(K最近邻) 写在前面 这一段的内容可以说是最难的一部分之一了,因为是识别图像,所以涉及到的算法会相比之前的来说比较困难,所以我尽量会讲得清楚一点. 而且 ...

  9. python识别手写文字_如何快速使用Python神经网络识别手写字符?(文末福利)

    原标题:如何快速使用Python神经网络识别手写字符?(文末福利) 点击标题下[异步社区]可快速关注 在本文中,我们将进一步探讨一些使用Python神经网络识别手写字符非常有趣的想法.如果只是想了解神 ...

  10. python手写数字识别实验报告_python实现识别手写数字 python图像识别算法

    写在前面 这一段的内容可以说是最难的一部分之一了,因为是识别图像,所以涉及到的算法会相比之前的来说比较困难,所以我尽量会讲得清楚一点. 而且因为在编写的过程中,把前面的一些逻辑也修改了一些,将其变得更 ...

最新文章

  1. [Android Pro] 分析 Package manager has died
  2. es6-let 和 const
  3. 不可错过的javascript迷你库
  4. 分布式、高并发、多线程,到底有什么区别?
  5. Invocation of init method failed; nested exception is org.hibernate.InvalidMappingException: Could n
  6. mapreduce运行模式
  7. ORACLE中的INTERVAL类型
  8. Middleware Monitor Cockpit SMWP
  9. js 运算符 语句
  10. _linux文本过滤grep基础命令介绍
  11. 大数据学习笔记15:MR案例——IP地址去重
  12. 缓存穿透、缓存击穿、缓存雪崩概念及解决方案
  13. C语言程序设计基础篇
  14. 抖音是怎么做出来的?| 创业故事
  15. 亿级流量网站架构核心技术 跟开涛学搭建高可用高并发系统
  16. Kutools for Excel v26.10 Excel插件工具箱中文版
  17. 汽车电子EMC试验标准ISO11452
  18. 苦练基本功之分布式系统学习
  19. 品优购项目案例(练习)
  20. 【大学物理·恒定电流的磁场】毕奥-萨伐尔定律

热门文章

  1. SQL中笛卡尔积-cross join的用法
  2. jquery form提交的2种方式
  3. openssl 加盐_nodejs-md5加盐到解密比对
  4. 教孩子学编程python语言pdf_教孩子学编程 PYTHON语言版 PDF 下载
  5. 下载视频 用IDM下载的视频花屏
  6. USB转NRF24L01模块 带UI上位机
  7. 华为无线模板之间的应用关系图
  8. matlab二阶系统绘制bode图,二阶系统bode图
  9. c语言窗口炸弹代码,C语言实现宾果消消乐
  10. SCI论文下载之chrome插件