Keras學習(一)

看見知乎上說Keras不錯,基於Python的,後臺是基於Theano或Tensorflow。

安裝

環境:ubuntu14.04
首先,安裝python環境、theano和keras

sudo apt-get install python-numpy python-scipy python-dev python-pip python-nose g++ libopenblas-dev git
sudo pip install Theano
sudo pip install keras

數據及代碼準備

根據博客,下載mnist.zip數據及github上的cnn.py和data.py,解壓到同一個目錄下:
這裏寫圖片描述
注意:keras默認的後臺是tensorflow,改成theano,修改~/.keras/keras.json文件即可:
這裏寫圖片描述
image_dim_ordering和backend兩個參數都要修改(默認是tf和tensorflow)。

訓練CNN模型

執行python cnn.py文件,即可執行訓練:
這裏寫圖片描述
跑了10個epoch,準確率將近99%!
下面通過代碼看看CNN長得啥樣:

###############
#開始建立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(lr=0.05, decay=1e-6, momentum=0.9, nesterov=True)
model.compile(loss='categorical_crossentropy', optimizer=sgd)


#調用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)

參考文章:http://blog.csdn.net/zhoubl668/article/details/45559955
keras中文文檔:http://keras-cn.readthedocs.io/en/latest/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章