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

2021-07-11 15:46:03 字數 3182 閱讀 4228

我把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提供了比較簡單而實用的深度學習框架,其模型簡單求導簡便等很多的優勢使得在處理神經網路引數時候特別有用。

Theano深度學習系列1

最近將英文原版書籍 python for data analysis 看完,也將 scikit learn cookbook 例子實現完,對基本的機器學習有一定的了解,下面來學習強大的python深度學習庫theano以及keras。import numpy import theano import...

深度學習(2)安裝theano

環境 ubuntu 16.04 硬體 伺服器,顯示卡 4塊1080ti 我通過anaconda的方式來安裝,基於anaconda環境隔離,自動安裝依賴包等等的特點,用anaconda裝theano非常方便,不熟悉anaconda的可以參考我的部落格 ubuntu下安裝anaconda anacond...

深度學習工具包之 theano的安裝

最近要寫卷積神經網路的程式,需要安裝theano,在網上找了半天安裝攻略,最後找到了一片好文 我這個對安裝程式十分反感的小白,居然在這篇文章的指導下用半天時間就安裝好了,可見這篇文章講的有多好。tips 這個錯誤博文裡沒有遇到,網上也沒搜到方法,我閒著無聊,用命令 conda install min...