开发环境

  • TensorFlow: 1.2.0
  • Python: 3.6
  • Python IDE: PyCharm 2017.2
  • Android IDE: Android Studio 3.0

训练与评估

训练和评估部分主要目的是生成用于测试用的pb文件,其保存了利用TensorFlow python API构建训练后的网络拓扑结构和参数信息,实现方式有很多种,除了cnn外还可以使用rnn,fcnn等。
其中基于cnn的函数也有两套,分别为tf.layers.conv2d和tf.nn.conv2d, tf.layers.conv2d使用tf.nn.conv2d作为后端处理,参数上filters是整数,filter是4维张量。原型如下:

convolutional.py文件

def conv2d(inputs, filters, kernel_size, strides=(1, 1), padding=’valid’, data_format=’channels_last’,
dilation_rate=(1, 1), activation=None, use_bias=True, kernel_initializer=None,
bias_initializer=init_ops.zeros_initializer(), kernel_regularizer=None, bias_regularizer=None,
activity_regularizer=None, kernel_constraint=None, bias_constraint=None, trainable=True, name=None,
reuse=None)

gen_nn_ops.py 文件

def conv2d(input, filter, strides, padding, use_cudnn_on_gpu=True, data_format=”NHWC”, name=None)
官方Demo实例中使用的是layers module,结构如下:

  • Convolutional Layer #1:32个5×5的filter,使用ReLU激活函数
  • Pooling Layer #1:2×2的filter做max pooling,步长为2
  • Convolutional Layer #2:64个5×5的filter,使用ReLU激活函数
  • Pooling Layer #2:2×2的filter做max pooling,步长为2
  • Dense Layer #1:1024个神经元,使用ReLU激活函数,dropout率0.4
    (为了避免过拟合,在训练的时候,40%的神经元会被随机去掉)
  • Dense Layer #2 (Logits Layer):10个神经元,每个神经元对应一个类别(0-9)

核心代码在cnn_model_fn(features, labels, mode)函数中,完成卷积结构的完整定义,核心代码如下:

也可以采用传统的tf.nn.conv2d函数, 核心代码如下:

测试

  • 核心是使用API接口: TensorFlowInferenceInterface.java
  • 配置gradle 或者 自编译TensorFlow源码导入jar和so compile
    ‘org.tensorflow:tensorflow-android:1.2.0’
  • 导入pb文件.pb文件放assets目录,然后读取
String actualFilename = labelFilename.split(“file:///android_asset/“)[1];
Log.i(TAG, “Reading labels from: “ + actualFilename);
BufferedReader br = null;
br = new BufferedReader(new InputStreamReader(assetManager.open(actualFilename)));
String line;
while ((line = br.readLine()) != null) {
c.labels.add(line);
}
br.close();
  • TensorFlow接口使用如下:

最终的测试效果为:

理论基础

MNIST

MNIST,最经典的机器学习模型之一,包含0~9的数字,28*28大小的单色灰度手写数字图片数据库,其中共60,000 training examples和10,000 test examples。
文件目录如下,主要包括4个二进制文件,分别为训练和测试图片及Label。

如下为训练图片的二进制结构,在真实数据前(pixel),有部分描述字段(魔数,图片个数,图片行数和列数),真实数据的存储采用大端规则。
(大端规则,就是数据的高字节保存在低内存地址中,低字节保存在高内存地址中)

在具体实验使用,需要提取真实数据,可采用专门用于处理字节的库struct中的unpack_from方法,核心方法如下:

struct.unpack_from(self._fourBytes2, buf, index)

MNIST作为AI的Hello World入门实例数据,TensorFlow封装对其封装好了函数,可直接使用

mnist = input_data.read_data_sets(‘MNIST’, one_hot=True)

CNN(Convolutional Neural Network)

CNN,英文Convolutional Neural Network,中文全称卷积神经网络,即所谓的卷积网(ConvNets)。卷积(Convolution)可谓是现代深度学习中最最重要的概念了,它是一种数学运算,读者可以从下面链接理解卷积Convolution中卷积相关数学机理,包括分别从傅里叶变换和狄拉克δ函数中推到卷积定义,我们可以从字面上宏观粗鲁的理解成将因子翻转相乘卷起来。卷积动画模型如下图所示:

神经网络:一个由大量神经元(neurons)组成的系统,如下图所示:

其中,x表示输入向量,w为权重,b为偏值bias,f为激活函数。

Activation Function 激活函数: 常用的非线性激活函数有Sigmoid、tanh、ReLU等等,公式如下所示。

  • Sigmoid函数:函数饱和使梯度消失(神经元在值为 0 或 1 的时候接近饱和,这些区域,梯度几乎为 0)。同时,sigmoid 函数不是关于原点中心对称的(无0中心化)。
  • tanh: 存在饱和问题,但它的输出是零中心的,因此实际中 tanh 比 sigmoid 更受欢迎。
  • ReLU函数:ReLU 对于 SGD 的收敛有巨大的加速作用,只需要一个阈值就可以得到激活值,而不用去算一大堆复杂的(指数)运算。缺点是:需要合理设置学习率(learning rate),防止训练时dead,还可以使用Leaky ReLU/PReLU/Maxout等代替。
  • Pooling池化:一般分为平均池化mean pooling和最大池化max pooling,如下图所示[21]为max pooling,除此之外,还有重叠池化(OverlappingPooling)[24],空金字塔池化(Spatial Pyramid
    Pooling)

    平均池化:计算图像区域的平均值作为该区域池化后的值。
    最大池化:选图像区域的最大值作为该区域池化后的值。

CNN Architecture

三层神经网络:分别为输入层(Input layer),输出层(Output layer),隐藏层(Hidden layer),如下图所示。

CNN层级结构: 斯坦福cs231n中阐述了一种[INPUT-CONV-RELU-POOL-FC],如上图右边图片所示,分别为输入层,卷积层,激励层,池化层,全连接层。

CNN通用架构分为如下三层结构:

  • Convolutional layers 卷积层
  • Pooling layers 汇聚层
  • Dense (fully connected) layers 全连接层

用动画演示如下图:

Regression + Softmax

机器学习有监督学习(supervised learning)中两大算法分别是分类算法和回归算法,分类算法用于离散型分布预测,回归算法用于连续型分布预测。
回归的目的就是建立一个回归方程用来预测目标值,回归的求解就是求这个回归方程的回归系数。
其中回归(Regression)算法包括Linear Regression,Logistic Regression等, Softmax Regression是其中一种用于解决多分类(multi-class classification)问题的Logistic回归算法的推广,经典实例就是在MNIST手写数字分类上的应用。

Linear Regression

Linear Regression是机器学习中最基础的模型,其目标是用预测结果尽可能地拟合目标label。

多元线性回归模型定义

多元线性回归求解

Mean Square Error (MSE)

  • Gradient Descent(梯度下降法)
  • Normal Equation(普通最小二乘法)
  • 局部加权线性回归(LocallyWeightedLinearRegression, LWLR
    ):针对线性回归中模型欠拟合现象,在估计中引入一些偏差以便降低预测的均方误差。
  • 岭回归(ridge regression)和缩减方法。

    选择

    Normal Equation相比Gradient Descent,计算量大(需计算X的转置与逆矩阵),只适用于特征个数小于100000时使用;当特征数量大于100000时使用梯度法。当X不可逆时可替代方法为岭回归算法。LWLR方法增加了计算量,因为它对每个点做预测时都必须使用整个数据集,而不是计算出回归系数得到回归方程后代入计算即可,一般不选择。

调优

平衡预测偏差和模型方差(高偏差就是欠拟合,高方差就是过拟合),通常有以下几种解决方案:

  • 获取更多的训练样本 - 解决高方差
  • 尝试使用更少的特征的集合 - 解决高方差
  • 尝试获得其他特征 - 解决高偏差
  • 尝试添加多项组合特征 - 解决高偏差
  • 尝试减小 λ - 解决高偏差
  • 尝试增加 λ -解决高方差

Softmax Regression

Softmax Regression估值函数(hypothesis)。

Softmax Regression代价函数(cost function)。

用实例来表示如下图所示:

Softmax Regression & Logistic Regression:

  • 多分类 & 二分类。Logistic Regression为K=2时的Softmax Regression。
  • 针对K类问题,当类别之间互斥时可采用Softmax Regression,当非斥时,可采用K个独立的Logistic Regression。

总的来说, Softmax Regression适用于类别数量大于2的分类,本例中用于判断每张图属于每个数字的概率。

附录

[01]Mnist官网
[02]Visualizing MNIST: An Exploration of Dimensionality Reduction
[03]TensorFlow Mnist官方实例
[04]Sample code for “Tensorflow and deep learning, without a PhD”
[05]Convex functions
[06]斯坦福大学机器学习第七课-正则化-regularization
[07]MachineLearning_Python
[08]Stanford University’s Convolutional Neural Networks for Visual Recognition course materials 翻译
[09]July CNN笔记:通俗理解卷积神经网络
[10]理解卷积Convolution
[11]Imagenet classification with deep convolutional neural networks
[12]Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition
[13]Convolutional Neural Networks-Basics
[14]A technical report on convolution arithmetic in the context of deep learning
[15]Google官方Demo
[16]Google官方Codelab
[17]deep-learning-cnns-in-tensorflow Github
[18]tensorflow-classifier-android
[19]creating-custom-model-for-android-using-tensorflow
[20]TF-NN Mnist实例

Android+TensorFlow+CNN+MNIST实现手写数字识别相关推荐

  1. 基于CNN的MINIST手写数字识别项目代码以及原理详解

    文章目录 项目简介 项目下载地址 项目开发软件环境 项目开发硬件环境 前言 一.数据加载的作用 二.Pytorch进行数据加载所需工具 2.1 Dataset 2.2 Dataloader 2.3 T ...

  2. [Pytorch系列-41]:卷积神经网络 - 模型参数的恢复/加载 - 搭建LeNet-5网络与MNIST数据集手写数字识别

    作者主页(文火冰糖的硅基工坊):文火冰糖(王文兵)的博客_文火冰糖的硅基工坊_CSDN博客 本文网址:https://blog.csdn.net/HiWangWenBing/article/detai ...

  3. TensorFlow实战笔记之(4):卷积神经网络(CNN) 实现手写数字识别

    一.引言 前一篇博文使用单隐层的全连接神经网络,并结合一些神经网络的优化策略,如指数衰减学习率.正则化.Relu激活函数和Adam优化算法等,用包含100个隐层神经元的神经网络实现了MNIST数据集上 ...

  4. 动手学PaddlePaddle(4):MNIST(手写数字识别)

    本次练习将使用 PaddlePaddle 来实现三种不同的分类器,用于识别手写数字.三种分类器所实现的模型分别为 Softmax 回归.多层感知器.卷积神经网络. 您将学会 实现一个基于Softmax ...

  5. tensorflow入门之MINIST手写数字识别

    最近在学tensorflow,看了很多资料以及相关视频,有没有大佬推荐一下比较好的教程之类的,谢谢.最后还是到了官方网站去,还好有官方文档中文版,今天就结合官方文档以及之前看的教程写一篇关于MINIS ...

  6. 基于卷积神经网络(cnn)的手写数字识别(PyTorch)

    目录 1.1 卷积神经网络简介 1.2 神经网络 1.2.1 神经元模型 1.2.2 神经网络模型 1.3 卷积神经网络 1.3.1卷积的概念 1.3.2 卷积的计算过程 1.3.3 感受野 1.3. ...

  7. 走进tensorflow第十步——手写数字识别中的input_data模块

    本来想来个综合的大程序,刚写了点发现东西较多,那就一点点整吧,东西太杂容易懵圈.. 在前几篇中的手写数字识别中一开始都有这么两句代码: from tensorflow.examples.tutoria ...

  8. 小白玩机器学习(6)--- 基于Tensorflow.js的在线手写数字识别

    一.题目要求 1.三个js文件,分别完成:网络训练以及模型保存.模型加载及准确率测试.在线手写数字识别: 2.模型测试准确率要高于99.3%(尽量): 3.在线手写数字识别需要能够通过鼠标在画布中写入 ...

  9. MNIST数据集手写数字识别

    1 数据集介绍 MNIST 包括6万张28x28的训练样本,1万张测试样本,很多教程都会对它"下手"几乎成为一个 "典范",可以说它就是计算机视觉里面的Hell ...

  10. CNN学习MNIST实现手写数字识别

    CNN的实现 我们之前已经实现了卷积层和池化层,现在来组合这些层,搭建进行手写数字识别的CNN. # 初始化权重 self.params = {'W1': weight_init_std * np.r ...

最新文章

  1. java 多线程 函数_Java多线程--同步函数
  2. 做图形处理Linux小型主机,8个优秀的linux图形图像工具
  3. Spring-常见问题25问
  4. 我的技术博客在博客园落户了
  5. Golang学习笔记——Slice
  6. 为什么我会了SOA,你们还要逼我学微服务?
  7. Cadence Orcad Capture定时保存功能介绍图文视频教程
  8. [A3C]:Tensorflow代码实现详解
  9. 公共关系礼仪实务章节测试题——公共关系的类型(六)
  10. uniapp开发app中配置高德地图定位流程
  11. 扯淡: 什么是团队精神 管理 沟通
  12. Docker 配置国内镜像源
  13. 网线品质差的三大影响
  14. 将本地端口映射子域名
  15. 线程、进程(2)----- 从计算机物理层面分析
  16. 操作系统_进程管理_进程的控制与同步
  17. 979_MISRA C规范学习笔记3
  18. PLC西门子电梯PLC程序,有单部六层,三部十层
  19. 西班牙插画师 Alex Vede
  20. maven:mirror和repository

热门文章

  1. TOGAF认证自学宝典V2.0
  2. cesium加载KML、KMZ数据
  3. r语言worldclim数据_arcgis中如何提取气候数据
  4. w3cschool php下载_w3cschool下载_W3Cschool v2.0离线版
  5. 【_ 記 】topjui 多文件上传 (代码)
  6. ABBYY最新版本OCR文字图像识别软件v16
  7. mysql jdbc 连接池配置
  8. 【小白总结】NLP算法:文本研究领域与NLP文本标注工具(一)
  9. Deepin中如何使用adb和fastboot工具
  10. JVM 自带使用总结