今天自己動(dòng)手寫一個(gè)簡(jiǎn)單的神經(jīng)網(wǎng)絡(luò)程序。
從中找到自己哪些還掌握的不夠好。
1?先定義添加層
剛開始不會(huì)寫添加層函數(shù)。

添加層函數(shù)包括:輸入數(shù)據(jù)inputs,輸入數(shù)據(jù)的維度in_size,輸出數(shù)據(jù)的維度out_size和激活函數(shù)activation_function。
在寫添加層函數(shù)的時(shí)候,出現(xiàn)了3個(gè)錯(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)了黃色陰影。

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

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ù)了。

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。

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

5?定義損失loss表達(dá)式
一開始不會(huì)定義loss的表達(dá)式。
loss等于預(yù)測(cè)值prediction和輸入值xs的差值的平方,然后相加起來,最后再求平均。

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

7?初始化打開“開關(guān)”
上面的所有程序只是搭建了整個(gè)系統(tǒng),
就像造好了機(jī)器,但是還沒有打開開關(guān),機(jī)器還未運(yù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í)候,把目標(biāo)函數(shù)寫錯(cuò)成了train_step,結(jié)果打印出來全是None值。

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

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