简单的卷积神经网络编程,卷积神经网络算法代码
關(guān)于AlphaGo的一些錯誤說法
最近看了一些關(guān)于alphago圍棋對弈的一些人工智能的文章,尤其是美國人工智能方面教授的文章,發(fā)現(xiàn)此前媒體宣傳的東西幾乎都是錯的,都是夸大了alpha狗。我做了一個閱讀心得摘要。
首先是對媒體錯誤宣傳的更正:1.alphago可以說里程碑式開創(chuàng)了歷史,但是他并沒有作出任何非常創(chuàng)新的技術(shù),而deepmind只是將早已經(jīng)存在的一些人工智能技術(shù)(尤其是機(jī)器辨認(rèn)圖片技術(shù)運(yùn)用到下棋上)之前沒有人想過能這樣做,這種嘗試是一種創(chuàng)新。
2.alphago并沒有真正的棋感,實(shí)際也不懂得思考并作出策略,圍棋解說把a(bǔ)lphago當(dāng)人來看待是錯誤的。alpha只是不停問自己我下這一步我勝率提高多少。
3.alphago并沒有強(qiáng)大學(xué)習(xí)能力,達(dá)到現(xiàn)在棋力是基于接近1億次棋局的模仿和推測出來的,一開始alphago只學(xué)習(xí)了16萬棋局時(shí)它的棋力很弱。他不但比人學(xué)習(xí)效率差而且比馬戲團(tuán)的動物學(xué)習(xí)效率更差。
所以說跟李對局每一局都在進(jìn)步是不可能的,一局的經(jīng)驗(yàn)對alphago沒什么影響。4.alphago其實(shí)也是基于蠻力窮舉下法,只不過運(yùn)用新的機(jī)器學(xué)習(xí)方法。
窮舉法和機(jī)器學(xué)習(xí)不矛盾5.之前看到文章說alpha速度沒深藍(lán)快,其實(shí)alpha是深藍(lán)的5萬倍。今天用的iPhone6s計(jì)算能力都是深藍(lán)的幾十倍。
6.說人腦計(jì)算速度慢是錯誤的,和計(jì)算機(jī)計(jì)算速度相對應(yīng)的應(yīng)該是人腦神經(jīng)元計(jì)算速度,保守估計(jì)人腦計(jì)算速度是每秒1000萬億次,計(jì)算能力是深藍(lán)的10萬倍。
7.alpha并不是完全學(xué)習(xí)的,首先底層需要人編程圍棋規(guī)則,其次基礎(chǔ)的下期原則也是人為輸入的簡單總結(jié)一下閱讀心得:首先包括alpha圍棋程序和深藍(lán)的象棋都是蠻力搜索法。
也就是1.考慮所有未來可能變化,2.計(jì)算走法未來多少步的勝率,3.選擇走法。但是圍棋每走一步比國際象棋變化更大,步數(shù)更多,可能變化種類超過宇宙原子總和。其實(shí)這對于象棋也是如此。
深藍(lán)雇傭大量職業(yè)象棋選手設(shè)定一個積分法,比如一個兵值多少分,吃對手一個車勝率提升多少,這個評分體系很準(zhǔn)確,深藍(lán)思考范圍被壓縮成十幾步。
但是圍棋無法如此評估,之前圍棋程序是簡單的人手輸入,見到什么情況如何走,所以很死板。這些程序棋力大概是400。
2006年一種叫做蒙特卡洛樹的搜索法被發(fā)明,它使用概率模擬方法(類似模擬投擲骰子)只需要判斷終盤勝負(fù),彌補(bǔ)了圍棋不能設(shè)定確定走法函數(shù)的缺陷。
(alphago也是使用蒙特卡洛樹方法)但是這方法要展開到終盤計(jì)算量太大,所以需要讓圍棋專家協(xié)助制定行棋規(guī)則,減少計(jì)算量。此方法可使人工智能棋力提升到業(yè)余5段。
但是十年來電腦棋力進(jìn)展令人悲觀,直到alphago。它在此基礎(chǔ)上引入深度人工網(wǎng)絡(luò)。神經(jīng)網(wǎng)絡(luò)已經(jīng)發(fā)明50年,適合編寫一些不直觀因果關(guān)系的事物,并且軟件可以自主學(xué)習(xí)調(diào)整。
但是編程太難,加上以前計(jì)算能力問題一直不受重視。6年前開始,技術(shù)上能達(dá)到10層神經(jīng)元,神經(jīng)網(wǎng)絡(luò)開始興起。結(jié)合大數(shù)據(jù)和云計(jì)算技術(shù),神經(jīng)網(wǎng)絡(luò)開始吃香。
圖像處理和人臉識別這類程序很難直觀的由編程員編程,神經(jīng)網(wǎng)絡(luò)在此有用武之地,其中深度卷積網(wǎng)絡(luò)技術(shù)稱霸。alpha狗團(tuán)隊(duì)創(chuàng)新之處在于意識到可以將圖像識別的這項(xiàng)技術(shù)用于下棋。
alpha狗團(tuán)隊(duì)將神經(jīng)網(wǎng)絡(luò)升級到13層,預(yù)測人類棋手走法。首先它學(xué)習(xí)了圍棋對戰(zhàn)平臺的3千萬業(yè)余高段位的對局記錄,作為讓alpha狗猜人類走法的正確答案。
也就是說alpha一開始是在模仿業(yè)余高手平均玩法。同時(shí)團(tuán)隊(duì)人工輸入圍棋知識。alpha是神經(jīng)網(wǎng)絡(luò)加手工編程混合物。這個預(yù)測人類玩法被叫做策略網(wǎng)絡(luò),此時(shí)alpha叫做rp版。
根據(jù)alpha狗團(tuán)隊(duì)的論文把策略網(wǎng)絡(luò)加入業(yè)余3段棋力的圍棋程序,其棋力能達(dá)到業(yè)余6段。
棋力提高950分達(dá)到2600(棋力分每相差230分雙方5局三勝比賽的勝率為高分者95%勝率)此時(shí)alpha已經(jīng)成為世界最強(qiáng)圍棋程序。
為了減少計(jì)算量,alpha狗使用一個叫價(jià)值網(wǎng)絡(luò)的深層卷積網(wǎng)絡(luò)作為評估函數(shù),使用alpha的預(yù)測結(jié)果和實(shí)際展開結(jié)果的平均值作為勝率參考信息。加入此功能的alpha狗叫做完整版。其棋力提高了450分。
達(dá)到3100。(大家要知道棋力相差500的選手之間,棋力低者想贏一盤棋都很難的,相差1000的話,棋力低者勝率幾乎為0)首先剛剛?cè)腴T只懂得規(guī)則的玩家棋力是0。
手寫下棋規(guī)則類圍棋程序的棋力大概是400多。也就是程序是當(dāng)對手下什么子,程序應(yīng)該怎么走,這種純靠手工編程軟件的棋力。業(yè)余棋手最低級別(1段)的棋力是1000左右。
加入神經(jīng)網(wǎng)絡(luò)的alphago棋力是1500。相當(dāng)于業(yè)余4段。此時(shí)的alohago也是程序規(guī)則軟件,只不過靠神經(jīng)網(wǎng)絡(luò)訓(xùn)練加入圍棋知識而已。r版alphago棋力1700。相當(dāng)于業(yè)余5段。
此時(shí)alphago加入蒙特卡洛樹搜索功能,但是主要靠手寫程序?yàn)榛A(chǔ)。和r版alphago類似的程序zen棋力是2200。相當(dāng)于業(yè)余7段。rp版的alphago棋力是2700。
和r版相比rp版的改進(jìn)是在手工編程最基礎(chǔ)的圍棋策略基礎(chǔ)上,加入“策略網(wǎng)絡(luò)”該功能是一個預(yù)測對手落子位置的神經(jīng)網(wǎng)絡(luò)。因此alphago棋力大增接近1000棋力。已經(jīng)成為世界最強(qiáng)圍棋軟件。
這個棋力大概是最低級別的職業(yè)選手(職業(yè)1段)的棋力。2015年下半年被alphago橫掃的歐洲冠軍樊麾的棋力是2900左右。相當(dāng)于職業(yè)2段和3段之間水平。
完整版alphago的棋力是3100多(2015年底時(shí))。這個版本alphago比之前增加了一個“價(jià)值網(wǎng)絡(luò)”的深層卷積網(wǎng)絡(luò)DCNN。
他可以在不將牌局演算到終局就評估出雙方勝率也就是上一篇文章所說的大幅度減化了計(jì)算。這種技術(shù)本來是用在識別圖像技術(shù)上的。此時(shí)李世石棋力是3500多。相當(dāng)于超出最高段位(職業(yè)9段)水平。
柯潔的棋力是3600左右。其實(shí)宣布挑戰(zhàn)李世石時(shí)alphago棋力落后李400左右。它是通過自己和自己大量對局來提升棋力的。
(戰(zhàn)勝樊麾時(shí)它是通過觀摩人類業(yè)余高段位對戰(zhàn)歷史數(shù)據(jù)學(xué)習(xí),為了擊敗更強(qiáng)對手只能向更高技術(shù)的選手學(xué)習(xí),就是自己了)。在不斷對局中程序棋力不斷提高,而提高的棋力自我對陣時(shí)產(chǎn)生更高水平的下棋數(shù)據(jù)。
雖然凌哥沒看到戰(zhàn)勝李世石時(shí)alphago的棋力但是我簡單算一下推測出2016年3月戰(zhàn)勝李時(shí)alphago棋力大概是3800左右。(因?yàn)椴?30分五局三勝95%勝率可以推算單局勝率80%再低一些。
李是3530左右棋力)所以當(dāng)時(shí)柯潔已經(jīng)不是alphago的對手了。現(xiàn)在alphago挑戰(zhàn)各位圍棋高手60連勝(唯一一次平局是人類棋手掉線)至于現(xiàn)在棋力應(yīng)該是沒辦法評估吧。
因?yàn)橐粓龆疾惠數(shù)脑捀静恢榔辶κ嵌嗌佟0凑掌辶τ?jì)算方法應(yīng)該是棋力無限大了,也就是七龍珠漫畫里面的戰(zhàn)斗力爆表了。至少輸一場才能估算出其實(shí)際棋力。其他:說到alpha沒有期感,和人類下棋不一樣。
只要是因?yàn)槿祟悓W(xué)習(xí)下棋,是通過總結(jié)棋局規(guī)則和下法,分析因果關(guān)系和其中邏輯關(guān)系的,而alphago只是推算走這一步它的勝率提高多少(這方面和深藍(lán)沒區(qū)別只是評估方式不同)它并不是真的有智慧懂得各種謀略。
alphago學(xué)習(xí)方式只是像訓(xùn)練動物一樣。走對了給予獎賞鼓勵以后以更高概率走這步,走錯了就懲罰。而且這個效率很低,其實(shí)它的高水平是通過每天學(xué)習(xí)普通職業(yè)選手一輩子也不止的時(shí)間來學(xué)習(xí)下棋得來的。
而且這個學(xué)習(xí)過程“沒有高層思維和概念”,只是一個搜索過程。上文說道alphago學(xué)習(xí)效率很低。
因?yàn)閍lphago學(xué)習(xí)了3000萬盤棋局時(shí)面對新局面應(yīng)變能力很差,分析發(fā)現(xiàn)這些棋局很多都是冗余的只相當(dāng)于16萬棋局。而幾十萬局棋對訓(xùn)練alphago是不夠的,它需要千萬級別的棋局訓(xùn)練。
所以電視里職業(yè)棋手解說說alphago在每局都從李世石身上學(xué)到新技能是不可能的,一兩局對alphago是沒用的。而李世石反而是從alphago身上學(xué)到東西利用創(chuàng)新下法戰(zhàn)勝alphago。
人類這種能力是人工智能不具備的。人工智能專家認(rèn)為現(xiàn)在人工智能其實(shí)并不是真正的智能。alphago只是下棋能力強(qiáng)的軟件,IBM的沃森只是智力答題能力強(qiáng)的機(jī)器。
真正的人工智能是讓一個白板人工智能機(jī)器見到圍棋,自己學(xué)習(xí)下棋規(guī)則,自己通過推理推斷怎么下棋。
(現(xiàn)在的alphago的圍棋規(guī)則和基礎(chǔ)下棋策略都是人手編程的)deepmind致力于開發(fā)真正的人工智能程序。近期目標(biāo)是玩幾百種游戲都能戰(zhàn)勝人類。這是向真正人工智能邁步。
谷歌人工智能寫作項(xiàng)目:神經(jīng)網(wǎng)絡(luò)偽原創(chuàng)
怎樣用python構(gòu)建一個卷積神經(jīng)網(wǎng)絡(luò)
用keras框架較為方便首先安裝anaconda,然后通過pip安裝keras以下轉(zhuǎn)自wphh的博客寫作貓。
#coding:utf-8'''????GPU?run?command:????????THEANO_FLAGS=mode=FAST_RUN,device=gpu,floatX=float32?python?????CPU?run?command:????????python?2016.06.06更新:這份代碼是keras開發(fā)初期寫的,當(dāng)時(shí)keras還沒有現(xiàn)在這么流行,文檔也還沒那么豐富,所以我當(dāng)時(shí)寫了一些簡單的教程。
現(xiàn)在keras的API也發(fā)生了一些的變化,建議及推薦直接上看更加詳細(xì)的教程。
'''#導(dǎo)入各種用到的模塊組件from?__future__?import?absolute_importfrom?__future__?import?print_functionfrom?keras.preprocessing.image?import?ImageDataGeneratorfrom?keras.models?import?Sequentialfrom??import?Dense,?Dropout,?Activation,?Flattenfrom?keras.layers.advanced_activations?import?PReLUfrom?keras.layers.convolutional?import?Convolution2D,?MaxPooling2Dfrom?keras.optimizers?import?SGD,?Adadelta,?Adagradfrom?keras.utils?import?np_utils,?generic_utilsfrom?six.moves?import?rangefrom?data?import?load_dataimport?randomimport?numpy?as?np(1024)??#?for?reproducibility#加載數(shù)據(jù)data,?label?=?load_data()#打亂數(shù)據(jù)index?=?[i?for?i?in?range(len(data))]random.shuffle(index)data?=?data[index]label?=?label[index]print(data.shape[0],?'?samples')#label為0~9共10個類別,keras要求格式為binary?class?matrices,轉(zhuǎn)化一下,直接調(diào)用keras提供的這個函數(shù)label?=?np_utils.to_categorical(label,?10)################開始建立CNN模型################生成一個modelmodel?=?Sequential()#第一個卷積層,4個卷積核,每個卷積核大小5*5。
1表示輸入的圖片的通道,灰度圖為1通道。
#border_mode可以是valid或者full,具體看這里說明:.conv2d#激活函數(shù)用tanh#你還可以在(Activation('tanh'))后加上dropout的技巧:?(Dropout(0.5))(Convolution2D(4,?5,?5,?border_mode='valid',input_shape=(1,28,28)))?(Activation('tanh'))#第二個卷積層,8個卷積核,每個卷積核大小3*3。
4表示輸入的特征圖個數(shù),等于上一層的卷積核個數(shù)#激活函數(shù)用tanh#采用maxpooling,poolsize為(2,2)(Convolution2D(8,?3,?3,?border_mode='valid'))(Activation('tanh'))(MaxPooling2D(pool_size=(2,?2)))#第三個卷積層,16個卷積核,每個卷積核大小3*3#激活函數(shù)用tanh#采用maxpooling,poolsize為(2,2)(Convolution2D(16,?3,?3,?border_mode='valid'))?(Activation('relu'))(MaxPooling2D(pool_size=(2,?2)))#全連接層,先將前一層輸出的二維特征圖flatten為一維的。
#Dense就是隱藏層。16就是上一層輸出的特征圖個數(shù)。
4是根據(jù)每個卷積層計(jì)算出來的:(28-5+1)得到24,(24-3+1)/2得到11,(11-3+1)/2得到4#全連接有128個神經(jīng)元節(jié)點(diǎn),初始化方式為normal(Flatten())(Dense(128,?init='normal'))(Activation('tanh'))#Softmax分類,輸出是10類別(Dense(10,?init='normal'))(Activation('softmax'))##############開始訓(xùn)練模型###############使用SGD?+?momentum#model.compile里的參數(shù)loss就是損失函數(shù)(目標(biāo)函數(shù))sgd?=?SGD(lr=0.05,?decay=1e-6,?momentum=0.9,?nesterov=True)model.compile(loss='categorical_crossentropy',?optimizer=sgd,metrics=["accuracy"])#調(diào)用fit方法,就是一個訓(xùn)練過程.?訓(xùn)練的epoch數(shù)設(shè)為10,batch_size為100.#數(shù)據(jù)經(jīng)過隨機(jī)打亂shuffle=True。
verbose=1,訓(xùn)練過程中輸出的信息,0、1、2三種方式都可以,無關(guān)緊要。show_accuracy=True,訓(xùn)練時(shí)每一個epoch都輸出accuracy。
#validation_split=0.2,將20%的數(shù)據(jù)作為驗(yàn)證集。
(data,?label,?batch_size=100,?nb_epoch=10,shuffle=True,verbose=1,validation_split=0.2)"""#使用data?augmentation的方法#一些參數(shù)和調(diào)用的方法,請看文檔datagen?=?ImageDataGenerator(????????featurewise_center=True,?#?set?input?mean?to?0?over?the?dataset????????samplewise_center=False,?#?set?each?sample?mean?to?0????????featurewise_std_normalization=True,?#?divide?inputs?by?std?of?the?dataset????????samplewise_std_normalization=False,?#?divide?each?input?by?its?std????????zca_whitening=False,?#?apply?ZCA?whitening????????rotation_range=20,?#?randomly?rotate?images?in?the?range?(degrees,?0?to?180)????????width_shift_range=0.2,?#?randomly?shift?images?horizontally?(fraction?of?total?width)????????height_shift_range=0.2,?#?randomly?shift?images?vertically?(fraction?of?total?height)????????horizontal_flip=True,?#?randomly?flip?images????????vertical_flip=False)?#?randomly?flip?images#?compute?quantities?required?for?featurewise?normalization?#?(std,?mean,?and?principal?components?if?ZCA?whitening?is?applied)(data)for?e?in?range(nb_epoch):????print('-'*40)????print('Epoch',?e)????print('-'*40)????print("Training...")????#?batch?train?with?realtime?data?augmentation????progbar?=?generic_utils.Progbar(data.shape[0])????for?X_batch,?Y_batch?in?(data,?label):????????loss,accuracy?=?model.train(X_batch,?Y_batch,accuracy=True)????????(X_batch.shape[0],?values=[("train?loss",?loss),("accuracy:",?accuracy)]?)"""。
深度學(xué)習(xí)中的卷積網(wǎng)絡(luò)到底怎么回事
。
這兩個概念實(shí)際上是互相交叉的,例如,卷積神經(jīng)網(wǎng)絡(luò)(Convolutionalneuralnetworks,簡稱CNNs)就是一種深度的監(jiān)督學(xué)習(xí)下的機(jī)器學(xué)習(xí)模型,而深度置信網(wǎng)(DeepBeliefNets,簡稱DBNs)就是一種無監(jiān)督學(xué)習(xí)下的機(jī)器學(xué)習(xí)模型。
深度學(xué)習(xí)的概念源于人工神經(jīng)網(wǎng)絡(luò)的研究。含多隱層的多層感知器就是一種深度學(xué)習(xí)結(jié)構(gòu)。深度學(xué)習(xí)通過組合低層特征形成更加抽象的高層表示屬性類別或特征,以發(fā)現(xiàn)數(shù)據(jù)的分布式特征表示。
深度學(xué)習(xí)的概念由Hinton等人于2006年提出。基于深信度網(wǎng)(DBN)提出非監(jiān)督貪心逐層訓(xùn)練算法,為解決深層結(jié)構(gòu)相關(guān)的優(yōu)化難題帶來希望,隨后提出多層自動編碼器深層結(jié)構(gòu)。
此外Lecun等人提出的卷積神經(jīng)網(wǎng)絡(luò)是第一個真正多層結(jié)構(gòu)學(xué)習(xí)算法,它利用空間相對關(guān)系減少參數(shù)數(shù)目以提高訓(xùn)練性能。
怎樣用python構(gòu)建一個卷積神經(jīng)網(wǎng)絡(luò)模型
上周末利用python簡單實(shí)現(xiàn)了一個卷積神經(jīng)網(wǎng)絡(luò),只包含一個卷積層和一個maxpooling層,pooling層后面的多層神經(jīng)網(wǎng)絡(luò)采用了softmax形式的輸出。
實(shí)驗(yàn)輸入仍然采用MNIST圖像使用10個featuremap時(shí),卷積和pooling的結(jié)果分別如下所示。
部分源碼如下:[python]?viewplain?copy#coding=utf-8'''''Created?on?2014年11月30日@author:?Wangliaofan'''import?numpyimport?structimport?matplotlib.pyplot?as?pltimport?mathimport?randomimport?copy#testfrom?BasicMultilayerNeuralNetwork?import?BMNN2def?sigmoid(inX):if?(-inX)==?0.0:return?999999999.999999999return?1.0/((-inX))def?difsigmoid(inX):return?sigmoid(inX)*(1.0-sigmoid(inX))def?tangenth(inX):return?(1.0*(inX)-1.0*(-inX))/(1.0*(inX)+1.0*(-inX))def?cnn_conv(in_image,?filter_map,B,type_func='sigmoid'):#in_image[num,feature?map,row,col]=>in_image[Irow,Icol]#features?map[k?filter,row,col]#type_func['sigmoid','tangenth']#out_feature[k?filter,Irow-row+1,Icol-col+1]shape_image=numpy.shape(in_image)#[row,col]#print?"shape_image",shape_imageshape_filter=numpy.shape(filter_map)#[k?filter,row,col]if?shape_filter[1]>shape_image[0]?or?shape_filter[2]>shape_image[1]:raise?Exceptionshape_out=(shape_filter[0],shape_image[0]-shape_filter[1]+1,shape_image[1]-shape_filter[2]+1)out_feature=numpy.zeros(shape_out)k,m,n=numpy.shape(out_feature)for?k_idx?in?range(0,k):#rotate?180?to?calculate?convc_filter=numpy.rot90(filter_map[k_idx,:,:],?2)for?r_idx?in?range(0,m):for?c_idx?in?range(0,n):#conv_temp=numpy.zeros((shape_filter[1],shape_filter[2]))(in_image[r_idx:r_idx+shape_filter[1],c_idx:c_idx+shape_filter[2]],c_filter)(conv_temp)if?type_func=='sigmoid':out_feature[k_idx,r_idx,c_idx]=sigmoid(sum_temp+B[k_idx])elif?type_func=='tangenth':out_feature[k_idx,r_idx,c_idx]=tangenth(sum_temp+B[k_idx])else:raise?Exceptionreturn?out_featuredef?cnn_maxpooling(out_feature,pooling_size=2,type_pooling="max"):k,row,col=numpy.shape(out_feature)max_index_Matirx=numpy.zeros((k,row,col))out_row=int(numpy.floor(row/pooling_size))out_col=int(numpy.floor(col/pooling_size))out_pooling=numpy.zeros((k,out_row,out_col))for?k_idx?in?range(0,k):for?r_idx?in?range(0,out_row):for?c_idx?in?range(0,out_col):temp_matrix=out_feature[k_idx,pooling_size*r_idx:pooling_size*r_idx+pooling_size,pooling_size*c_idx:pooling_size*c_idx+pooling_size]out_pooling[k_idx,r_idx,c_idx](temp_matrix)max_index=numpy.argmax(temp_matrix)#print?max_index#print?max_index/pooling_size,max_index%pooling_sizemax_index_Matirx[k_idx,pooling_size*r_idx+max_index/pooling_size,pooling_size*c_idx+max_index%pooling_size]=1return?out_pooling,max_index_Matirxdef?poolwithfunc(in_pooling,W,B,type_func='sigmoid'):k,row,col=numpy.shape(in_pooling)out_pooling=numpy.zeros((k,row,col))for?k_idx?in?range(0,k):for?r_idx?in?range(0,row):for?c_idx?in?range(0,col):out_pooling[k_idx,r_idx,c_idx]=sigmoid(W[k_idx]*in_pooling[k_idx,r_idx,c_idx]+B[k_idx])return?out_pooling#out_feature?is?the?out?put?of?convdef?backErrorfromPoolToConv(theta,max_index_Matirx,out_feature,pooling_size=2):k1,row,col=numpy.shape(out_feature)error_conv=numpy.zeros((k1,row,col))k2,theta_row,theta_col=numpy.shape(theta)if?k1!=k2:raise?Exceptionfor?idx_k?in?range(0,k1):for?idx_row?in?range(?0,?row):for?idx_col?in?range(?0,?col):error_conv[idx_k,idx_row,idx_col]=\max_index_Matirx[idx_k,idx_row,idx_col]*\float(theta[idx_k,idx_row/pooling_size,idx_col/pooling_size])*\difsigmoid(out_feature[idx_k,idx_row,idx_col])return?error_convdef?backErrorfromConvToInput(theta,inputImage):k1,row,col=numpy.shape(theta)#print?"theta",k1,row,coli_row,i_col=numpy.shape(inputImage)if?row>i_row?or?col>?i_col:raise?Exceptionfilter_row=i_row-row+1filter_col=i_col-col+1detaW=numpy.zeros((k1,filter_row,filter_col))#the?same?with?conv?valid?in?matlabfor?k_idx?in?range(0,k1):for?idx_row?in?range(0,filter_row):for?idx_col?in?range(0,filter_col):subInputMatrix=inputImage[idx_row:idx_row+row,idx_col:idx_col+col]#print?"subInputMatrix",numpy.shape(subInputMatrix)#rotate?theta?180#print?numpy.shape(theta)theta_rotate=numpy.rot90(theta[k_idx,:,:],?2)#print?"theta_rotate",theta_rotate(subInputMatrix,theta_rotate)detaW[k_idx,idx_row,idx_col](dotMatrix)detaB=numpy.zeros((k1,1))for?k_idx?in?range(0,k1):detaB[k_idx](theta[k_idx,:,:])return?detaW,detaBdef?loadMNISTimage(absFilePathandName,datanum=60000):images=open(absFilePathandName,'rb')()index=0magic,?numImages?,?numRows?,?numColumns?=?struct.unpack_from('>IIII'?,?buf?,?index)print?magic,?numImages?,?numRows?,?numColumnsindex?+=?struct.calcsize('>IIII')if?magic?!=?2051:raise?Exceptiondatasize=int(784*datanum)datablock=">"+str(datasize)+"B"#nextmatrix=struct.unpack_from('>47040000B'?,buf,?index)nextmatrix=struct.unpack_from(datablock?,buf,?index)nextmatrix=numpy.array(nextmatrix)/255.0#nextmatrix=nextmatrix.reshape(numImages,numRows,numColumns)#nextmatrix=nextmatrix.reshape(datanum,1,numRows*numColumns)nextmatrix=nextmatrix.reshape(datanum,1,numRows,numColumns)return?nextmatrix,?numImagesdef?loadMNISTlabels(absFilePathandName,datanum=60000):labels=open(absFilePathandName,'rb')()index=0magic,?numLabels??=?struct.unpack_from('>II'?,?buf?,?index)print?magic,?numLabelsindex?+=?struct.calcsize('>II')if?magic?!=?2049:raise?Exceptiondatablock=">"+str(datanum)+"B"#nextmatrix=struct.unpack_from('>60000B'?,buf,?index)nextmatrix=struct.unpack_from(datablock?,buf,?index)nextmatrix=numpy.array(nextmatrix)return?nextmatrix,?numLabelsdef?simpleCNN(numofFilter,filter_size,pooling_size=2,maxIter=1000,imageNum=500):decayRate=0.01MNISTimage,num1=loadMNISTimage("F:\Machine?Learning\UFLDL\data\common\\train-images-idx3-ubyte",imageNum)print?num1row,col=numpy.shape(MNISTimage[0,0,:,:])out_Di=numofFilter*((row-filter_size+1)/pooling_size)*((col-filter_size+1)/pooling_size)MLP=BMNN2.MuiltilayerANN(1,[128],out_Di,10,maxIter)MLP.setTrainDataNum(imageNum)MLP.loadtrainlabel("F:\Machine?Learning\UFLDL\data\common\\train-labels-idx1-ubyte")MLP.initialweights()#MLP.printWeightMatrix()rng?=?numpy.random.RandomState(23455)W_shp?=?(numofFilter,?filter_size,?filter_size)W_bound?=?(numofFilter?*?filter_size?*?filter_size)W_k=rng.uniform(low=-1.0?/?W_bound,high=1.0?/?W_bound,size=W_shp)B_shp?=?(numofFilter,)B=?numpy.asarray(rng.uniform(low=-.5,?high=.5,?size=B_shp))cIter=0while?cIter。
CNN(卷積神經(jīng)網(wǎng)絡(luò))是什么?
在數(shù)字圖像處理的時(shí)候我們用卷積來濾波是因?yàn)槲覀冇玫木矸e模版在頻域上確實(shí)是高通低通帶通等等物理意義上的濾波器。
然而在神經(jīng)網(wǎng)絡(luò)中,模版的參數(shù)是訓(xùn)練出來的,我認(rèn)為是純數(shù)學(xué)意義的東西,很難理解為在頻域上還有什么意義,所以我不認(rèn)為神經(jīng)網(wǎng)絡(luò)里的卷積有濾波的作用。接著談一下個人的理解。
首先不管是不是卷積神經(jīng)網(wǎng)絡(luò),只要是神經(jīng)網(wǎng)絡(luò),本質(zhì)上就是在用一層層簡單的函數(shù)(不管是sigmoid還是Relu)來擬合一個極其復(fù)雜的函數(shù),而擬合的過程就是通過一次次backpropagation來調(diào)參從而使代價(jià)函數(shù)最小。
卷積神經(jīng)網(wǎng)絡(luò)minist為什么輸出是28*28
看數(shù)字圖片而定。如果圖片較小并且質(zhì)量還不錯,那么通過2層的神經(jīng)網(wǎng)絡(luò)就能勝任。對于MNIst數(shù)據(jù)集(28*28的手寫數(shù)字),2層神經(jīng)網(wǎng)絡(luò)準(zhǔn)確率可達(dá)99%,svm也有98%以上。
以上實(shí)現(xiàn)非常簡單,matlab已經(jīng)有現(xiàn)成工具箱。卷積神經(jīng)網(wǎng)絡(luò)通常用于更加復(fù)雜的場合,閉合是被圖像內(nèi)容等。
在MNIST數(shù)據(jù)集上cnn可達(dá)99.7%準(zhǔn)確率,但是實(shí)現(xiàn)起來較為復(fù)雜,需要通過開源框架caffe,keras等進(jìn)行編程。
如果對準(zhǔn)確率要求沒有達(dá)到小數(shù)點(diǎn)后兩位的程度,用簡單的svm,神經(jīng)網(wǎng)絡(luò),softmax等調(diào)調(diào)參數(shù)就行了。
?
總結(jié)
以上是生活随笔為你收集整理的简单的卷积神经网络编程,卷积神经网络算法代码的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 永恒之蓝漏洞(EternalBlue)
- 下一篇: c语言fopen函数的作用是,C语言 f