莫烦Tensorflow学习笔记(10-12)——构建简单的神经网络及其可视化
本筆記基于莫煩python的Tensorflow教程
個人認為莫煩大神的視頻教程不適合零基礎的小白,如果是小白可以先觀看李宏毅或者吳恩達的視頻或者直接看書。莫煩大神的教程適合對深度學習已經有一定的理論知識,但是欠缺代碼基礎的同學(比如說我),基本跟著莫煩寫一遍代碼下來,小編已經對tensorflow的運用有了一定的了解,也掌握了神經網絡一些訓練技巧。
以下對應莫煩視頻中的Tensorflow教程(10)(11)(12),小編會根據莫煩的講解加上我本人的理解進行記錄。
一、神經網絡的結構理解
這個教程的目的就是要建立一個最簡單的神經網絡。最簡單的神經網絡的結構就是只包含一個input layer(輸入層),一個hidden layer,一個output layer(輸出層)。每一層中都包含神經元,除了hidden layer 的神經元個數是一個超參數以外,輸入層和輸出層的神經元個數都是與輸入數據和輸出數據密切關聯的。比如說,該程序中定義輸入數據是:x_data,那么輸入層神經元的個數就與輸入數據的data的個數有關。注意!不是與data中的樣本數量有關!輸出層同理。
而隱藏層中的神經元個數也不宜過多,因為深度學習應該是體現在隱藏層的個數,如果在一層中神經元個數過多,那么就應該是廣度學習了。同樣重要的還有隱藏層的層數,盲目地添加隱藏層則會導致over fitting(過擬合)問題。所以隱藏層的設計是一個基于經驗的學問。
二、代碼詳解
1、添加層的建立 def add_layer()
def add_layer(inputs,in_size,out_size,activation_function=None):Weights=tf.Variable(tf.random_normal([in_size,out_size]))biases=tf.Variable(tf.zeros([1,out_size])+0.1)Wx_plus_b=tf.matmul(inputs,Weights)+biasesif activation_function is None:outputs=Wx_plus_belse:outputs=activation_function(Wx_plus_b)return outputs先定義函數作為后續創建輸入層,隱藏層和輸出層的基礎。在這里需要特別注意的是,在很多時候我們在定義bias時都會令bias=0,但是習慣上是不希望bias=0,所以會在biases后加上0.1,保證不為零。
對activation_function的判斷:在輸入層到隱藏層的連接當中,我們是需要使用activation_function將數據轉化為非線性的形式,但是在隱藏層到輸出層的連接當中,我們就不再需要激活函數。因為這里有一個判斷,當不需要激活函數時,直接輸出Wx_plus_b;需要時,就將Wx_plus_b經過激活函數再輸出。
2、數據導入和神經網絡建立
x_data=np.linspace(-1,1,300)[:,np.newaxis] noise=np.random.normal(0,0.05,x_data.shape) y_data=np.square(x_data)-0.5+noisexs=tf.placeholder(tf.float32,[None,1]) ys=tf.placeholder(tf.float32,[None,1]) l1=add_layer(xs,1,10,activation_function=tf.nn.relu)#l1 is an input layer #activation function is a relu function prediction=add_layer(l1,10,1,activation_function=None)#prediction is an hidden layerloss=tf.reduce_mean(tf.reduce_sum(tf.square(ys-prediction),reduction_indices=[1])) #loss function is based on MSE(mean square error) train_step=tf.train.GradientDescentOptimizer(0.1).minimize(loss)init=tf.global_variables_initializer() #initialize all variables sess=tf.Session() sess.run(init) #very important數據的導入我們采用了噪聲(noise)。采用noise是為了得到的y_data不是完全按照一元二次函數的走向得到的,y_data的結果必須具有隨機性,因此在bias位置上添加了noise,得到的y-x圖像如下圖所示:
在這里采用了tensorflow中的placeholder函數。placeholder()函數是在神經網絡構建graph的時候在模型中的占位,此時并沒有把要輸入的數據傳入模型,它只會分配必要的內存。等建立session,在會話中,運行模型的時候通過feed_dict()函數向占位符傳入數據。
采用placeholder的好處就是,可以自定義傳入數據的多少。在深度學習的訓練中,一般不會直接就對整個數據集進行訓練,例如隨機梯度下降(Stochastic Gradient Descent)是采取mini batch的方式對數據進行訓練。
3、神經網絡訓練可視化
在該程序中可視化使用的是matplotlib庫,并且動態顯示訓練結果。但莫煩的代碼直接在jupyter notebook上運行會發生只能顯示函數圖像,不能動態顯示圖像的問題。在youtube莫煩的視頻下的評論里,眾多小伙伴也反映無論是IDLE還是terminal或者是其他編譯環境,及時在前面加上%matplotlib inline也無法達到預期效果。小編遍尋數法,結合幾種方法找到了可以在jupyter notebook上動態顯示的方法。但此法要安裝Qt,jupyter 會使用Qt作為繪圖后端。
代碼如下:
%matplotlib #在導入庫的時候聲明fig=plt.figure() ax=fig.add_subplot(1,1,1) ax.scatter(x_data,y_data) plt.ion() plt.show()for i in range(2000):sess.run(train_step,feed_dict={xs:x_data,ys:y_data})if i%50==0:try:plt.pause(0.5)except Exception:passtry:ax.lines.remove(lines[0])plt.show()except Exception as e:passprediction_value=sess.run(prediction,feed_dict={xs:x_data})lines=ax.plot(x_data,prediction_value,'r-',lw=10)這是添加動態圖像后的訓練效果,紅色曲線就是由電腦訓練的曲線,藍色點的區域就是x、y點的真實值的區域。可以看到經過電腦訓練,我們可以得到一個大致符合區域走向的曲線。
以上就是該教程的全部內容,有問題歡迎大家在評論區里交流!
總結
以上是生活随笔為你收集整理的莫烦Tensorflow学习笔记(10-12)——构建简单的神经网络及其可视化的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 海康摄像头通过Ehome协议接入Easy
- 下一篇: 运用Fluxion高效破解WiFi密码