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之旅



目录
相关文章
|
3月前
|
机器学习/深度学习 PyTorch TensorFlow
TensorFlow与PyTorch深度对比分析:从基础原理到实战选择的完整指南
蒋星熠Jaxonic,深度学习探索者。本文深度对比TensorFlow与PyTorch架构、性能、生态及应用场景,剖析技术选型关键,助力开发者在二进制星河中驾驭AI未来。
750 13
|
3月前
|
机器学习/深度学习 PyTorch TensorFlow
66_框架选择:PyTorch vs TensorFlow
在2025年的大语言模型(LLM)开发领域,框架选择已成为项目成功的关键决定因素。随着模型规模的不断扩大和应用场景的日益复杂,选择一个既适合研究探索又能支持高效部署的框架变得尤为重要。PyTorch和TensorFlow作为目前市场上最主流的两大深度学习框架,各自拥有独特的优势和生态系统,也因此成为开发者面临的经典选择难题。
|
并行计算 PyTorch TensorFlow
Ubuntu安装笔记(一):安装显卡驱动、cuda/cudnn、Anaconda、Pytorch、Tensorflow、Opencv、Visdom、FFMPEG、卸载一些不必要的预装软件
这篇文章是关于如何在Ubuntu操作系统上安装显卡驱动、CUDA、CUDNN、Anaconda、PyTorch、TensorFlow、OpenCV、FFMPEG以及卸载不必要的预装软件的详细指南。
11674 4
|
数据挖掘 PyTorch TensorFlow
|
11月前
|
机器学习/深度学习 PyTorch TensorFlow
深度学习工具和框架详细指南:PyTorch、TensorFlow、Keras
在深度学习的世界中,PyTorch、TensorFlow和Keras是最受欢迎的工具和框架,它们为研究者和开发者提供了强大且易于使用的接口。在本文中,我们将深入探索这三个框架,涵盖如何用它们实现经典深度学习模型,并通过代码实例详细讲解这些工具的使用方法。
1031 0
|
PyTorch TensorFlow 算法框架/工具
Jetson环境安装(一):Ubuntu18.04安装pytorch、opencv、onnx、tensorflow、setuptools、pycuda....
本文提供了在Ubuntu 18.04操作系统的NVIDIA Jetson平台上安装深度学习和计算机视觉相关库的详细步骤,包括PyTorch、OpenCV、ONNX、TensorFlow等。
1285 1
Jetson环境安装(一):Ubuntu18.04安装pytorch、opencv、onnx、tensorflow、setuptools、pycuda....
|
并行计算 PyTorch TensorFlow
环境安装(一):Anaconda3+pytorch1.6.0+cuda10.0+cudnn7.6.4+tensorflow1.15+pycocotools+pydensecrf
这篇文章详细介绍了如何在Anaconda环境下安装和配置深度学习所需的库和工具,包括PyTorch 1.6.0、CUDA 10.0、cuDNN 7.6.4、TensorFlow 1.15、pycocotools和pydensecrf,并提供了pip国内镜像源信息以及Jupyter Notebook和Anaconda的基本操作。
1939 0
环境安装(一):Anaconda3+pytorch1.6.0+cuda10.0+cudnn7.6.4+tensorflow1.15+pycocotools+pydensecrf
|
机器学习/深度学习 PyTorch TensorFlow
conda、anaconda、pip、pytorch、tensorflow有什么关联?
conda、anaconda、pip、pytorch、tensorflow有什么关联?
414 3
|
机器学习/深度学习 PyTorch TensorFlow
TensorFlow和PyTorch的实际应用比较
TensorFlow和PyTorch的实际应用比较
436 2
|
UED 开发者
哇塞!Uno Platform 数据绑定超全技巧大揭秘!从基础绑定到高级转换,优化性能让你的开发如虎添翼
【8月更文挑战第31天】在开发过程中,数据绑定是连接数据模型与用户界面的关键环节,可实现数据自动更新。Uno Platform 提供了简洁高效的数据绑定方式,使属性变化时 UI 自动同步更新。通过示例展示了基本绑定方法及使用 `Converter` 转换数据的高级技巧,如将年龄转换为格式化字符串。此外,还可利用 `BindingMode.OneTime` 提升性能。掌握这些技巧能显著提高开发效率并优化用户体验。
257 0

热门文章

最新文章

推荐镜像

更多