MNIST-手写数字识别-TensorFlow&&Pytorch

简介: 笔记

作为深度学习的第一个任务呢,一般都会选择手写数字识别作为我们的第一个项目,因为识别起来并不是很困难,而且精度可以达到0.99。下面就正式开始我们的第一个小项目吧。


先来说一下流程:

1. 准备数据集,可以在kaggle上下载csv文件的数据集,对于新手来说,以便好的理解数据,后者是利用TensorFlow后pytorch直接下载数据,.pt格式的(不推荐新手)。

2. 加载数据以及对数据进行一些处理(归一化,resize等),对原始数据进行合适的处理常常大大提升模型的精度。

3. 选择合适的模型,也就是网络,当然也可以自己构建。

4. 选择合适的优化函数以及损失函数。

5. 开始训练,然后在测试数据上测试模型的精度,保存模式。


在以后的学习中一般都是这几大步,所以对于初学者来说,记住了后,有利于代码的编写。


在这个小项目中,由于识别难度不是很大,所以我们可以自己构建简单的网络,这里可以使用线性层(识别精度大概在90%)也可以使用卷积神经网络(识别精度大概在98%)。


先导入相关的库

import numpy as np
import pandas as pd

下面来开始第一步:加载数据

先看一些数据的前几行

10.png

label是标签,后面是图片展开的数据,这里的每一张图片都是28×28的大小,而且是灰度的。

data = pd.read_csv('train.csv')          #读取数据
label = data['label'].values          #获取标签
img = data.loc[:,data.columns != 'label'].values.astype(np.float32) #获取图片


第二步:对数据进行归一化处理,这里只想做简单的处理

img = img / 255.0


第三步:构建网络

在这里我们自己构建网络,分别用线性层,和卷积层来构建。

import torch
import torch.nn as nn
import torch.nn.functional as F
class Network(nn.Model):
  def __init__(self):
    super(Network,self).__init__()
    self.fc1 = nn.Linear(28*28,1024)
    self.fc2 = nn.Linear(1024,2048)
    self.fc3 = nn.Linear(2048,100)
    self.fc4 = nn.Linear(100,10)
  def forward(self,x):
    x = self.fc1(x)
    x = self.fc2(x)
    x = self.fc3(x)
    x = self.fc4(x)
    x = F.softmax(x,dim=1)
    return x

上面是线性层,下面来用卷积层

import torch
import torch.nn as nn
import torch.nn.functional as F
class Network(nn.Model):
  def __init__(self):
    super(Network,self).__init__()
    self.conv1 = nn.Conv2d(1,16,kernel_size=3,stride=1,padding=1) # 16  28  28
    self.pool1 = nn.MaxPool2d(kernel_size=2,stride=2)    #16 14  14
    self.conv2 = nn.Conv2d(16,32,3,1,1)   #32  14   14
    self.pool2 = nn.MaxPool2d(2,2)      #32  7     7
    self.fc1 = nn.Linear(32*7*7,1024)
    self.fc2 = nn.Linear(1024,10)
  def forward(self,x):
    x =F.ReLU(self.conv1(x),inplace=True)
    x = self.pool1(x)
    x = F.ReLU(self.conv2(x),inplace=True)
    x = self.pool2(x)
    x = x.view(x.size(0),-1)   #将x打平
    x = self.fc1(x)
    x = F.softmax(self.fc2(x))
    return x

选择模型已经构建出来了下一步是选择合适的优化函数和损失函数了。


第四步:优化函数和损失函数的选取

一般的情况下,对于分类问题,我们都会选取交叉熵损失函数,对于优化函数没太多限制,这里选择SGD(随机梯度下降)


import torch.optim
optimizer = torch.optim.SGD(x.parameters(),lr=0.001)   #x为实例化的网络,这里先用x代替
error = nn.CrossEntropyLoss()        #交叉熵


第五步:进行训练

这里直接上代码

from torch.autograd import Variable
from sklearn.preprocessing import OneHotEncoder
for i in range(25):
    for img,label in data:    #data为经过DataLoader处理过了的
        lb = OneHotEncoder(categories='auto')
        lb.fit(label.reshape(-1,1))
        label = lb.transform(label.reshape(-1,1)).toarray()  #将label进行one_hot编码
        img = Variable(img)
        label = torch.from_numpy(label).long()
        label = Variable(label)
        optimizers.zero_grad()
        predict = cnn(img)
        loss = losses(predict,label)
        loss.backward()
        optimizers.step()


在这里我们已经对用pytorch进行MNIST识别有了大概的了解。

TensorFlow的代码也和pytorch差不多,弄懂了上面的代码,那么对于TensorFlow的代码也可以很快地知道该怎样运用了,下面就直接给出TensorFlow2.0的代码(线性层的)

由于pytorch上面已经说了,就不给出全部的代码了。

import tensorflow as tf
import numpy as np
import pandas as pd
from tensorflow.keras import Model,layers
data = pd.read_csv('train.csv')
x = data.loc[:,data.columns != 'label'].values.astype(np.float32)
y = data['label'].values
x = x / 255.0
data_loader = tf.data.Dataset.from_tensor_slices((x,y))    
data_loader = data_loader.repeat().shuffle(5000).batch(256).prefetch(1)    #在之前的文章中已经说

过了这两行代码的意思了,就不再累赘。

class NeuralNet(Model):
    def __init__(self):
        super(NeuralNet,self).__init__()
        self.fc1 = layers.Dense(256,activation=tf.nn.relu)   
        self.fc2 = layers.Dense(512,activation=tf.nn.relu)
        self.out = layers.Dense(10,activation=tf.nn.softmax)
    def call(self,x):
        x = self.fc1(x)
        x = self.fc2(x)
        return x
neural_net = NeuralNet()
def cross_entropy_loss(x,y):
    y = tf.cast(y,tf.int64)
    loss = tf.nn.sparse_softmax_cross_entropy_with_logits(labels=y,logits=x)
    return tf.reduce_mean(loss)
def accuracy(y_pred,y_true):
    correct_prediction = tf.equal(tf.argmax(y_pred,1),tf.cast(y_true,tf.int64))
    return tf.reduce_mean(tf.cast(correct_prediction,tf.float32),axis=-1)
optimizer = tf.optimizers.SGD(0.01)
def run_optimization(x,y):
    with tf.GradientTape() as g:
        pred = neural_net(x)
        loss = cross_entropy_loss(pred,y)
    trainable_cariables = neural_net.trainable_variables
    gradients = g.gradient(loss,trainable_cariables)
    optimizer.apply_gradients(zip(gradients,trainable_cariables))
for step,(batch_x,batch_y) in enumerate(data_loader.take(2000),1):
    run_optimization(batch_x,batch_y)
    if step % 50 == 0:
        pred = neural_net(batch_x)
        loss = cross_entropy_loss(pred,batch_y)
        acc = accuracy(pred,batch_y)
        print("step:%i,loss:%f,accuracy:%f"%(step,loss,acc))


以上TensorFlow代码学习于: https://github.com/aymericdamien/TensorFlow-Examples

上面就是TensorFlow的全部代码了,这一讲就完了。

Thank for your reading !!!

公众号:FPGA之旅



目录
相关文章
|
2月前
|
机器学习/深度学习 编解码 PyTorch
Pytorch实现手写数字识别 | MNIST数据集(CNN卷积神经网络)
Pytorch实现手写数字识别 | MNIST数据集(CNN卷积神经网络)
|
4月前
|
机器学习/深度学习 分布式计算 PyTorch
Tensorflow、Pytorch、
Tensorflow、Pytorch、Horovod、Spark、JupyterLab、TF-Serving、Triton等。 是什么,怎么用,推荐demo
92 40
|
4月前
|
机器学习/深度学习 算法 TensorFlow
【Python深度学习】Tensorflow对半环形数据分类、手写数字识别、猫狗识别实战(附源码)
【Python深度学习】Tensorflow对半环形数据分类、手写数字识别、猫狗识别实战(附源码)
59 0
|
3月前
|
机器学习/深度学习 PyTorch TensorFlow
|
18天前
|
机器学习/深度学习 数据可视化 PyTorch
利用PyTorch实现基于MNIST数据集的手写数字识别
利用PyTorch实现基于MNIST数据集的手写数字识别
20 2
|
2月前
|
机器学习/深度学习 PyTorch TensorFlow
Python中的深度学习:TensorFlow与PyTorch的选择与使用
Python中的深度学习:TensorFlow与PyTorch的选择与使用
|
2月前
|
机器学习/深度学习 算法 PyTorch
pytorch实现手写数字识别 | MNIST数据集(全连接神经网络)
pytorch实现手写数字识别 | MNIST数据集(全连接神经网络)
|
3月前
|
机器学习/深度学习 PyTorch TensorFlow
TensorFlow vs PyTorch:深度学习框架的比较研究
TensorFlow vs PyTorch:深度学习框架的比较研究
34 1
|
4月前
|
机器学习/深度学习 TensorFlow 算法框架/工具
【Keras+计算机视觉+Tensorflow】DCGAN对抗生成网络在MNIST手写数据集上实战(附源码和数据集 超详细)
【Keras+计算机视觉+Tensorflow】DCGAN对抗生成网络在MNIST手写数据集上实战(附源码和数据集 超详细)
48 0
|
4月前
|
机器学习/深度学习 并行计算 PyTorch
PyTorch使用快速梯度符号攻击(FGSM)实现对抗性样本生成(附源码和数据集MNIST手写数字)
PyTorch使用快速梯度符号攻击(FGSM)实现对抗性样本生成(附源码和数据集MNIST手写数字)
73 0