1. 程式人生 > >2 TensorFlow入門筆記之建造神經網路並將結果視覺化

2 TensorFlow入門筆記之建造神經網路並將結果視覺化

————————————————————————————————————

寫在開頭:此文參照莫煩python教程(牆裂推薦!!!)

————————————————————————————————————

TensorFlow之建造第一個神經網路

1 定義新增層

import tensorflow as tf

def add_layer(inputs,in_size,out_size,activation_function=None):
    Weights = tf.Variable(tf.random_normal([in_size,out_size]))#用隨機數來初始化Weights,這比全部為0要好,int_size行,out_size列
biases = tf.Variable(tf.zeros([1,out_size])+0.1) #1行,out_size列,均為0.1 Wx_plus_b = tf.matmul(inputs,Weights) + biases #預測出來但還沒啟用的值 if activation_function is None: #如果沒有啟用函式,則返回預測原值 outputs = Wx_plus_b else: outputs = activation_function(Wx_plus_b) #否則,返回預測值啟用之後的值 return
outputs

2 建立神經網路結構

import numpy as np
#生成資料
x_data = np.linspace(-1,1,300)[:,np.newaxis] #有300行,即一個特性,300個物件
noise = np.random.normal(0,0.05,x_data.shape) #加入噪音,用期望為0、方差為0.05的正態分佈的隨機數來建立
y_data = np.square(x_data)-0.5 + noise

#將輸入資料和輸出資料定義為placeholder
xs = tf.placeholder(tf.float32,[None,1])  #1為屬性數,None為隨意數都行
ys = tf.placeholder(tf.float32,[None,1]) #第一層layer,即輸入層,這裡只有一個神經元 #第二層layer,即隱藏層,這裡定義10個神經元 #第三層layer,這裡為輸出層,這裡有一個神經元 #下面增加第二層,即這裡的隱藏層 l1 = add_layer(xs,1,10,activation_function=tf.nn.relu) #下面定義輸出層 prediction = add_layer(l1,10,1,activation_function=None) #計算損失 loss = tf.reduce_mean(tf.reduce_sum(tf.square(ys -prediction),reduction_indices=[1]))#求和之後求平均 #訓練 train_step = tf.train.GradientDescentOptimizer(0.1).minimize(loss) #學習效率為0.1,學習效率一般小於1 #初始所有變數 init = tf.global_variables_initializer() sess = tf.Session() sess.run(init) for i in range(1000): sess.run(train_step,feed_dict={xs:x_data,ys:y_data}) if i % 50 == 0: print(sess.run(loss,feed_dict={xs:x_data,ys:y_data})) #列印誤差,如果誤差不斷減小,則模型有不斷學習
0.32276458
0.012201915
0.0066840313
0.0057683536
0.0053448635
0.0050948677
0.004914441
0.004781631
0.0046798103
0.0046042935
0.004543632
0.0044809543
0.0044029644
0.0042897784
0.004155126
0.004016761
0.0038873414
0.003766319
0.0036393174
0.0035409257

由上面結果可知,誤差是越來越小的。這說明,這個網路是在不斷學習的

3 結果視覺化

#在上面的for之前加入一些繪圖的程式碼,如下:
%matplotlib inline
import matplotlib.pyplot as plt #結果視覺化所用

#加入繪圖程式碼,先列印x_data和y_data
fig = plt.figure()
ax = fig.add_subplot(1,1,1)
ax.scatter(x_data,y_data)
plt.ion()  #使show()後不會暫停程式
#plt.show()

for i in range(1000):
    #訓練
    sess.run(train_step,feed_dict={xs:x_data,ys:y_data})
    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)  #繪製預測值的曲線,紅色,線框為5
        #ax.lines.remove(lines[0]) #抹除掉第一個線段
        plt.pause(1) #暫停1秒

這裡應該是有一條紅色的線在不斷擬合這些藍點的。這裡只顯示了最後一條紅色的線

4 加速神經網路

  • SGD:把資料分塊,每次使用批量資料。雖然損失了一點精度,但速度大大加快了
  • Mmomentum:在更新W權值時加速。公式如下:
    m = b1*m - learning rate * dx;
    W += m
  • AdaGrad:在更新W權值時加速。公式如下:
    v += pow(dx,2)
    W += -Learning rate * dx /sqrt(v)
  • RMSProp:在更新W權值時加速。公式如下:
    v = b1*v + (1-b1)*pow(dx,2)
    W += -Learning rate * dx/sqrt(v)
  • Adam:在更新W權值時加速。公式如下:(又快又好)
    m = b1*m +(1-b1)*dx
    v = b2*v + (1-b2)*pow(dx,2)
    W += -Learning tate *m/sqrt(v)

5 Optimizer優化器

TensorFlow有很多優化器,可以去tensorflow的官網查詢

#這裡列出幾種優化器:

tf.train.GradientDescentOptimizer  #初級常用
tf.train.AdadeltaOptimizer
tf.train.AdagradOptimizer
tf.train.MomentumOptimizer  #常用
tf.train.AdamOptimizer  #常用
tf.train.FtrlOptimizer
tf.train.RMSPropOptimizer #常用

6 網路視覺化工具:tensorboard

利用Tensorboard,可以很好的畫出我們的網路結構。下面以上面的例子為例,實踐一下。

#把上面的程式碼copy下來先
import tensorflow as tf

def add_layer(inputs,in_size,out_size,activation_function=None):
    with tf.name_scope('layer'):  #加入名字
        with tf.name_scope('weights'):
            Weights = tf.Variable(tf.random_normal([in_size,out_size]))#用隨機數來初始化Weights,這比全部為0要好,int_size行,out_size列
        with tf.name_scope('biases'):
            biases = tf.Variable(tf.zeros([1,out_size])+0.1) #1行,out_size列,均為0.1
        with tf.name_scope('Wx_plus_b'):
            Wx_plus_b = tf.matmul(inputs,Weights) + biases  #預測出來但還沒啟用的值
        if activation_function is None:  #如果沒有啟用函式,則返回預測原值
            outputs = Wx_plus_b
        else:
            outputs = activation_function(Wx_plus_b)  #否則,返回預測值啟用之後的值
        return outputs
import numpy as np
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

with tf.name_scope('input'):
    xs = tf.placeholder(tf.float32,[None,1],name='x_input')  #加入名字name 
    ys = tf.placeholder(tf.float32,[None,1],name='y_input')

#第一層layer,即輸入層,這裡只有一個神經元
#第二層layer,即隱藏層,這裡定義10個神經元
#第三層layer,這裡為輸出層,這裡有一個神經元

#下面增加第二層,即這裡的隱藏層
l1 = add_layer(xs,1,10,activation_function=tf.nn.relu)

#下面定義輸出層
prediction = add_layer(l1,10,1,activation_function=None)

#計算損失
with tf.name_scope('loss'):
    loss = tf.reduce_mean(tf.reduce_sum(tf.square(ys -prediction),reduction_indices=[1]),name='mean') 

#訓練
with tf.name_scope('train'):
    train_step = tf.train.GradientDescentOptimizer(0.1).minimize(loss) 

sess = tf.Session()
writer = tf.summary.FileWriter("desktop",sess.graph)
#初始所有變數
init = tf.global_variables_initializer()
sess.run(init)

這樣桌面便出現了events.out。但我在win10下無法開啟。

*點選[這兒:TensorFlow]發現更多關於TensorFlow的文章*