2019-04-07派森學(xué)習(xí)第139天

今天自己動(dòng)手寫一個(gè)簡(jiǎn)單的神經(jīng)網(wǎng)絡(luò)程序。

從中找到自己哪些還掌握的不夠好。

1?先定義添加層

剛開始不會(huì)寫添加層函數(shù)。

不會(huì)寫添加層函數(shù)

添加層函數(shù)包括:輸入數(shù)據(jù)inputs,輸入數(shù)據(jù)的維度in_size,輸出數(shù)據(jù)的維度out_size和激活函數(shù)activation_function。

在寫添加層函數(shù)的時(shí)候,出現(xiàn)了3個(gè)錯(cuò)誤。

添加層出現(xiàn)的錯(cuò)誤

1a:權(quán)重weights是將要建立的模型的輸入數(shù)據(jù)的權(quán)重系數(shù),需要用tf的Variable()方法定義,tf.random_normal()函數(shù)用于從服從指定正太分布的數(shù)值中取出指定個(gè)數(shù)的值,通過[in_size,out_size]確定產(chǎn)生的weights的尺寸。權(quán)重weights的數(shù)值相當(dāng)于通過標(biāo)準(zhǔn)正態(tài)分布的隨機(jī)數(shù)隨機(jī)產(chǎn)生。

1b:偏差biases不是設(shè)置成隨機(jī)產(chǎn)生的,而是初始化設(shè)置為zeros,通過[1,out_size]指定biases的尺寸。[1,out_size]表示biases在一開始知識(shí)一個(gè)0,到神經(jīng)網(wǎng)絡(luò)結(jié)束之后將會(huì)成為一個(gè)out_size尺寸的值。

1c:在判斷是否指定了激活函數(shù)時(shí),本來應(yīng)該是is,錯(cuò)寫成了==。但是用==也沒出現(xiàn)崩潰,只是在下面調(diào)用添加層函數(shù)的時(shí)候,出現(xiàn)了黃色陰影。

用==判斷時(shí)的黃色陰影

改成用is判斷,黃色陰影就會(huì)消失。那么is和==具體有什么區(qū)別呢?==比較兩個(gè)對(duì)象的值是否相等,而is比較的是兩個(gè)對(duì)象的id(對(duì)象的內(nèi)存地址)是否相等。詳見下圖:

is和==

2?設(shè)置訓(xùn)練數(shù)據(jù)

因?yàn)榇舜紊窠?jīng)網(wǎng)絡(luò)目的是訓(xùn)練出y=x^2-0.5這個(gè)函數(shù)模型。

所以先定義x軸的數(shù)據(jù)為np.linspace(-1,1,300),意思是在區(qū)間-1到1之間,均勻取出300個(gè)點(diǎn)作為輸入數(shù)據(jù)x_data的值。[:,np.newaxis]作用是將行數(shù)組變?yōu)榱袛?shù)組。

y_data的值就設(shè)置為x^2-0.5加上噪聲noise,這樣就更像正常的自然數(shù)據(jù)了。

設(shè)置訓(xùn)練數(shù)據(jù)

3?定義數(shù)據(jù)節(jié)點(diǎn)

現(xiàn)在開始才真正是進(jìn)入了神經(jīng)網(wǎng)絡(luò),通過tf中的placeholder()方法定義xs和ys數(shù)據(jù)節(jié)點(diǎn)。注意次數(shù)用到的placeholder要和之后sess中的feed_dict綁定了,也就是說出現(xiàn)了placeholder,則之后一定要用到feed_dict。

placeholder中的[None,1],None表示行數(shù)任意,列數(shù)為1。

placeholder

4?建立神經(jīng)層

建立隱藏層:先調(diào)用添加層函數(shù),輸入輸入數(shù)據(jù)xs,設(shè)置輸入的尺寸,輸出的尺寸和激活函數(shù)。

建立預(yù)測(cè)層:再調(diào)用添加層函數(shù),此時(shí)輸入數(shù)據(jù)是上邊的隱藏層的輸出,設(shè)置輸入的尺寸,輸出的尺寸和激活函數(shù)。

調(diào)用添加層函數(shù)

5?定義損失loss表達(dá)式

一開始不會(huì)定義loss的表達(dá)式。

loss等于預(yù)測(cè)值prediction和輸入值xs的差值的平方,然后相加起來,最后再求平均。

loss目標(biāo)函數(shù)

6?選擇合適的優(yōu)化器Optimizer

tf中有很多的優(yōu)化器,本次神經(jīng)網(wǎng)絡(luò)模型暫且選擇梯度下降優(yōu)化器,并設(shè)置學(xué)習(xí)效率為0.1,最終使loss最小。

Optimizer

7?初始化打開“開關(guān)”

上面的所有程序只是搭建了整個(gè)系統(tǒng),

就像造好了機(jī)器,但是還沒有打開開關(guān),機(jī)器還未運(yùn)行。

初始化開關(guān)

現(xiàn)在做好了一切開機(jī)前的準(zhǔn)備,并打開了開關(guān),機(jī)器開始運(yùn)行。

8?設(shè)置定時(shí)關(guān)閉

機(jī)器開始運(yùn)行后,給機(jī)器設(shè)置一個(gè)定時(shí)關(guān)閉,比如,此處設(shè)置了range(5000),可以看做是讓機(jī)器在5000s后停止運(yùn)行。

設(shè)置定時(shí)關(guān)閉

此處在寫程序的時(shí)候,把目標(biāo)函數(shù)寫錯(cuò)成了train_step,結(jié)果打印出來全是None值。

指針的目標(biāo)錯(cuò)誤

修改為loss之后,可以正常打印出loss的數(shù)值:

打印出loss的數(shù)值

好了,至此,一個(gè)簡(jiǎn)單的神經(jīng)網(wǎng)絡(luò)模型搭建完畢,并且成功訓(xùn)練了模型。

源碼如圖:

神經(jīng)網(wǎng)絡(luò)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容