A. 怎樣用python構建一個卷積神經網路
用keras框架較為方便
首先安裝anaconda,然後通過pip安裝keras
B. 卷積神經網路用全連接層的參數是怎麼確定的
卷積神經網路用全連接層的參數確定:卷積神經網路與傳統的人臉檢測方法不同,它是通過直接作用於輸入樣本,用樣本來訓練網路並最終實現檢測任務的。
它是非參數型的人臉檢測方法,可以省去傳統方法中建模、參數估計以及參數檢驗、重建模型等的一系列復雜過程。本文針對圖像中任意大小、位置、姿勢、方向、膚色、面部表情和光照條件的人臉。
輸入層
卷積神經網路的輸入層可以處理多維數據,常見地,一維卷積神經網路的輸入層接收一維或二維數組,其中一維數組通常為時間或頻譜采樣;二維數組可能包含多個通道;二維卷積神經網路的輸入層接收二維或三維數組;三維卷積神經網路的輸入層接收四維數組。
由於卷積神經網路在計算機視覺領域應用較廣,因此許多研究在介紹其結構時預先假設了三維輸入數據,即平面上的二維像素點和RGB通道。
C. 如何在卷積神經網路中,當識別率低的時候設置大的學習率,識別率高的時候設置小的學習率。
把學習率作為placeholder試試
D. 如何用tensorflow搭建卷積神經網路
在MNIST數據集上,搭建一個簡單神經網路結構,一個包含ReLU單元的非線性化處理的兩層神經網路。在訓練神經網路的時候,使用帶指數衰減的學習率設置、使用正則化來避免過擬合、使用滑動平均模型來使得最終的模型更加健壯。
程序將計算神經網路前向傳播的部分單獨定義一個函數inference,訓練部分定義一個train函數,再定義一個主函數main。
二、分析與改進設計
1. 程序分析改進
第一,計算前向傳播的函數inference中需要將所有的變數以參數的形式傳入函數,當神經網路結構變得更加復雜、參數更多的時候,程序的可讀性將變得非常差。
第二,在程序退出時,訓練好的模型就無法再利用,且大型神經網路的訓練時間都比較長,在訓練過程中需要每隔一段時間保存一次模型訓練的中間結果,這樣如果在訓練過程中程序死機,死機前的最新的模型參數仍能保留,杜絕了時間和資源的浪費。
第三,將訓練和測試分成兩個獨立的程序,將訓練和測試都會用到的前向傳播的過程抽象成單獨的庫函數。這樣就保證了在訓練和預測兩個過程中所調用的前向傳播計算程序是一致的。
2. 改進後程序設計
mnist_inference.py
該文件中定義了神經網路的前向傳播過程,其中的多次用到的weights定義過程又單獨定義成函數。
通過tf.get_variable函數來獲取變數,在神經網路訓練時創建這些變數,在測試時會通過保存的模型載入這些變數的取值,而且可以在變數載入時將滑動平均值重命名。所以可以直接通過同樣的名字在訓練時使用變數自身,在測試時使用變數的滑動平均值。
mnist_train.py
該程序給出了神經網路的完整訓練過程。
mnist_eval.py
在滑動平均模型上做測試。
通過tf.train.get_checkpoint_state(mnist_train.MODEL_SAVE_PATH)獲取最新模型的文件名,實際是獲取checkpoint文件的所有內容。
E. 卷積神經網路演算法是什麼
一維構築、二維構築、全卷積構築。
卷積神經網路(Convolutional Neural Networks, CNN)是一類包含卷積計算且具有深度結構的前饋神經網路(Feedforward Neural Networks),是深度學習(deep learning)的代表演算法之一。
卷積神經網路具有表徵學習(representation learning)能力,能夠按其階層結構對輸入信息進行平移不變分類(shift-invariant classification),因此也被稱為「平移不變人工神經網路(Shift-Invariant Artificial Neural Networks, SIANN)」。
卷積神經網路的連接性:
卷積神經網路中卷積層間的連接被稱為稀疏連接(sparse connection),即相比於前饋神經網路中的全連接,卷積層中的神經元僅與其相鄰層的部分,而非全部神經元相連。具體地,卷積神經網路第l層特徵圖中的任意一個像素(神經元)都僅是l-1層中卷積核所定義的感受野內的像素的線性組合。
卷積神經網路的稀疏連接具有正則化的效果,提高了網路結構的穩定性和泛化能力,避免過度擬合,同時,稀疏連接減少了權重參數的總量,有利於神經網路的快速學習,和在計算時減少內存開銷。
卷積神經網路中特徵圖同一通道內的所有像素共享一組卷積核權重系數,該性質被稱為權重共享(weight sharing)。權重共享將卷積神經網路和其它包含局部連接結構的神經網路相區分,後者雖然使用了稀疏連接,但不同連接的權重是不同的。權重共享和稀疏連接一樣,減少了卷積神經網路的參數總量,並具有正則化的效果。
在全連接網路視角下,卷積神經網路的稀疏連接和權重共享可以被視為兩個無限強的先驗(pirior),即一個隱含層神經元在其感受野之外的所有權重系數恆為0(但感受野可以在空間移動);且在一個通道內,所有神經元的權重系數相同。
F. 如何調整一個不收斂的卷積神經網路
卷積神經網路(ConvolutionalNeuralNetwork,CNN)是一種前饋神經網路,它的人工神經元可以響應一部分覆蓋范圍內的周圍單元,對於大型圖像處理有出色表現。[1]它包括卷積層(alternatingconvolutionallayer)和池層(poolinglayer)。卷積神經網路是近年發展起來,並引起廣泛重視的一種高效識別方法。20世紀60年代,Hubel和Wiesel在研究貓腦皮層中用於局部敏感和方向選擇的神經元時發現其獨特的網路結構可以有效地降低反饋神經網路的復雜性,繼而提出了卷積神經網路(ConvolutionalNeuralNetworks-簡稱CNN)。現在,CNN已經成為眾多科學領域的研究熱點之一,特別是在模式分類領域,由於該網路避免了對圖像的復雜前期預處理,可以直接輸入原始圖像,因而得到了更為廣泛的應用。K.Fukushima在1980年提出的新識別機是卷積神經網路的第一個實現網路。隨後,的科研工作者對該網路進行了改進。其中,具有代表性的研究成果是Alexander和Taylor提出的「改進認知機」,該方法綜合了各種改進方法的優點並避免了耗時的誤差反向傳播。
G. 關於卷積神經網路對一維信號的特徵提取問題
你好,對信號的特徵提取在數學上看其實就是做一個濾波的運算,實際上都是通過卷積來實現的。下面是一個matlab的實現:
function r= my_conv(a, b)
m=length(a);
n=length(b);
r=zeros(1, m+n-1);
for k = 1:m
c = a(k)*b;
d = r(1, k:k+n-1);
d = d+c;
r(1, k:k+n-1) = d;
end
H. 卷積神經網路中的learn rate是怎麼設置的
學習率的作用是不斷調整權值閾值。對於traingdm等函數建立的BP網路,學習速率一般取0.01-0.1之間。
I. 怎樣用python構建一個卷積神經網路
用keras框架較為方便
首先安裝anaconda,然後通過pip安裝keras
以下轉自wphh的博客。
#coding:utf-8
'''
GPUruncommand:
THEANO_FLAGS=mode=FAST_RUN,device=gpu,floatX=float32pythoncnn.py
CPUruncommand:
pythoncnn.py
2016.06.06更新:
這份代碼是keras開發初期寫的,當時keras還沒有現在這么流行,文檔也還沒那麼豐富,所以我當時寫了一些簡單的教程。
現在keras的API也發生了一些的變化,建議及推薦直接上keras.io看更加詳細的教程。
'''
#導入各種用到的模塊組件
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
importnumpyasnp
np.random.seed(1024)#forreprocibility
#載入數據
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('relu'))
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(lr=0.05,decay=1e-6,momentum=0.9,nesterov=True)
model.compile(loss='categorical_crossentropy',optimizer=sgd,metrics=["accuracy"])
#調用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,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)])
"""