莫煩tensorflow學習記錄 (3)建造我們第一個神經網路
阿新 • • 發佈:2020-10-13
另一個學習文件http://doc.codingdict.com/tensorflow/tfdoc/tutorials/overview.html
定義 add_layer()
https://mofanpy.com/tutorials/machine-learning/tensorflow/add-layer/
import tensorflow as tf def add_layer(inputs,in_size,out_size,activation_function=None): #定義新增神經層的函式def add_layer(),它有四個引數:輸入值、輸入的大小、輸出的大小和激勵函式,我們設定預設的激勵函式是None。# 因為在生成初始引數時,隨機變數(normal distribution)會比全部為0要好很多,所以我們這裡的weights為一個in_size行, out_size列的隨機變數矩陣。 Weights = tf.Variable(tf.random_normal([in_size,out_size])) # 機器學習中推薦biases不為0,所以加個0.1 biases = tf.Variable(tf.zeros([1,out_size])+ 0.1) # 定義Wx_plus_b, 即神經網路未啟用的值。其中,tf.matmul()是矩陣的乘法。 Wx_plus_b = tf.matmul(inputs, Weights) + biases# 當activation_function——激勵函式為None時,輸出就是當前的預測值——Wx_plus_b, # 不為None時,就把Wx_plus_b傳到activation_function()函式中得到輸出。 if activation_function is None: outputs = Wx_plus_b else: outputs = activation_function(Wx_plus_b) return outputs
建造神經網路
這次提到了怎樣建造一個完整的神經網路,包括新增神經層,計算誤差,訓練步驟,判斷是否在學習
import tensorflow as tf import numpy as np import matplotlib.pyplot as plt def add_layer(inputs,in_size,out_size,activation_function=None): #定義新增神經層的函式def add_layer(),它有四個引數:輸入值、輸入的大小、輸出的大小和激勵函式,我們設定預設的激勵函式是None。 # 因為在生成初始引數時,隨機變數(normal distribution)會比全部為0要好很多,所以我們這裡的weights為一個in_size行, out_size列的隨機變數矩陣。 Weights = tf.Variable(tf.random_normal([in_size,out_size])) # 機器學習中推薦biases不為0,所以加個0.1 biases = tf.Variable(tf.zeros([1,out_size])+ 0.1) # 定義Wx_plus_b, 即神經網路未啟用的值。其中,tf.matmul()是矩陣的乘法。 Wx_plus_b = tf.matmul(inputs, Weights) + biases # 當activation_function——激勵函式為None時,輸出就是當前的預測值——Wx_plus_b, # 不為None時,就把Wx_plus_b傳到activation_function()函式中得到輸出。 if activation_function is None: outputs = Wx_plus_b else: outputs = activation_function(Wx_plus_b) return outputs # 虛構一個所需的資料 # 這裡的x_data和y_data並不是嚴格的一元二次函式的關係, # 因為我們多加了一個noise,這樣看起來會更像真實情況。 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 + noise # y=x^2 -0.5 # 利用佔位符定義我們所需的神經網路的輸入。 tf.placeholder()就是代表佔位符, # 這裡的None代表無論輸入有多少都可以,因為輸入只有一個特徵,所以這裡是1。 xs = tf.placeholder(tf.float32, [None, 1]) ys = tf.placeholder(tf.float32, [None, 1]) # 建立2個隱藏層,輸入層只有一個特徵,建立2個隱藏層,每層10個神經元,輸出也是一個特徵,激勵函式用的tf.nn.relu,tf.nn.tanh.激勵函式有很多比如tf.nn.sigmoid l1 = add_layer(xs, 1, 10,activation_function=tf.nn.relu) l2 = add_layer(l1, 10, 10,activation_function=tf.nn.tanh) prediction = add_layer(l2,10,1,activation_function=None) # 輸出特徵 # 損失函式 # 計算預測值prediction和真實值的誤差,對二者差的平方求和再取平均。 loss = tf.reduce_mean(tf.reduce_sum(tf.square(ys - prediction),reduction_indices=[1])) #reduction_indices引數的值為1的時候,是第1維對應位置相加 # 練習 train_step = tf.train.GradientDescentOptimizer(0.1).minimize(loss) #訓練,採用梯度下降法,學習率為0.1優化的步長取值,學習方向減小loss # 初始化變數 init = tf.global_variables_initializer() # 上面所有的都還沒有執行 # 定義Session,並用 Session 來執行 init 初始化步驟。 # (注意:在tensorflow中,只有session.run()才會執行我們定義的運算。) sess = tf.Session() sess.run(init) # 這裡運行了init #視覺化 # Pycharm可以在【Settings】-->【Python Scientific】-->取消“Show plots……”的勾 fig = plt.figure() ax = fig.add_subplot(1,1,1) ax.scatter(x_data,y_data) plt.ion() # 使影象可動態 plt.show() # 這裡,我們讓機器學習1000次。機器學習的內容是train_step, # 用 Session 來 run 每一次 training 的資料,逐步提升神經網路的預測準確性。 # (注意:當運算要用到placeholder時,就需要feed_dict這個字典來指定輸入。) for i in range(1000): sess.run(train_step,feed_dict={xs:x_data,ys:y_data}) # 每50步我們輸出一下機器學習的誤差。 # 每隔50次訓練重新整理一次圖形,用紅色、寬度為5的線來顯示我們的預測資料和輸入之間的關係,並暫停0.1s。 if i % 50 == 0: print(sess.run(loss,feed_dict={xs:x_data,ys:y_data})) try: ax.lines.remove(lines[0]) except Exception: pass prediction_value = sess.run(prediction, feed_dict={xs:x_data}) lines = ax.plot(x_data, prediction_value, 'r-', lw=5) plt.pause(0.1) plt.pause(0) # 完成執行後圖片不消失
加速神經網路訓練 (Speed Up Training)
Tensorflow 中的優化器會有很多不同的種類。最基本, 也是最常用的一種就是GradientDescentOptimizer
。
在Google搜尋中輸入“tensorflow optimizer可以看到
Tensorflow
提供了7種優化器
各種優化器的特點https://mofanpy.com/tutorials/machine-learning/tensorflow/intro-speed-up-learning/