1. 程式人生 > 實用技巧 >莫煩tensorflow學習記錄 (3)建造我們第一個神經網路

莫煩tensorflow學習記錄 (3)建造我們第一個神經網路

另一個學習文件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/