CNN識(shí)別手寫(xiě)數(shù)字

看網(wǎng)上的教程什么的屑柔,大部分都只是訓(xùn)練完就完事了屡萤,我想很多人和我一樣關(guān)心怎么根據(jù)訓(xùn)練的結(jié)果去測(cè)試我們自己的圖片,這部分真的好少看到锯蛀。還有就是代碼很多都沒(méi)有解釋灭衷,這是不友好的,畢竟看的都是新手旁涤,解釋就很重了翔曲。
廢話完
這篇文章你可以學(xué)到怎么寫(xiě)代碼實(shí)現(xiàn)簡(jiǎn)單的CNN網(wǎng)絡(luò)。包括數(shù)據(jù)讀取劈愚,數(shù)據(jù)訓(xùn)練瞳遍,模型存儲(chǔ),測(cè)試結(jié)果菌羽。大概需要20分鐘讀完掠械。
第一部分:先上代碼

導(dǎo)入庫(kù)

from tensorflow.examples.tutorials.mnist import input_data
import tensorflow as tf
import numpy as np
from PIL import Image

數(shù)據(jù)源,這里的minstData 是在和代碼同目錄的文件夾。讀取這個(gè)文件下的數(shù)據(jù)

需要先去下載mnist 數(shù)據(jù)放置minstData這個(gè)目錄下猾蒂,mnist數(shù)據(jù)需要到網(wǎng)上下載均唉,因?yàn)閲?guó)內(nèi)被墻

mnist = input_data.read_data_sets("minstData", one_hot=True)

讀取mnist中的訓(xùn)練圖片,訓(xùn)練對(duì)應(yīng)的標(biāo)簽肚菠,測(cè)試的圖片舔箭,測(cè)試標(biāo)簽

trX, trY, teX, teY = mnist.train.images, mnist.train.labels, mnist.test.images, mnist.test.labels

定義訓(xùn)練輸入數(shù)據(jù)的結(jié)構(gòu),28行28列的矩陣蚊逢,即圖片的像素大小

trX = trX.reshape(-1, 28, 28, 1)

同訓(xùn)練的輸入結(jié)構(gòu)

teX = teX.reshape(-1, 28, 28, 1)

定義輸入层扶,輸出,的數(shù)據(jù)坑(就是先定義數(shù)據(jù)形狀烙荷,后面會(huì)喂具體數(shù)據(jù))

x = tf.placeholder(tf.float32, [None, 28, 28, 1])

這10是因?yàn)閿?shù)字的結(jié)果只有0到9共10總情況

y = tf.placeholder(tf.float32, [None, 10])

定義權(quán)重的函數(shù)

def init_Weight(shape):
#根據(jù)輸入的數(shù)據(jù)形狀镜会,隨機(jī)生成對(duì)應(yīng)的權(quán)重值
return tf.Variable(tf.random_normal(shape, stddev=0.01))

這里初始化權(quán)重,2個(gè)3代表的是卷積核實(shí)3*3的數(shù)組终抽。

第一層權(quán)重的輸入是1因?yàn)橛?xùn)練圖片的顏色是黑白只有一個(gè)通道戳表。

為什么是32,這個(gè)其實(shí)無(wú)所謂的拿诸,32代表的是有32個(gè)3*3的數(shù)組去和輸入的數(shù)據(jù)卷

積扒袖。每個(gè)卷積代表獲取一種屬性,32也就是獲取32種圖片的特性亩码,當(dāng)然也可以是其#他 的數(shù)量比如20

后面為啥子卷積核的數(shù)量會(huì)變2倍季率?告訴你這是真幾把坑。為嘛描沟,因?yàn)槌鼗?/h1>

池化后圖片會(huì)變小飒泻,呃呃呃,我也不知道為嘛吏廉,感覺(jué)是一種規(guī)定泞遗,全部設(shè)置為

32也是OK 的,但是注意一點(diǎn)前后的數(shù)量要對(duì)應(yīng)席覆。

12844是為嘛呢史辙?128是代表卷積核的數(shù)量,44是應(yīng)為這個(gè)是他圖片大小有2828--1414--77--4*4池化的大小的為2

w = init_Weight([3, 3, 1, 32])
w2 = init_Weight([3, 3, 32, 64])
w3 = init_Weight([3, 3, 64, 128])
w4 = init_Weight([128 * 4 * 4, 625]) # 全連接層
wo = init_Weight([625, 10])

這里定義CNN網(wǎng)絡(luò)模型了

def mode(X, w, w2, w3, w4, wo, p_keep_conv, p_hide_conv):
#2828--1414,池化佩伤,“SAME”是卷積保持原來(lái)的大小聊倔。
l1a = tf.nn.relu(tf.nn.conv2d(X, w, strides=[1, 1, 1, 1], padding="SAME"))
l1 = tf.nn.max_pool(l1a, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding="SAME")
l1 = tf.nn.dropout(l1, p_keep_conv)

l2a = tf.nn.relu(tf.nn.conv2d(l1, w2, strides=[1, 1, 1, 1], padding="SAME"))
l2 = tf.nn.max_pool(l2a, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding="SAME")
l2 = tf.nn.dropout(l2, p_keep_conv)

l3a = tf.nn.relu(tf.nn.conv2d(l2, w3, strides=[1, 1, 1, 1], padding="SAME"))
l3 = tf.nn.max_pool(l3a, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding="SAME")
l3 = tf.reshape(l3, [-1, w4.get_shape().as_list()[0]])
l3 = tf.nn.dropout(l3, p_keep_conv)

# 全連接層
l4 = tf.nn.relu(tf.matmul(l3, w4))
l4 = tf.nn.dropout(l4, p_hide_conv)

# 輸出層
lo = tf.matmul(l4, wo)
return lo

保存的神經(jīng)元數(shù)量

p_keep_conv = tf.placeholder(tf.float32)

隱藏的神經(jīng)元數(shù)量

p_hide_conv = tf.placeholder(tf.float32)

得到訓(xùn)練結(jié)果

py_x = mode(x, w, w2, w3, w4, wo, p_keep_conv, p_hide_conv)

定義損失函數(shù)

coss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=py_x, labels=y))

訓(xùn)練

train_op = tf.train.RMSPropOptimizer(0.01, 0.9).minimize(coss)
predict_op = tf.argmax(py_x, 1)

batch_size = 128
test_size = 256

獲取保存的對(duì)象

save=tf.train.Saver()

開(kāi)始這里標(biāo)記為A

with tf.Session() as sess:
#初始化所有對(duì)象
tf.global_variables_initializer().run()
for i in range(100):
training_batch = zip(range(0, len(trX), batch_size),
range(batch_size, len(trX) + 1, batch_size))
for start, end in training_batch:
sess.run(train_op, feed_dict={x: trX[start:end], y: trY[start:end],
p_keep_conv: 0.8, p_hide_conv: 0.5})
test_indices = np.arange(len(teX))
np.random.shuffle(test_indices)
test_indices = test_indices[0:test_size]
print(i, np.mean(np.argmax(teY[test_indices], axis=1) ==
sess.run(predict_op, feed_dict={x: teX[test_indices],
p_keep_conv: 1.0,
p_hide_conv: 1.0})))
#模型保存到j(luò)iangf這個(gè)目錄下,需要自己創(chuàng)建
save.save(sess,"jiangf/test.ckpt")

結(jié)束這里標(biāo)記為A

---------------上面的是訓(xùn)練并保存模型----------------------

---------讀取保存的模型并識(shí)別自己的圖片--------------

識(shí)別自己我圖片生巡,先將我標(biāo)記的A區(qū)域注釋耙蔑,已經(jīng)訓(xùn)練好了,現(xiàn)在不需要訓(xùn)練了

注釋掉孤荣,下面開(kāi)始識(shí)別我們的圖片

with tf.Session() as sess2:
#恢復(fù)保存的模型
save.restore(sess2, "jiangf/test.ckpt")
#讀取pic 目錄下預(yù)先存好的圖片
image_path = "pic/train6.bmp"
keep_prob = tf.placeholder(tf.float32, [1, 10])
img = Image.open(image_path).convert('L') # 灰度圖(L)
img_array=np.array(img).reshape([-1,28,28,1])
print(img_array)
y = sess2.run(predict_op, feed_dict={x: img_array, p_keep_conv:
1.0,p_hide_conv: 1.0})
print('Predict digit', y) # 輸出結(jié)果甸陌。

------------------------恭喜你看完了须揣,感謝------------------

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市钱豁,隨后出現(xiàn)的幾起案子耻卡,更是在濱河造成了極大的恐慌,老刑警劉巖寥院,帶你破解...
    沈念sama閱讀 221,576評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件劲赠,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡秸谢,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,515評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)霹肝,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)估蹄,“玉大人,你說(shuō)我怎么就攤上這事沫换〕粢希” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,017評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵讯赏,是天一觀的道長(zhǎng)垮兑。 經(jīng)常有香客問(wèn)我,道長(zhǎng)漱挎,這世上最難降的妖魔是什么系枪? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,626評(píng)論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮磕谅,結(jié)果婚禮上私爷,老公的妹妹穿的比我還像新娘。我一直安慰自己膊夹,他們只是感情好衬浑,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,625評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著放刨,像睡著了一般工秩。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上进统,一...
    開(kāi)封第一講書(shū)人閱讀 52,255評(píng)論 1 308
  • 那天助币,我揣著相機(jī)與錄音,去河邊找鬼麻昼。 笑死奠支,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的抚芦。 我是一名探鬼主播倍谜,決...
    沈念sama閱讀 40,825評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼迈螟,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了尔崔?” 一聲冷哼從身側(cè)響起答毫,我...
    開(kāi)封第一講書(shū)人閱讀 39,729評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎季春,沒(méi)想到半個(gè)月后洗搂,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,271評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡载弄,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,363評(píng)論 3 340
  • 正文 我和宋清朗相戀三年耘拇,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片宇攻。...
    茶點(diǎn)故事閱讀 40,498評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡惫叛,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出逞刷,到底是詐尸還是另有隱情嘉涌,我是刑警寧澤,帶...
    沈念sama閱讀 36,183評(píng)論 5 350
  • 正文 年R本政府宣布夸浅,位于F島的核電站仑最,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏帆喇。R本人自食惡果不足惜警医,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,867評(píng)論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望番枚。 院中可真熱鬧法严,春花似錦、人聲如沸葫笼。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,338評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)路星。三九已至溯街,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間洋丐,已是汗流浹背呈昔。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,458評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留友绝,地道東北人堤尾。 一個(gè)月前我還...
    沈念sama閱讀 48,906評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像迁客,于是被迫代替她去往敵國(guó)和親郭宝。 傳聞我的和親對(duì)象是個(gè)殘疾皇子辞槐,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,507評(píng)論 2 359

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