SkySeraph 2018html
Email:skyseraph00#163.comjava
本文系「SkySeraph AI 實踐到理論系列」第一篇,咱以AI界的HelloWord 經典MNIST數據集爲基礎,在Android平臺,基於TensorFlow,實現CNN的手寫數字識別。
Code here~python
訓練和評估部分主要目的是生成用於測試用的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)android
gen_nn_ops.py 文件git
def conv2d(input, filter, strides, padding, use_cudnn_on_gpu=True, data_format="NHWC", name=None)
官方Demo實例中使用的是layers module,結構以下:github
核心代碼在cnn_model_fn(features, labels, mode)函數中,完成卷積結構的完整定義,核心代碼以下.
算法
也能夠採用傳統的tf.nn.conv2d函數, 核心代碼以下。
數據庫
導入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,最經典的機器學習模型之一,包含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)
神經網絡。一個由大量神經元(neurons)組成的系統,以下圖所示[21]
其中x表示輸入向量,w爲權重,b爲偏值bias,f爲激活函數。
Activation Function 激活函數: 經常使用的非線性激活函數有Sigmoid、tanh、ReLU等等,公式以下如所示。
機器學習有監督學習(supervised learning)中兩大算法分別是分類算法和迴歸算法,分類算法用於離散型分佈預測,迴歸算法用於連續型分佈預測。
迴歸的目的就是創建一個迴歸方程用來預測目標值,迴歸的求解就是求這個迴歸方程的迴歸係數。
其中迴歸(Regression)算法包括Linear Regression,Logistic Regression等, Softmax Regression是其中一種用於解決多分類(multi-class classification)問題的Logistic迴歸算法的推廣,經典實例就是在MNIST手寫數字分類上的應用。
Linear Regression是機器學習中最基礎的模型,其目標是用預測結果儘量地擬合目標label
MNIST
Softmax
CNN
TensorFlow+CNN / TensorFlow+Android
By SkySeraph-2018
SkySeraph cnBlogs