用TensorFlow實現完整神經網路樣例程式

2021-10-02 03:17:18 字數 3700 閱讀 6437

該樣例程式再模擬資料集上訓練神經網路解決二分類問題。

#coding=utf-

8import tensorflow as tf

#numpy是乙個科學計算工具包,這裡通過numpy工具包生成模擬資料集

from numpy.random import randomstate

#定義訓練資料batch的大小

batch_size=

8#定義神經網路的引數

w1=tf.

variable

(tf.

random_normal([

2,3]

,stddev=

1,seed=1)

)w2=tf.

variable

(tf.

random_normal([

3,1]

,stddev=

1,seed=1)

)#在shape的乙個維度上使用none可以方便使用不大的batch大小。

#在訓練資料時需要把資料分成比較小的batch,但是在測試時,可以一次性使用全部資料。

#當資料集比較小時這樣比較方便測試,但資料集較大時,將大量資料放入乙個batch可能會導致記憶體溢位

x=tf.

placeholder

(tf.float32,shape=

(none,2)

,name=

'x-input'

)y_=tf.

placeholder

(tf.float32,shape=

(none,1)

,name=

'y-input'

)#定義神經網路前向傳播的過程。

a=tf.

matmul

(x,w1)

y=tf.

matmul

(a,w2)

#定義損失函式和反向傳播的演算法

cross_entropy=

-tf.

reduce_mean

(y_*tf.

log(tf.

clip_by_value

(y,1e-10

,1.0))

)train_step=tf.train.

adamoptimizer

(0.001).

minimize

(cross_entropy)

#通過隨機數生成乙個模擬資料集

rdm=

randomstate(1

)dataset_size=

128x

=rdm.

rand

(dataset_size,2)

#定義規則來給出樣本的標籤。在這裡所有x1+x2<

1的樣例都被認為是正樣本(比如零件合格),

#而其他為負樣本(比如零件不合格)。

#在這裡用0表示負樣本,用1來表示正樣本。大部分解決分類問題的神經網路都會採用

#0和1的表示方法。y=

[[int(x1+x2<1)

]for

(x1,x2)inx

]#建立乙個會話來執行tensorflow程式

with tf.

session()

as sess:

init_op=tf.

initialize_all_variables()

#初始化變數

sess.

run(init_op)

print

(sess.

run(w1)

)print

(sess.

run(w2)

)'''

訓練之間神經網路引數的值:

w1=[[

-0.81131822

1.48459876

0.06532937][

-2.4427042

0.0992484

0.59122431]]

w2=[[

-0.81131822][

1.48459876][

0.06532937]]

''' #設定訓練的輪數

steps

=5000

for i in

range

(steps):

#每次選取batch_size個樣本進行訓練

start=

(i*batch_size)

%dataset_size

end=

min(start+batch_size,dataset_size)

#通過選取的樣本訓練神經網路並更新引數

sess.

run(train_step,feed_dict=

)if i%

1000==0

: #每隔一段時間計算在所有資料上的交叉熵並輸出

total_cross_entropy=sess.

run(cross_entropy,feed_dict=

)print

("after %d training step(s),cross entropy on all data is %g"

%(i,total_cross_entropy)

)'''

輸出結果:

after 0 training step

(s),cross entropy on all data is 0.0674925

after 1000 training step

(s),cross entropy on all data is 0.0163385

after 2000 training step

(s),cross entropy on all data is 0.00907547

after 3000 training step

(s),cross entropy on all data is 0.00714436

after 4000 training step

(s),cross entropy on all data is 0.00578471

通過這個結果可以發現隨著訓練的進行,交叉熵是逐漸變小的。

交叉熵越**明**的結果和真實結果差距越小。

'''print

(sess.

run(w1)

)print

(sess.

run(w2)

)'''

在訓練之後神經網路引數的值:

w1=[[

-1.96182752

2.58235407

1.68203771][

-3.46817183

1.06982315

2.11788988]]

w2=[[

-1.82471502][

2.68546653][

1.41819501]]

可以發現兩個引數的取值已經發生了變化,這個變化就是訓練的結果。

它使得這個神經網路能更好地擬合提供的訓練資料

'''

上面的程式實現了訓練神經網路的全部過程。從這段程式中可以總結出訓練神經網路的過程可以分為以下3個步驟:

1.定義神經網路的結構和前向傳播的輸出結果。

2.定義損失函式及選擇反向傳播優化的演算法。

3.生成會話(tf.session)並且在訓練資料上反覆執行反向傳播優化演算法。

無論神經網路的結構如何變化,這3個步驟是不變的。

用TensorFlow實現iris資料集線性回歸

本文將遍歷批量資料點並讓tensorflow更新斜率和y截距。這次將使用scikit learn的內建iris資料集。特別地,我們將用資料點 x值代表花瓣寬度,y值代表花瓣長度 找到最優直線。選擇這兩種特徵是因為它們具有線性關係,在後續結果中將會看到。本文將使用l2正則損失函式。用tensorflo...

用TensorFlow實現戴明回歸演算法

如果最小二乘線性回歸演算法最小化到回歸直線的豎直距離 即,平行於y軸方向 則戴明回歸最小化到回歸直線的總距離 即,垂直於回歸直線 其最小化x值和y值兩個方向的誤差,具體的對比圖如下圖。線性回歸演算法和戴明回歸演算法的區別。左邊的線性回歸最小化到回歸直線的豎直距離 右邊的戴明回歸最小化到回歸直線的總距...

用TensorFlow實現簡單線性回歸

使用tensorflow 構造乙個神經元,簡單的線性回歸網路。問題 現有一組有雜訊的樣本資料,共2000個,每乙個樣本 x 有 3 個特徵,對應乙個標籤 y 值。從資料樣本中學習 y w x b y w times x b y w x b 中的引數 首先我們來生成樣本資料,w real 和 b re...