TensorFlow+CNN嘗試MNIST數(shù)字識(shí)別

嘗試使用TF+CNN時(shí)間MNIST,而不是《機(jī)器學(xué)習(xí)實(shí)戰(zhàn)》中的KNN
首先導(dǎo)入該本次實(shí)驗(yàn)要用的包

import numpy as np
import pandas as pd
import tensorflow as tf
import matplotlib.pyplot as plt
from sklearn.model_selection import ShuffleSplit
from sklearn.preprocessing import StandardScaler, LabelEncoder, OneHotEncoder

如何定義一些后面會(huì)用到的變量翁脆,意義見注釋

LABELS = 10 # 10種圖片
WIDTH = 28 # 圖的寬高
CHANNELS = 1 # 灰度圖筑悴,所以只有一個(gè)channel

VALID = 10000 # 驗(yàn)證集尺寸

STEPS = 3500 #
BATCH = 100 # 隨機(jī)梯度下降batch size
PATCH = 5 # 卷積核大小
DEPTH = 8 #32 # 卷積核深度大小==卷積核的數(shù)量
HIDDEN = 100 #1024 #完全連接層中隱藏神經(jīng)元的數(shù)量

LR = 0.001 #學(xué)習(xí)速率

然后讀取和簡(jiǎn)單處理:

data = pd.read_csv('input/train.csv') # 讀取csv文件為DF類型
labels = np.array(data.pop('label')) # 移除標(biāo)簽魏宽,返回為數(shù)組
labels = LabelEncoder().fit_transform(labels)[:, None]
labels = OneHotEncoder().fit_transform(labels).todense()
data = StandardScaler().fit_transform(np.float32(data.values)) # DF轉(zhuǎn)數(shù)組
data = data.reshape(-1, WIDTH, WIDTH, CHANNELS) # Reshape成二維圖像xchannel
train_data, valid_data = data[:-VALID], data[-VALID:]
train_labels, valid_labels = labels[:-VALID], labels[-VALID:]

sklearn.preprocessing.LabelEncoder():標(biāo)準(zhǔn)化標(biāo)簽呆馁,將標(biāo)簽值統(tǒng)一轉(zhuǎn)換成range(標(biāo)簽值個(gè)數(shù)-1)范圍內(nèi)梗摇,示例如下:

>> le = preprocessing.LabelEncoder()
>> le.fit(["paris", "paris", "tokyo", "amsterdam"])
LabelEncoder()
>> list(le.classes_)
['amsterdam', 'paris', 'tokyo']     # 三個(gè)類別分別為0 1 2
>> le.transform(["tokyo", "tokyo", "paris"]) 
array([2, 2, 1]...)    
>> list(le.inverse_transform([2, 2, 1]))   # 逆過程
['tokyo', 'tokyo', 'paris']

one-hot獨(dú)熱編碼糯崎,是因?yàn)榇蟛糠炙惴ㄊ腔谙蛄靠臻g中的度量來進(jìn)行計(jì)算的,為了使非偏序關(guān)系的變量取值不具有偏序性耗拓,并且到圓點(diǎn)是等距的。使用one-hot編碼奏司,將離散特征的取值擴(kuò)展到了歐式空間乔询,離散特征的某個(gè)取值就對(duì)應(yīng)歐式空間的某個(gè)點(diǎn)。將離散型特征使用one-hot編碼韵洋,會(huì)讓特征之間的距離計(jì)算更加合理竿刁。離散特征進(jìn)行one-hot編碼后,編碼后的特征搪缨,其實(shí)每一維度的特征都可以看做是連續(xù)的特征食拜。就可以跟對(duì)連續(xù)型特征的歸一化方法一樣,對(duì)每一維特征進(jìn)行歸一化副编。比如歸一化到[-1,1]或歸一化到均值為0,方差為1负甸。

然后打印下尺寸啥的:

print('train data shape = ' + str(train_data.shape) + ' = (TRAIN, WIDTH, WIDTH, CHANNELS)')
print('labels shape = ' + str(labels.shape) + ' = (TRAIN, LABELS)')

定義“形參”后面用:

tf_data = tf.placeholder(tf.float32, shape=(None, WIDTH, WIDTH, CHANNELS))
tf_labels = tf.placeholder(tf.float32, shape=(None, LABELS))

生成相關(guān)權(quán)值:

w1 = tf.Variable(tf.truncated_normal([PATCH, PATCH, CHANNELS, DEPTH], stddev=0.1))
b1 = tf.Variable(tf.zeros([DEPTH]))
w2 = tf.Variable(tf.truncated_normal([PATCH, PATCH, DEPTH, 2*DEPTH], stddev=0.1))
b2 = tf.Variable(tf.constant(1.0, shape=[2*DEPTH]))
w3 = tf.Variable(tf.truncated_normal([WIDTH // 4 * WIDTH // 4 * 2*DEPTH, HIDDEN], stddev=0.1))
b3 = tf.Variable(tf.constant(1.0, shape=[HIDDEN]))
w4 = tf.Variable(tf.truncated_normal([HIDDEN, LABELS], stddev=0.1))
b4 = tf.Variable(tf.constant(1.0, shape=[LABELS]))

tf.truncated_normal(shape, mean, stddev) :shape表示生成張量的維度,mean是均值痹届,stddev是標(biāo)準(zhǔn)差呻待。這個(gè)函數(shù)產(chǎn)生正太分布,均值和標(biāo)準(zhǔn)差自己設(shè)定队腐。

下面定義幾個(gè)卷積層

def logits(data):
    # 卷積層1
    x = tf.nn.conv2d(data, w1, [1, 1, 1, 1], padding='SAME')
    x = tf.nn.max_pool(x, [1, 2, 2, 1], [1, 2, 2, 1], padding='SAME')
    x = tf.nn.relu(x + b1)
    #卷積層2
    x = tf.nn.conv2d(x, w2, [1, 1, 1, 1], padding='SAME')
    x = tf.nn.max_pool(x, [1, 2, 2, 1], [1, 2, 2, 1], padding='SAME')
    x = tf.nn.relu(x + b2)
    #全連接層
    x = tf.reshape(x, (-1, WIDTH // 4 * WIDTH // 4 * 2*DEPTH))
    x = tf.nn.relu(tf.matmul(x, w3) + b3)
    return tf.matmul(x, w4) + b4

預(yù)測(cè)部分的代碼:

tf_pred = tf.nn.softmax(logits(tf_data))

tf_loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=logits(tf_data), 
                                                                 labels=tf_labels))
tf_acc = 100*tf.reduce_mean(tf.to_float(tf.equal(tf.argmax(tf_pred, 1), tf.argmax(tf_labels, 1))))

下面是幾種優(yōu)化器:

#tf_opt = tf.train.GradientDescentOptimizer(LR)
#tf_opt = tf.train.AdamOptimizer(LR)
tf_opt = tf.train.RMSPropOptimizer(LR)
tf_step = tf_opt.minimize(tf_loss)

初始化session:

init = tf.global_variables_initializer()
session = tf.Session()
session.run(init)

ShuffleSplit用于生成交叉驗(yàn)證數(shù)據(jù)集蚕捉,get_n_splits返回?cái)?shù)據(jù)集:

ss = ShuffleSplit(n_splits=STEPS, train_size=BATCH)
ss.get_n_splits(train_data, train_labels)
history = [(0, np.nan, 10)] # 初始化錯(cuò)誤差
for step, (idx, _) in enumerate(ss.split(train_data,train_labels), start=1):
    fd = {tf_data:train_data[idx], tf_labels:train_labels[idx]}
    session.run(tf_step, feed_dict=fd)
    if step%500 == 0:
        fd = {tf_data:valid_data, tf_labels:valid_labels}
        valid_loss, valid_accuracy = session.run([tf_loss, tf_acc], feed_dict=fd)
        history.append((step, valid_loss, valid_accuracy))
        print('Step %i \t Valid. Acc. = %f'%(step, valid_accuracy), end='\n')
        steps, loss, acc = zip(*history)

這些就是畫圖的啦

fig = plt.figure()
plt.title('Validation Loss / Accuracy')
ax_loss = fig.add_subplot(111)
ax_acc = ax_loss.twinx()
plt.xlabel('Training Steps')
plt.xlim(0, max(steps))
ax_loss.plot(steps, loss, '-o', color='C0')
ax_loss.set_ylabel('Log Loss', color='C0');
ax_loss.tick_params('y', colors='C0')
ax_loss.set_ylim(0.01, 0.5)
ax_acc.plot(steps, acc, '-o', color='C1')
ax_acc.set_ylabel('Accuracy [%]', color='C1');
ax_acc.tick_params('y', colors='C1')
ax_acc.set_ylim(1,100)
plt.show()

最后給出驗(yàn)證結(jié)果:

test = pd.read_csv('input/test.csv') 
test_data = StandardScaler().fit_transform(np.float32(test.values)) # Convert the dataframe to a numpy array
test_data = test_data.reshape(-1, WIDTH, WIDTH, CHANNELS) # Reshape the data into 42000 2d images

test_pred = session.run(tf_pred, feed_dict={tf_data:test_data})
test_labels = np.argmax(test_pred, axis=1)

k = 0 
print("Label Prediction: %i"%test_labels[k])
fig = plt.figure(figsize=(2,2)); plt.axis('off')
plt.imshow(test_data[k,:,:,0]); plt.show()

submission = pd.DataFrame(data={'ImageId':(np.arange(test_labels.shape[0])+1), 'Label':test_labels})
submission.to_csv('submission.csv', index=False)
submission.tail()

最近有點(diǎn)忙。柴淘。迫淹。未完待續(xù)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市为严,隨后出現(xiàn)的幾起案子敛熬,更是在濱河造成了極大的恐慌,老刑警劉巖第股,帶你破解...
    沈念sama閱讀 219,539評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件荸型,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡炸茧,警方通過查閱死者的電腦和手機(jī)瑞妇,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評(píng)論 3 396
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來梭冠,“玉大人辕狰,你說我怎么就攤上這事】啬” “怎么了蔓倍?”我有些...
    開封第一講書人閱讀 165,871評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵悬钳,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我偶翅,道長(zhǎng)默勾,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,963評(píng)論 1 295
  • 正文 為了忘掉前任聚谁,我火速辦了婚禮母剥,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘形导。我一直安慰自己环疼,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,984評(píng)論 6 393
  • 文/花漫 我一把揭開白布朵耕。 她就那樣靜靜地躺著炫隶,像睡著了一般。 火紅的嫁衣襯著肌膚如雪阎曹。 梳的紋絲不亂的頭發(fā)上伪阶,一...
    開封第一講書人閱讀 51,763評(píng)論 1 307
  • 那天,我揣著相機(jī)與錄音处嫌,去河邊找鬼望门。 笑死,一個(gè)胖子當(dāng)著我的面吹牛锰霜,可吹牛的內(nèi)容都是我干的筹误。 我是一名探鬼主播,決...
    沈念sama閱讀 40,468評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼癣缅,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼厨剪!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起友存,我...
    開封第一講書人閱讀 39,357評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤祷膳,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后屡立,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體直晨,經(jīng)...
    沈念sama閱讀 45,850評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,002評(píng)論 3 338
  • 正文 我和宋清朗相戀三年膨俐,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了勇皇。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,144評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡焚刺,死狀恐怖敛摘,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情乳愉,我是刑警寧澤兄淫,帶...
    沈念sama閱讀 35,823評(píng)論 5 346
  • 正文 年R本政府宣布屯远,位于F島的核電站,受9級(jí)特大地震影響捕虽,放射性物質(zhì)發(fā)生泄漏慨丐。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,483評(píng)論 3 331
  • 文/蒙蒙 一泄私、第九天 我趴在偏房一處隱蔽的房頂上張望房揭。 院中可真熱鬧,春花似錦挖滤、人聲如沸崩溪。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,026評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至觉既,卻和暖如春惧盹,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背瞪讼。 一陣腳步聲響...
    開封第一講書人閱讀 33,150評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工钧椰, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人符欠。 一個(gè)月前我還...
    沈念sama閱讀 48,415評(píng)論 3 373
  • 正文 我出身青樓嫡霞,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親希柿。 傳聞我的和親對(duì)象是個(gè)殘疾皇子诊沪,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,092評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容