您好,登錄后才能下訂單哦!
本篇文章主要通過一個(gè)簡(jiǎn)單的例子來實(shí)現(xiàn)神經(jīng)網(wǎng)絡(luò)。訓(xùn)練數(shù)據(jù)是隨機(jī)產(chǎn)生的模擬數(shù)據(jù)集,解決二分類問題。
下面我們首先說一下,訓(xùn)練神經(jīng)網(wǎng)絡(luò)的一般過程:
1.定義神經(jīng)網(wǎng)絡(luò)的結(jié)構(gòu)和前向傳播的輸出結(jié)果
2.定義損失函數(shù)以及反向傳播優(yōu)化的算法
3.生成會(huì)話(Session)并且在訓(xùn)練數(shù)據(jù)上反復(fù)運(yùn)行反向傳播優(yōu)化算法
要記住的一點(diǎn)是,無論神經(jīng)網(wǎng)絡(luò)的結(jié)構(gòu)如何變化,以上三個(gè)步驟是不會(huì)改變的。
完整代碼如下:
import tensorflow as tf #導(dǎo)入TensorFlow工具包并簡(jiǎn)稱為tf from numpy.random import RandomState #導(dǎo)入numpy工具包,生成模擬數(shù)據(jù)集 batch_size = 8 #定義訓(xùn)練數(shù)據(jù)batch的大小 w1 = tf.Variable(tf.random_normal([2,3],stddev=1,seed=1)) w2 = tf.Variable(tf.random_normal([3,1],stddev=1,seed=1)) #分別定義一二層和二三層之間的網(wǎng)絡(luò)參數(shù),標(biāo)準(zhǔn)差為1,隨機(jī)產(chǎn)生的數(shù)保持一致 x = tf.placeholder(tf.float32,shape=(None,2),name='x-input') y_ = tf.placeholder(tf.float32,shape=(None,1),name='y-input') #輸入為兩個(gè)維度,即兩個(gè)特征,輸出為一個(gè)標(biāo)簽,聲明數(shù)據(jù)類型float32,None即一個(gè)batch大小 #y_是真實(shí)的標(biāo)簽 a = tf.matmul(x,w1) y = tf.matmul(a,w2) #定義神經(jīng)網(wǎng)絡(luò)前向傳播過程 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) #定義損失函數(shù)和反向傳播算法 rdm = RandomState(1) dataset_size = 128 #產(chǎn)生128組數(shù)據(jù) X = rdm.rand(dataset_size,2) Y = [[int(x1+x2 < 1)] for (x1,x2) in X] #將所有x1+x2<1的樣本視為正樣本,表示為1;其余為0 #創(chuàng)建會(huì)話來運(yùn)行TensorFlow程序 with tf.Session() as sess: init_op = tf.global_variables_initializer() #初始化變量 sess.run(init_op) print(sess.run(w1)) print(sess.run(w2)) #打印出訓(xùn)練網(wǎng)絡(luò)之前網(wǎng)絡(luò)參數(shù)的值 STEPS = 5000 #設(shè)置訓(xùn)練的輪數(shù) for i in range(STEPS): start = (i * batch_size) % dataset_size end = min(start+batch_size,dataset_size) #每次選取batch_size個(gè)樣本進(jìn)行訓(xùn)練 sess.run(train_step,feed_dict={x:X[start:end],y_:Y[start:end]}) #通過選取的樣本訓(xùn)練神經(jīng)網(wǎng)絡(luò)并更新參數(shù) if i%1000 == 0: total_cross_entropy = sess.run(cross_entropy,feed_dict={x:X,y_:Y}) print("After %d training step(s),cross entropy on all data is %g" % (i,total_cross_entropy)) #每隔一段時(shí)間計(jì)算在所有數(shù)據(jù)上的交叉熵并輸出,隨著訓(xùn)練的進(jìn)行,交叉熵逐漸變小 print(sess.run(w1)) print(sess.run(w2)) #打印出訓(xùn)練之后神經(jīng)網(wǎng)絡(luò)參數(shù)的值
運(yùn)行結(jié)果如下:
結(jié)果說明:
首先是打印出訓(xùn)練之前的網(wǎng)絡(luò)參數(shù),也就是隨機(jī)產(chǎn)生的參數(shù)值,然后將訓(xùn)練過程中每隔1000次的交叉熵輸出,發(fā)現(xiàn)交叉熵在逐漸減小,說明分類的性能在變好。最后是訓(xùn)練網(wǎng)絡(luò)結(jié)束后網(wǎng)絡(luò)的參數(shù)。
分享一個(gè)圖形化神經(jīng)網(wǎng)絡(luò)訓(xùn)練過程的網(wǎng)站:點(diǎn)這里,可以自己定義網(wǎng)絡(luò)參數(shù)的大小,層數(shù)以及學(xué)習(xí)速率的大小,并且訓(xùn)練過程會(huì)以很直觀的形式展示出來。比如:
以上對(duì)于神經(jīng)網(wǎng)絡(luò)訓(xùn)練過程可以有一個(gè)很深刻的理解。
最后,再補(bǔ)充一些TensorFlow相關(guān)的知識(shí):
1.TensorFlow計(jì)算模型-計(jì)算圖
Tensor表示張量,可以簡(jiǎn)單的理解為多維數(shù)據(jù)結(jié)構(gòu);Flow則體現(xiàn)了它的計(jì)算模型。Flow翻譯過來是“流”,它直觀地表達(dá)了張量之間通過計(jì)算相互轉(zhuǎn)換的過程。TensorFlow中的每一個(gè)計(jì)算都是計(jì)算圖上的一個(gè)節(jié)點(diǎn),而節(jié)點(diǎn)之間的邊描述了計(jì)算之間的依賴關(guān)系。
指定GPU方法,命令如下:
import tensorflow as tf a = tf.constant([1.0,2.0],name=“a”) b = tf.constant([3.0,4.0],name=“b”) g = tf.Graph() with g.device(/gpu:0): result = a + b sess = tf.Session() sess.run(result)
2.TensorFlow數(shù)據(jù)模型-張量
張量是管理數(shù)據(jù)的形式。零階張量表示標(biāo)量,第一階張量為向量,也就是一維數(shù)組,一般來說,第n階張量可以理解為一個(gè)n維數(shù)組。張量本身不存儲(chǔ)運(yùn)算的結(jié)果,它只是得到對(duì)結(jié)果的一個(gè)引用??梢允褂胻f.Session().run(result)語句來得到計(jì)算結(jié)果。
3.TensorFlow運(yùn)行模型-會(huì)話
我們使用session來執(zhí)行定義好的運(yùn)算。
主要有以下兩種方式,第一種會(huì)產(chǎn)生內(nèi)存泄漏,第二種不會(huì)有這種問題。
#創(chuàng)建一個(gè)會(huì)話 sess = tf.Session() sess.run(…) #關(guān)閉會(huì)話使得本次運(yùn)行中使用的資源得到釋放 sess.close()
第二種方式是通過Python的上下文資源管理器來使用會(huì)話。
with tf.Session() as sess: sess.run(…)
此種方式自動(dòng)關(guān)閉和自動(dòng)進(jìn)行資源的釋放
4.TensorFlow-神經(jīng)網(wǎng)絡(luò)例子
使用神經(jīng)網(wǎng)絡(luò)解決分類問題可以分為以下四個(gè)步驟:
①提取問題中實(shí)體的特征向量作為輸入。
②定義神經(jīng)網(wǎng)絡(luò)的結(jié)構(gòu),并定義如何從神經(jīng)網(wǎng)絡(luò)的輸入得到輸出。這個(gè)過程就是神經(jīng)網(wǎng)絡(luò)的前向傳播算法。
③通過訓(xùn)練數(shù)據(jù)來調(diào)整神經(jīng)網(wǎng)絡(luò)中參數(shù)的設(shè)置,這就是訓(xùn)練網(wǎng)絡(luò)的過程。
④使用訓(xùn)練好的神經(jīng)網(wǎng)絡(luò)來預(yù)測(cè)未知的數(shù)據(jù)
在TensorFlow中聲明一個(gè)2*3的矩陣變量的方法:
weight = tf.Variable(tf.random_normal([2,3],stddev=2))
即表示為方差為0、標(biāo)準(zhǔn)差為2的正態(tài)分布
在TensorFlow中,一個(gè)變量的值在被使用之前,這個(gè)變量的初始化過程需要被明確調(diào)用。一下子初始化所有的變量
sess = tf.Session()
init_op = tf.initialize_all_variables()
或者換成init_op = tf.global_variables_initializer()也可
sess.run(init_op)
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持億速云。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。