
模式識(shí)別領(lǐng)域應(yīng)用機(jī)器學(xué)習(xí)的場(chǎng)景非常多,手寫識(shí)別就是其中一種,最簡(jiǎn)單的數(shù)字識(shí)別是一個(gè)多類分類問題,我們借這個(gè)多類分類問題來介紹一下google最新開源的tensorflow框架,后面深度學(xué)習(xí)的內(nèi)容都會(huì)基于tensorflow來介紹和演示
什么是tensorflow
tensor意思是張量,flow是流。
張量原本是力學(xué)里的術(shù)語,表示彈性介質(zhì)中各點(diǎn)應(yīng)力狀態(tài)。在數(shù)學(xué)中,張量表示的是一種廣義的“數(shù)量”,0階張量就是標(biāo)量(比如:0、1、2……),1階張量就是向量(比如:(1,3,4)),2階張量就是矩陣,本來這幾種形式是不相關(guān)的,但是都?xì)w為張量,是因?yàn)樗麄兺瑫r(shí)滿足一些特性:1)可以用坐標(biāo)系表示;2)在坐標(biāo)變換中遵守同樣的變換法則;3)有著相同的基本運(yùn)算(如:加、減、乘、除、縮放、點(diǎn)積、對(duì)稱……)
那么tensorflow可以理解為通過“流”的形式來處理張量的一種框架,是由google開發(fā)并開源,已經(jīng)應(yīng)用于google大腦項(xiàng)目開發(fā)
tensorflow安裝
sudo pip install https://storage.googleapis.com/tensorflow/mac/tensorflow-0.9.0-py2-none-any.whl
不同平臺(tái)找對(duì)應(yīng)的whl包
可能遇到的問題:
發(fā)現(xiàn)無法import tensorflow,問題在于protobuf版本不對(duì),必須先卸載掉,再安裝tensorflow,這樣會(huì)自動(dòng)安裝3.0版本的protobuf
sudo pip uninstall protobuf
sudo brew remove protobuf260
sudo pip install --upgrade https://storage.googleapis.com/tensorflow/mac/tensorflow-0.9.0-py2-none-any.whl
手寫數(shù)字?jǐn)?shù)據(jù)集獲取
在 http://yann.lecun.com/exdb/mnist/ 可以下載手寫數(shù)據(jù)集,http://yann.lecun.com/exdb/mnist/train-images-idx3-ubyte.gz和http://yann.lecun.com/exdb/mnist/train-labels-idx1-ubyte.gz,下載解壓后發(fā)現(xiàn)不是圖片格式,而是自己特定的格式,為了說明這是什么樣的數(shù)據(jù),我寫了一段程序來顯示這些數(shù)字:
/************************
* author: SharEDITor
* date: 2016-08-02
* brief: read MNIST data
************************/
#include
#include
#include
#include
unsigned char *lables = NULL;
/**
* All the integers in the files are stored in the MSB first (high endian) format
*/
void copy_int(uint32_t *target, unsigned char *src)
{
*(((unsigned char*)target)+0) = src[3];
*(((unsigned char*)target)+1) = src[2];
*(((unsigned char*)target)+2) = src[1];
*(((unsigned char*)target)+3) = src[0];
}
int read_lables()
{
FILE *fp = fopen("./train-labels-idx1-ubyte", "r");
if (NULL == fp)
{
return -1;
}
unsigned char head[8];
fread(head, sizeof(unsigned char), 8, fp);
uint32_t magic_number = 0;
uint32_t item_num = 0;
copy_int(&magic_number, &head[0]);
// magic number check
assert(magic_number == 2049);
copy_int(&item_num, &head[4]);
uint64_t values_size = sizeof(unsigned char) * item_num;
lables = (unsigned char*)malloc(values_size);
fread(lables, sizeof(unsigned char), values_size, fp);
fclose(fp);
return 0;
}
int read_images()
{
FILE *fp = fopen("./train-images-idx3-ubyte", "r");
if (NULL == fp)
{
return -1;
}
unsigned char head[16];
fread(head, sizeof(unsigned char), 16, fp);
uint32_t magic_number = 0;
uint32_t images_num = 0;
uint32_t rows = 0;
uint32_t cols = 0;
copy_int(&magic_number, &head[0]);
// magic number check
assert(magic_number == 2051);
copy_int(&images_num, &head[4]);
copy_int(&rows, &head[8]);
copy_int(&cols, &head[12]);
uint64_t image_size = rows * cols;
uint64_t values_size = sizeof(unsigned char) * images_num * rows * cols;
unsigned char *values = (unsigned char*)malloc(values_size);
fread(values, sizeof(unsigned char), values_size, fp);
for (int image_index = 0; image_index < images_num; image_index++)
{
// print the label
printf("========================================= %d ======================================\n", lables[image_index]);