1. Python keras構建CNN
data.py:
#coding:utf-8
"""
Author:wepon
Source:https://github.com/wepe
"""
importos
fromPILimportImage
importnumpyasnp
#讀取文件夾mnist下的42000張圖片,圖片為灰度圖,所以為1通道,圖像大小28*28
#如果是將彩色圖作為輸入,則將1替換為3,並且data[i,:,:,:]=arr改為data[i,:,:,:]=[arr[:,:,0],arr[:,:,1],arr[:,:,2]]
defload_data():
data=np.empty((42000,1,28,28),dtype="float32")
label=np.empty((42000,),dtype="uint8")
imgs=os.listdir("./mnist")
num=len(imgs)
foriinrange(num):
img=Image.open("./mnist/"+imgs[i])
arr=np.asarray(img,dtype="float32")
data[i,:,:,:]=arr
label[i]=int(imgs[i].split('.')[0])
returndata,label
由於Keras系統升級,cnn.py代碼調整如下:
#coding:utf-8
'''
GPUruncommand:
THEANO_FLAGS=mode=FAST_RUN,device=gpu,floatX=float32pythoncnn.py
CPUruncommand:
pythoncnn.py
'''
#導入各種用到的模塊組件
from__future__importabsolute_import
from__future__importprint_function
fromkeras.preprocessing.imageimportImageDataGenerator
fromkeras.modelsimportSequential
fromkeras.layers.coreimportDense,Dropout,Activation,Flatten
fromkeras.layers.advanced_activationsimportPReLU
fromkeras.layers.,MaxPooling2D
fromkeras.optimizersimportSGD,Adadelta,Adagrad
fromkeras.utilsimportnp_utils,generic_utils
fromsix.movesimportrange
fromdataimportload_data
importrandom
#載入數據
data,label=load_data()
#打亂數據
index=[iforiinrange(len(data))]
random.shuffle(index)
data=data[index]
label=label[index]
print(data.shape[0],'samples')
#label為0~9共10個類別,keras要求格式為binaryclassmatrices,轉化一下,直接調用keras提供的這個函數
label=np_utils.to_categorical(label,10)
###############
#開始建立CNN模型
###############
#生成一個model
model=Sequential()
#第一個卷積層,4個卷積核,每個卷積核大小5*5。1表示輸入的圖片的通道,灰度圖為1通道。
#border_mode可以是valid或者full,具體看這里說明:http://deeplearning.net/software/theano/library/tensor/nnet/conv.html#theano.tensor.nnet.conv.conv2d
#激活函數用tanh
#你還可以在model.add(Activation('tanh'))後加上dropout的技巧:model.add(Dropout(0.5))
model.add(Convolution2D(4,5,5,border_mode='valid',input_shape=(1,28,28)))
model.add(Activation('tanh'))
#第二個卷積層,8個卷積核,每個卷積核大小3*3。4表示輸入的特徵圖個數,等於上一層的卷積核個數
#激活函數用tanh
#採用maxpooling,poolsize為(2,2)
model.add(Convolution2D(8,3,3,border_mode='valid'))
model.add(Activation('tanh'))
model.add(MaxPooling2D(pool_size=(2,2)))
#第三個卷積層,16個卷積核,每個卷積核大小3*3
#激活函數用tanh
#採用maxpooling,poolsize為(2,2)
model.add(Convolution2D(16,3,3,border_mode='valid'))
model.add(Activation('tanh'))
model.add(MaxPooling2D(pool_size=(2,2)))
#全連接層,先將前一層輸出的二維特徵圖flatten為一維的。
#Dense就是隱藏層。16就是上一層輸出的特徵圖個數。4是根據每個卷積層計算出來的:(28-5+1)得到24,(24-3+1)/2得到11,(11-3+1)/2得到4
#全連接有128個神經元節點,初始化方式為normal
model.add(Flatten())
model.add(Dense(128,init='normal'))
model.add(Activation('tanh'))
#Softmax分類,輸出是10類別
model.add(Dense(10,init='normal'))
model.add(Activation('softmax'))
#############
#開始訓練模型
##############
#使用SGD+momentum
#model.compile里的參數loss就是損失函數(目標函數)
sgd=SGD(l2=0.0,lr=0.05,decay=1e-6,momentum=0.9,nesterov=True)
model.compile(loss='categorical_crossentropy',optimizer=sgd,class_mode="categorical")
#調用fit方法,就是一個訓練過程.訓練的epoch數設為10,batch_size為100.
#數據經過隨機打亂shuffle=True。verbose=1,訓練過程中輸出的信息,0、1、2三種方式都可以,無關緊要。show_accuracy=True,訓練時每一個epoch都輸出accuracy。
#validation_split=0.2,將20%的數據作為驗證集。
model.fit(data,label,batch_size=100,nb_epoch=10,shuffle=True,verbose=1,show_accuracy=True,validation_split=0.2)
"""
#使用dataaugmentation的方法
#一些參數和調用的方法,請看文檔
datagen=ImageDataGenerator(
featurewise_center=True,#setinputmeanto0overthedataset
samplewise_center=False,#seteachsamplemeanto0
featurewise_std_normalization=True,#divideinputsbystdofthedataset
samplewise_std_normalization=False,#divideeachinputbyitsstd
zca_whitening=False,#applyZCAwhitening
rotation_range=20,#(degrees,0to180)
width_shift_range=0.2,#(fractionoftotalwidth)
height_shift_range=0.2,#randomlyshiftimagesvertically(fractionoftotalheight)
horizontal_flip=True,#randomlyflipimages
vertical_flip=False)#randomlyflipimages
#
#(std,mean,)
datagen.fit(data)
foreinrange(nb_epoch):
print('-'*40)
print('Epoch',e)
print('-'*40)
print("Training...")
#
progbar=generic_utils.Progbar(data.shape[0])
forX_batch,Y_batchindatagen.flow(data,label):
loss,accuracy=model.train(X_batch,Y_batch,accuracy=True)
progbar.add(X_batch.shape[0],values=[("trainloss",loss),("accuracy:",accuracy)])
"""
2. 前饋神經網路、BP神經網路、卷積神經網路的區別與聯系
一、計算方法不同
1、前饋神經網路:一種最簡單的神經網路,各神經元分層排列。每個神經元只與前一層的神經元相連。接收前一層的輸出,並輸出給下一層.各層間沒有反饋。
2、BP神經網路:是一種按照誤差逆向傳播演算法訓練的多層前饋神經網路。
3、卷積神經網路:包含卷積計算且具有深度結構的前饋神經網路。
二、用途不同
1、前饋神經網路:主要應用包括感知器網路、BP網路和RBF網路。
2、BP神經網路:
(1)函數逼近:用輸入向量和相應的輸出向量訓練一個網路逼近一個函數;
(2)模式識別:用一個待定的輸出向量將它與輸入向量聯系起來;
(3)分類:把輸入向量所定義的合適方式進行分類;
(4)數據壓縮:減少輸出向量維數以便於傳輸或存儲。
3、卷積神經網路:可應用於圖像識別、物體識別等計算機視覺、自然語言處理、物理學和遙感科學等領域。
聯系:
BP神經網路和卷積神經網路都屬於前饋神經網路,三者都屬於人工神經網路。因此,三者原理和結構相同。
三、作用不同
1、前饋神經網路:結構簡單,應用廣泛,能夠以任意精度逼近任意連續函數及平方可積函數.而且可以精確實現任意有限訓練樣本集。
2、BP神經網路:具有很強的非線性映射能力和柔性的網路結構。網路的中間層數、各層的神經元個數可根據具體情況任意設定,並且隨著結構的差異其性能也有所不同。
3、卷積神經網路:具有表徵學習能力,能夠按其階層結構對輸入信息進行平移不變分類。
(2)cnn網路多少個epoch收斂擴展閱讀:
1、BP神經網路優劣勢
BP神經網路無論在網路理論還是在性能方面已比較成熟。其突出優點就是具有很強的非線性映射能力和柔性的網路結構。網路的中間層數、各層的神經元個數可根據具體情況任意設定,並且隨著結構的差異其性能也有所不同。但是BP神經網路也存在以下的一些主要缺陷。
①學習速度慢,即使是一個簡單的問題,一般也需要幾百次甚至上千次的學習才能收斂。
②容易陷入局部極小值。
③網路層數、神經元個數的選擇沒有相應的理論指導。
④網路推廣能力有限。
2、人工神經網路的特點和優越性,主要表現在以下三個方面
①具有自學習功能。例如實現圖像識別時,只在先把許多不同的圖像樣板和對應的應識別的結果輸入人工神經網路,網路就會通過自學習功能,慢慢學會識別類似的圖像。自學習功能對於預測有特別重要的意義。預期未來的人工神經網路計算機將為人類提供經濟預測、效益預測,其應用前途是很遠大的。
②具有聯想存儲功能。用人工神經網路的反饋網路就可以實現這種聯想。
③具有高速尋找優化解的能力。尋找一個復雜問題的優化解,往往需要很大的計算量,利用一個針對某問題而設計的反饋型人工神經網路,發揮計算機的高速運算能力,可能很快找到優化解。
3. 深度機器學習中的batch的大小對學習效果有何影響
來源:知乎
程引
愛折騰
談談深度學習中的 Batch_Size
Batch_Size(批尺寸)是機器學習中一個重要參數,涉及諸多矛盾,下面逐一展開。
首先,為什麼需要有 Batch_Size 這個參數?
Batch 的選擇,首先決定的是下降的方向。如果數據集比較小,完全可以採用全數據集 ( Full Batch Learning )的形式,這樣做至少有 2 個好處:其一,由全數據集確定的方向能夠更好地代表樣本總體,從而更准確地朝向極值所在的方向。其二,由於不同權重的梯度值差別巨大,因此選取一個全局的學習率很困難。 Full Batch Learning 可以使用Rprop 只基於梯度符號並且針對性單獨更新各權值。
對於更大的數據集,以上 2 個好處又變成了 2 個壞處:其一,隨著數據集的海量增長和內存限制,一次性載入所有的數據進來變得越來越不可行。其二,以 Rprop 的方式迭代,會由於各個 Batch 之間的采樣差異性,各次梯度修正值相互抵消,無法修正。這才有了後來 RMSProp 的妥協方案。
既然 Full Batch Learning 並不適用大數據集,那麼走向另一個極端怎麼樣?
所謂另一個極端,就是每次只訓練一個樣本,即 Batch_Size = 1。這就是在線學習(Online Learning)。線性神經元在均方誤差代價函數的錯誤面是一個拋物面,橫截面是橢圓。對於多層神經元、非線性網路,在局部依然近似是拋物面。使用在線學習,每次修正方向以各自樣本的梯度方向修正,橫沖直撞各自為政,難以達到收斂。
可不可以選擇一個適中的 Batch_Size 值呢?
當然可以,這就是批梯度下降法(Mini-batches Learning)。因為如果數據集足夠充分,那麼用一半(甚至少得多)的數據訓練算出來的梯度與用全部數據訓練出來的梯度是幾乎一樣的。
在合理范圍內,增大 Batch_Size 有何好處?
內存利用率提高了,大矩陣乘法的並行化效率提高。
跑完一次 epoch(全數據集)所需的迭代次數減少,對於相同數據量的處理速度進一步加快。
在一定范圍內,一般來說 Batch_Size 越大,其確定的下降方向越准,引起訓練震盪越小。
盲目增大 Batch_Size 有何壞處?
內存利用率提高了,但是內存容量可能撐不住了。
跑完一次 epoch(全數據集)所需的迭代次數減少,要想達到相同的精度,其所花費的時間大大增加了,從而對參數的修正也就顯得更加緩慢。
Batch_Size 增大到一定程度,其確定的下降方向已經基本不再變化。
調節 Batch_Size 對訓練效果影響到底如何?
這里跑一個 LeNet 在 MNIST 數據集上的效果。MNIST 是一個手寫體標准庫,我使用的是 Theano 框架。這是一個 Python 的深度學習庫。安裝方便(幾行命令而已),調試簡單(自帶 Profile),GPU / CPU 通吃,官方教程相當完備,支持模塊十分豐富(除了 CNNs,更是支持 RBM / DBN / LSTM / RBM-RNN / SdA / MLPs)。在其上層有 Keras 封裝,支持 GRU / JZS1, JZS2, JZS3 等較新結構,支持 Adagrad / Adadelta / RMSprop / Adam 等優化演算法。
運行結果如上圖所示,其中絕對時間做了標幺化處理。運行結果與上文分析相印證:
Batch_Size 太小,演算法在 200 epoches 內不收斂。
隨著 Batch_Size 增大,處理相同數據量的速度越快。
隨著 Batch_Size 增大,達到相同精度所需要的 epoch 數量越來越多。
由於上述兩種因素的矛盾, Batch_Size 增大到某個時候,達到時間上的最優。
由於最終收斂精度會陷入不同的局部極值,因此 Batch_Size 增大到某些時候,達到最終收斂精度上的最優。
4. 神經網路中epoch與iteration相等嗎
神經網路中epoch與iteration是不相等的
batchsize:中文翻譯為批大小(批尺寸)。在深度學習中,一般採用SGD訓練,即每次訓練在訓練集中取batchsize個樣本訓練;
iteration:中文翻譯為迭代,1個iteration等於使用batchsize個樣本訓練一次;一個迭代 = 一個正向通過+一個反向通過
epoch:迭代次數,1個epoch等於使用訓練集中的全部樣本訓練一次;一個epoch = 所有訓練樣本的一個正向傳遞和一個反向傳遞
舉個例子,訓練集有1000個樣本,batchsize=10,那麼:訓練完整個樣本集需要:100次iteration,1次epoch。
(4)cnn網路多少個epoch收斂擴展閱讀
神經網路工作原理
人工神經網路首先要以一定的學習准則進行學習,然後才能工作。現以人工神經網路對於寫「A」、「B」兩個字母的識別為例進行說明,規定當「A」輸入網路時,應該輸出「1」,而當輸入為「B」時,輸出為「0」。
所以網路學習的准則應該是:如果網路作出錯誤的判決,則通過網路的學習,應使得網路減少下次犯同樣錯誤的可能性。首先,給網路的各連接權值賦予(0,1)區間內的隨機值,將「A」所對應的圖象模式輸入給網路。
網路將輸入模式加權求和、與門限比較、再進行非線性運算,得到網路的輸出。在此情況下,網路輸出為「1」和「0」的概率各為50%,也就是說是完全隨機的。這時如果輸出為「1」(結果正確),則使連接權值增大,以便使網路再次遇到「A」模式輸入時,仍然能作出正確的判斷。
普通計算機的功能取決於程序中給出的知識和能力。顯然,對於智能活動要通過總結編製程序將十分困難。
人工神經網路也具有初步的自適應與自組織能力。在學習或訓練過程中改變突觸權重值,以適應周圍環境的要求。同一網路因學習方式及內容不同可具有不同的功能。人工神經網路是一個具有學習能力的系統,可以發展知識,以致超過設計者原有的知識水平。
通常,它的學習訓練方式可分為兩種,一種是有監督或稱有導師的學習,這時利用給定的樣本標准進行分類或模仿;另一種是無監督學習或稱無為導師學習,這時,只規定學習方式或某些規則,則具體的學習內容隨系統所處環境 (即輸入信號情況)而異,系統可以自動發現環境特徵和規律性,具有更近似人腦的功能。
神經網路就像是一個愛學習的孩子,您教她的知識她是不會忘記而且會學以致用的。我們把學習集(Learning Set)中的每個輸入加到神經網路中,並告訴神經網路輸出應該是什麼分類。在全部學習集都運行完成之後,神經網路就根據這些例子總結出她自己的想法,到底她是怎麼歸納的就是一個黑盒了。
之後我們就可以把測試集(Testing Set)中的測試例子用神經網路來分別作測試,如果測試通過(比如80%或90%的正確率),那麼神經網路就構建成功了。我們之後就可以用這個神經網路來判斷事務的分類了。
神經網路是通過對人腦的基本單元——神經元的建模和聯接,探索模擬人腦神經系統功能的模型,並研製一種具有學習、聯想、記憶和模式識別等智能信息處理功能的人工系統。神經網路的一個重要特性是它能夠從環境中學習,並把學習的結果分布存儲於網路的突觸連接中。
神經網路的學習是一個過程,在其所處環境的激勵下,相繼給網路輸入一些樣本模式,並按照一定的規則(學習演算法)調整網路各層的權值矩陣,待網路各層權值都收斂到一定值,學習過程結束。然後我們就可以用生成的神經網路來對真實數據做分類。
5. 怎樣用python構建一個卷積神經網路
用keras框架較為方便
首先安裝anaconda,然後通過pip安裝keras
6. fasterrcnn跑多少個epoch
50。
50個,FasterR-CNN是很多人進行目標檢測領域學習的必經之路。本文將從實戰的角度出發,對FasterR-CNN的結構、損失函數以及令人難以理解的anchor進行詳細說明。本文將結合代碼從以下幾個部分進行解析。
代碼是程序員用開發工具所支持的語言寫出來的源文件,是一組由字元、符號或信號碼元以離散形式表示信息的明確的規則體系。
7. cnn中卷積尺度最小為什麼是3
我沒用過CNN,我只能就matlab神經網路普遍存在的問題回答你, 1,同樣的輸入訓練樣本和測試樣本得到不一樣的結果,可能是因為權值初始化是隨機的,每個隨機的初始值在訓練的時候,誤差只能收斂到那片區域的局部最小值,而不能保證全局最小值。
8. 斯坦福深度學習cnn里最後一個練習怎麼沒有反向傳播
下面我盡可能地用簡單的語言來闡述下我的看法(敘述中假設你已經大致知道什麼是深度學習和神經網路:大數據和高性能計算
在如今的互聯網時代,都讓神經網路有了前所未有的「更深」的可能,一批新方法被發明出來(Denoise Autoencoder、圖像識別中,他提出了利用RBM預訓練的方法。幾年後人們發現?
3,拋磚引玉。在這個框架下?
2,deep learning還會進一步推動更多AI領域的發展,即用特定結構將網路先初始化到一個差不多「好」的程度,從一定程度上解決了之前網路「深不了」的問題,再回到傳統的訓練方法(反向傳播BP),並且可以模擬人腦的運作形式,深度學習重新得到了人們重視,大家共同討論,但是計算速度跟不上。
當然,人的聰明才智是無窮無盡的,淺層的神經網路啥都達不到:
==============================我是分割線============================
為什麼深度學習突然間火起來了,是論證完整化的標准,即便不做預訓練,需要程序員辛辛苦苦寫代碼,也能使深層網路得到非常好的結果。一個我所知道的例子是自然語言處理NLP中詞向量(Word Embedding)方法對傳統語言模型的提升[1]。
有大數據和高性能計算打下最堅實的基礎,就是使語音,GPU並行計算的發展確實極大推動了深度學習的普及?這也是為什麼有人認為神經網路火起來完全是因為GPU使得計算方法更快更好了,性能反而還不如一兩層的淺模型。這樣得到的深度網路似乎就能達到一個不錯的結果。
雖然神經網路「號稱」自己可以擬合任何函數、圖像識別獲得了長足的進步,基本都是沒有預訓練步驟的,深度學習DeepLearning最為人所關注也表現最明顯的,只是我忍不住再談談自己的理解. 為什麼深度學習能成功地應用到語音,順便認為你已經瀏覽了其他答案)?
為了讓更多對深度學習感興趣的朋友看懂,只要有足夠多的數據。沒有了規模,了解神經網路的基本原理。其實有的同學已經回答得很漂亮了,Dropout. 為什麼深度學習會應用到語音識別和圖像識別中,我覺得可以從以下三點遞進地解決題主的疑問. 為什麼深度學習突然間火起來了,想像你有好多好多數據(百萬幅圖片。而人們發現:
1,那這個研究也完全不必要做了吧,預訓練本身也不像全連接那麼好做了,優化多層神經網路是一個高度非凸的問題,訓練就難以收斂。從這個意義上,訓練一個網路需要好幾年(做機器學習的人應該知道這個完全沒有誇張吧)Deep learning實際上同時推動了很多領域的發展,如果在五六年之前。
在2006年Hinton的那篇文章中。這個嚴重的問題直接導致了神經網路方法的上一次衰敗,你說誰干呢……現在的語音識別或圖像識別系統。那些篤信深度學習的學者們使用了各種各樣的演算法激發深度學習的潛能,取得突破,但是這一切都是建立在神經網路足夠深足夠大的基礎上,比如微軟的殘差學習[2]?
談到這個問題,再多的數據也不能把傳統的神經網路訓練到152層啊;而且我相信。而針對卷積神經網路CNN或者LSTM來說,還需要researcher辛辛苦苦想演算法,上萬小時語音)。否則,當網路層數太多了之後,ReLU……),或者只能收斂到一個次優的局部最優解,我們應該加入兩個甚至更加關鍵的元素。
但是我們現在再回過頭來看這個問題。
而高性能計算是與大數據相輔相成的。一個技術不能很大地提升性能,如果擁有大量的訓練樣本,近十年來數據量的積累是爆炸式的,很多人肯定會說是因為Hinton在Science上的那篇論文「Recing the dimensionality ofdata with neural networks」。
本著讀書人簡單問題復雜化……啊呸