我爱编程tenserflow

Android 与tensorflow的基础教程

2018-03-30  本文已影响292人  茶杯里的阳光

Environment

Train & Evaluate(Python+TensorFlow)

训练和评估部分主要目的是生成用于测试用的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,结构如下:

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

image.png

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

image.png

Test(Android+TensorFlow)

image.png

最终效果:


image.png image.png

Theory

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)

image image.png

MNIST作为AI的Hello World入门实例数据,TensorFlow封装对其封装好了函数,可直接使用
mnist = input_data.read_data_sets('MNIST', one_hot=True)

CNN(Convolutional Neural Network)

CNN Keys

image.png

神经网络。一个由大量神经元(neurons)组成的系统,如下图所示[21] 其中x表示输入向量,w为权重,b为偏值bias,f为激活函数。

image.png

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

Sigmoid缺点
函数饱和使梯度消失(神经元在值为0 或1 的时候接近饱和,这些区域,梯度几乎为0)
sigmoid 函数不是关于原点中心对称的(无0中心化)
tanh: 存在饱和问题,但它的输出是零中心的,因此实际中tanh 比sigmoid 更受欢迎。
ReLU
优点1:ReLU 对于SGD 的收敛有巨大的加速作用
优点2:只需要一个阈值就可以得到激活值,而不用去算一大堆复杂的(指数)运算
缺点:需要合理设置学习率(learning rate),防止训练时dead,还可以使用Leaky ReLU/PReLU/Maxout等代替


image.png

感谢本文博主SkySeraph,官方链接 http://skyseraph.com/2018/01/10/AI/AIHandwritingAndroid/

Pooling池化。一般分为平均池化mean pooling和最大池化max pooling,如下图所示[21]为max pooling,除此之外,还有重叠池化(OverlappingPooling)[24],空金字塔池化(Spatial Pyramid Pooling)[25]
平均池化:计算图像区域的平均值作为该区域池化后的值。
最大池化:选图像区域的最大值作为该区域池化后的值。


image.png image.png

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


image.png

CNN层级结构。斯坦福cs231n中阐述了一种[INPUT-CONV-RELU-POOL-FC],如下图所示[21],分别为输入层,卷积层,激励层,池化层,全连接层。
CNN通用架构分为如下三层结构:
Convolutional layers 卷积层
Pooling layers 汇聚层
Dense (fully connected) layers 全连接层


image.png

动画演示。参考[22]。


image.png

Regression + Softmax

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

Linear Regression

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

Softmax Regression

Softmax Regression估值函数(hypothesis)


image.png

Softmax Regression代价函数(cost function)


image.png

理解:


image.png

Softmax Regression & Logistic Regression:
多分类& 二分类。Logistic Regression为K=2时的Softmax Regression
针对K类问题,当类别之间互斥时可采用Softmax Regression,当非斥时,可采用K个独立的Logistic Regression
总结: Softmax Regression适用于类别数量大于2的分类,本例中用于判断每张图属于每个数字的概率。

References & Recommends

MNIST

Softmax

CNN

TensorFlow+CNN / TensorFlow+Android

代码库:https://github.com/skyseraph/AI_P2T

上一篇 下一篇

猜你喜欢

热点阅读