深度學習之四:使用Theano編寫神經網絡

上一篇說到windows下面的Theano安裝,在前面的文章中也介紹了幾種常見的神經網絡形式,今天就使用Theano來編寫一個簡單的神經網絡

 

我把Theano形容成一個模子,這個模子提供了一些計算方法,然後我們只需要定義模子的形狀和填充數據就可以了,且慢慢看:

 

首先我們定義初始數據集:

np.random.seed(0)
train_X, train_y = datasets.make_moons(300, noise=0.20)
train_X = train_X.astype(np.float32)
train_y = train_y.astype(np.int32)
num_example=len(train_X)

 train_X是隨機產生的二維的數,train_y是一個隨機產生一維的數(只有0和1這兩個值),train_y算是一個標籤,train_X和train_y的長度都是300

 

然後設置神經網絡的基本參數:

#設置參數
nn_input_dim=2 #輸入神經元個數
nn_output_dim=2 #輸出神經元個數
nn_hdim=100
#梯度下降參數
epsilon=0.01 #learning rate
reg_lambda=0.01 #正則化長度

 也就是 2*100*2的三層神經網絡,學習率是0.01,正則化因子lambda值是0.01

 

接下來是重點,因爲在迭代過程中,w1,b1,w2,b2都是共享變量,這就需要使用Theano的share變量

w1=theano.shared(np.random.randn(nn_input_dim,nn_hdim),name="W1")
b1=theano.shared(np.zeros(nn_hdim),name="b1")
w2=theano.shared(np.random.randn(nn_hdim,nn_output_dim),name="W2")
b2=theano.shared(np.zeros(nn_output_dim),name="b2")

這表明這四個參數在訓練過程中是共享的

 

OK,數據的事情已經具備了,我們現在可以來“雕刻模子”了:


#前饋算法
X=T.matrix('X')  #double類型的矩陣
y=T.lvector('y') #int64類型的向量
z1=X.dot(w1)+b1   #1
a1=T.tanh(z1)     #2
z2=a1.dot(w2)+b2  #3
y_hat=T.nnet.softmax(z2) #4
#正則化項
loss_reg=1./num_example * reg_lambda/2 * (T.sum(T.square(w1))+T.sum(T.square(w2))) #5
loss=T.nnet.categorical_crossentropy(y_hat,y).mean()+loss_reg  #6
#預測結果
prediction=T.argmax(y_hat,axis=1) #7

首先我們定義一個輸入矩陣的模子,名字叫X

然後定義一個標籤數據的模子,名字叫做y

#1~#4定義的是神經網絡的前饋過程

#5是正則項的計算值

#6是計算交叉熵的損失值和正則項損失值的和

 

這些都是我們定義的模子,一旦我們填入數據之後就能算了,那麼現在問題來了,這些模子如何和Python code聯繫起來,下面的代碼可以解決:

forword_prop=theano.function([X],y_hat)
calculate_loss=theano.function([X,y],loss)
predict=theano.function([X],prediction)

forword_prop=theano.function([X],y_hat)爲例,我們在模子中計算了y_hat,而y_hat只需要輸入數據X,因此我們在python中可以直接使用forward_prop(X)來計算,其他的都同理。

 

接下來,Theano最爽的事情來了,就是求導。不要太簡單:

#求導
dw2=T.grad(loss,w2)
db2=T.grad(loss,b2)
dw1=T.grad(loss,w1)
db1=T.grad(loss,b1)

#更新值
gradient_step=theano.function(
    [X,y],
    updates=(
        (w2,w2-epsilon*dw2),
        (b2,b2-epsilon*db2),
        (w1,w1-epsilon*dw1),
        (b1,b1-epsilon*db1)

    )
)

 好了現在我們可以建立神經網絡模型了:

def build_model(num_passes=20000,print_loss=False):

    w1.set_value(np.random.randn(nn_input_dim, nn_hdim) / np.sqrt(nn_input_dim))
    b1.set_value(np.zeros(nn_hdim))
    w2.set_value(np.random.randn(nn_hdim, nn_output_dim) / np.sqrt(nn_hdim))
    b2.set_value(np.zeros(nn_output_dim))

    for i in xrange(0,num_passes):
        gradient_step(train_X,train_y)
        if print_loss and i%1000==0:
            print "Loss after iteration %i: %f" %(i,calculate_loss(train_X,train_y))

 這段代碼就是進行迭代的過程

 

看下結果:



 

正確率還是很高的。

 

 

總結:Theano提供了比較簡單而實用的深度學習框架,其模型簡單求導簡便等很多的優勢使得在處理神經網絡參數時候特別有用。



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