給大家分享一個(gè)案例,如何使用tensorflow 構(gòu)建一個(gè)簡(jiǎn)單神經(jīng)網(wǎng)絡(luò)。首先我們需要?jiǎng)?chuàng)建我們的樣本,由于是監(jiān)督學(xué)習(xí),所以還是需要label的。為了簡(jiǎn)單起見,我們只創(chuàng)建一個(gè)樣本進(jìn)行訓(xùn)練, 可以當(dāng)做是在模擬隨機(jī)梯度下降的過程
。 代碼如下:
x = tf.constant([[0.7,0.9]])
y_ = tf.constant([[1.0]])
我們使用tf中的常量來創(chuàng)建樣本和label。 這是一個(gè)有兩個(gè)特征的樣本。
然后定義每一層的權(quán)重和偏差變量
w1 = tf.Variable(tf.random_normal([2,3], stddev=1, seed=1))
w2 = tf.Variable(tf.random_normal([3,1], stddev=1, seed=1))
b1 = tf.Variable(tf.zeros([3]))
b2 = tf.Variable(tf.zeros([1]))
根據(jù)上一節(jié)講的內(nèi)容,我們使用tf的變量來生成權(quán)重和偏差。
我們的神經(jīng)網(wǎng)絡(luò)模型大概如下圖:
上面我們嘗試創(chuàng)建一個(gè)只有兩個(gè)特征的輸入層, 只有一層,3個(gè)神經(jīng)元的隱藏層,以及最后的輸出層。 由于我們要做的是二分類,所以輸出層只有一個(gè)神經(jīng)元。
前向傳播算法
好了現(xiàn)在我們可以來看看前向傳播了,如果對(duì)前向傳播還不太了解的話,請(qǐng)復(fù)習(xí)一下深度學(xué)習(xí)的基礎(chǔ)概念~ 這里只做簡(jiǎn)單的介紹。 首先在輸入層我們有兩個(gè)特征輸入就是x1和x2,他們都會(huì)傳遞給隱藏層的3個(gè)神經(jīng)元中進(jìn)行訓(xùn)練。
每一個(gè)神經(jīng)元都是輸入層取值的加權(quán)和,就像圖出計(jì)算的一樣,分別計(jì)算出a11,a12和a13. 同樣的輸出層的計(jì)算是上一層的每一個(gè)神經(jīng)元的取值的加權(quán)和,也正如上圖計(jì)算的一樣。這就是整個(gè)的前向傳播算法,上一層的計(jì)算結(jié)果是下一層的輸入,以此類推。對(duì)數(shù)學(xué)比較熟悉的同學(xué)一定猜到了,權(quán)重(w)的計(jì)算過程就是一個(gè)矩陣乘法。 首先是由x1和x2組成1*2的矩陣, 以及隱藏層的每一個(gè)神經(jīng)元上對(duì)應(yīng)的權(quán)重(w) 組合的2*3的矩陣(2個(gè)輸入特征的w,3個(gè)神經(jīng)元),他們兩個(gè)做矩陣乘法就是這一層的前向傳播算法,結(jié)果是一個(gè)1*3的矩陣。再接著跟輸出層的3*1的矩陣(3個(gè)輸入特征的w和1個(gè)神經(jīng)元)繼續(xù)做矩陣乘法。就是最后的結(jié)果。 很幸運(yùn)的是tf為我們實(shí)現(xiàn)了做矩陣乘法的函數(shù)就是matmul。 那么上面這個(gè)前向傳播的過程就是如下的代碼:
a = tf.nn.relu(tf.matmul(x,w1) + b1)
y = tf.matmul(a, w2) + b2
我們?cè)谠缙诘奶又姓f過神經(jīng)網(wǎng)絡(luò)的每一層都有一個(gè)激活函數(shù),我們分類問題的時(shí)候都會(huì)加入激活函數(shù)來增加非線性效果。那么上面可以看到我們使用tf.nn.relu這個(gè)tf為我們實(shí)現(xiàn)好的激活函數(shù)來給我們的隱藏層前向傳播算法增加非線性。 輸出層y沒有用到激活函數(shù),我們之后會(huì)說明。
損失函數(shù)
我們需要一個(gè)損失函數(shù)來計(jì)算我們預(yù)測(cè)的結(jié)果與真實(shí)值的差距。 tf為我們實(shí)現(xiàn)了眾多的損失函數(shù)。由于這我們要做二分類問題,那么我們就需要sigmoid作為激活函數(shù),所以我們也要使用tf為sigmoid實(shí)現(xiàn)的損失函數(shù)。
cost = tf.nn.sigmoid_cross_entropy_with_logits(logits=y, labels=y_, name=None)
sigmoid_cross_entropy_with_logits的第一個(gè)參數(shù)是我們的預(yù)測(cè)值,第二個(gè)參數(shù)是真實(shí)的值,也就是我們的labels。 剛才我們計(jì)算前向傳播的時(shí)候再輸出層并沒有使用任何激活函數(shù),是因?yàn)槲覀僼f的損失函數(shù)中會(huì)給輸出層加入相應(yīng)的激活函數(shù)。 也就是sigmoid_cross_entropy_with_logits已經(jīng)給輸出層加入了sigmoid激活函數(shù)了。
反向傳播與梯度下降
為了實(shí)現(xiàn)梯度下降算法,我們需要進(jìn)行反向傳播計(jì)算來求得每一個(gè)參數(shù)對(duì)應(yīng)損失函數(shù)的導(dǎo)數(shù)。所幸的是tf同樣為我們提供了各種優(yōu)化的反向傳播算法。 這里我們使用專門的梯度下降。如下:
train_op = tf.train.GradientDescentOptimizer(0.01).minimize(cost)
GradientDescentOptimizer是梯度下降的優(yōu)化算法,參數(shù)是學(xué)習(xí)率,這里我們?cè)O(shè)置為0.01。 同時(shí)優(yōu)化目標(biāo)是最小化損失函數(shù)。 所以是minimize函數(shù),并且把損失函數(shù)作為參數(shù)傳遞過去。
開始訓(xùn)練
with tf.Session() as sess:
init = tf.initialize_all_variables()
sess.run(init)
for i in range(100):
sess.run(train_op)
print(sess.run(w1))
print(sess.run(w2))
之前的帖子說過tf是圖計(jì)算。 我們之前做的所有的操作都不會(huì)產(chǎn)生實(shí)際的計(jì)算效果。而是在tf中維護(hù)一個(gè)默認(rèn)的圖, 當(dāng)我們顯示的使用tf的session.run的時(shí)候才會(huì)去計(jì)算整個(gè)圖中的每一個(gè)幾點(diǎn)。 上面我們聲明一個(gè)Session,并在一開始初始化所有的變量, 循環(huán)100次代表訓(xùn)練100輪迭代。 最后輸出訓(xùn)練處的所有的w。
完整的代碼
import tensorflow as tf
import numpy as np
x = np.arange(4, dtype=np.float32).reshape(2,2) # 使用np來創(chuàng)造兩個(gè)樣本
y_ = np.array([0,1], dtype=np.float32).reshape(2,1) # 使用np來創(chuàng)造兩個(gè)label
w1 = tf.Variable(tf.random_normal([2,3], stddev=1, seed=1))
w2 = tf.Variable(tf.random_normal([3,1], stddev=1, seed=1))
b1 = tf.Variable(tf.zeros([3]))
b2 = tf.Variable(tf.zeros([1]))
a = tf.nn.relu(tf.matmul(x,w1) + b1)
y = tf.matmul(a, w2) + b2
cost = tf.nn.sigmoid_cross_entropy_with_logits(logits=y, labels=y_, name=None)
train_op = tf.train.GradientDescentOptimizer(0.01).minimize(cost)
with tf.Session() as sess:
init = tf.initialize_all_variables()
sess.run(init)
for i in range(100):
sess.run(train_op)
print(sess.run(w1))
print(sess.run(w2))
以上就是使用tensorflow 構(gòu)建一個(gè)簡(jiǎn)單神經(jīng)網(wǎng)絡(luò)的方法.
-
神經(jīng)網(wǎng)絡(luò)
+關(guān)注
關(guān)注
42文章
4814瀏覽量
103510 -
tensorflow
+關(guān)注
關(guān)注
13文章
330瀏覽量
61160
發(fā)布評(píng)論請(qǐng)先 登錄
TF之CNN:Tensorflow構(gòu)建卷積神經(jīng)網(wǎng)絡(luò)CNN的嘻嘻哈哈事之詳細(xì)攻略
【案例分享】ART神經(jīng)網(wǎng)絡(luò)與SOM神經(jīng)網(wǎng)絡(luò)
高階API構(gòu)建模型和數(shù)據(jù)集使用
【AI學(xué)習(xí)】第3篇--人工神經(jīng)網(wǎng)絡(luò)
如何移植一個(gè)CNN神經(jīng)網(wǎng)絡(luò)到FPGA中?
如何構(gòu)建神經(jīng)網(wǎng)絡(luò)?
一步一步學(xué)用Tensorflow構(gòu)建卷積神經(jīng)網(wǎng)絡(luò)

用TensorFlow寫個(gè)簡(jiǎn)單的神經(jīng)網(wǎng)絡(luò)

谷歌正式發(fā)布TensorFlow 圖神經(jīng)網(wǎng)絡(luò)
如何構(gòu)建神經(jīng)網(wǎng)絡(luò)

評(píng)論