Tensorflow添加matplotlib可視化

經過matplotlib可視化, 咱們能夠更直觀的看到神經網絡的結果python

接下來的例子是擬合一個二次曲線,結合上一次構建簡單神經網絡的代碼網絡

 

#!/usr/bin/env python2
# -*- coding: utf-8 -*-
"""
簡單的神經網絡經過matplotlib可視化
"""

import tensorflow as tf
import numpy as np

#導入matplotlig
import matplotlib.pyplot as plt

def add_layer(input_value, in_size, out_size, activate_function=None):
    #權重
    Weights = tf.Variable(tf.random_normal([in_size, out_size]))
    #偏移量
    biases = tf.Variable(tf.zeros([1,out_size])+0.1)
    #wx+b
    Wx_plus_b = tf.matmul(input_value,Weights)+biases
    #有激活函數則使用激活函數計算下一層的值
    if activate_function is None:
        outputs = Wx_plus_b
    else:
        outputs = activate_function(Wx_plus_b)
    return outputs
    
#創造些簡單的數據
#建立一個300行數值在-1到1 之間的一個輸入向量
#np.linspace函數能夠生成元素爲300的等間隔數列
#np.newaxis的功能是插入新維度
x_data = np.linspace(-1, 1, 300)[:,np.newaxis]
#添加噪聲,模擬真實數據,數據格式和x同樣
noise = np.random.normal(0, 0.05, x_data.shape)
y_data = np.square(x_data)-0.5+noise

#定義placeholder做爲神經網絡的輸入
xs = tf.placeholder(tf.float32,[None,1])
ys = tf.placeholder(tf.float32,[None,1])

#添加隱藏層,隱藏層的單元數設爲10個,激活函數爲relu
l1 = add_layer(xs, 1, 10, activate_function=tf.nn.relu)

#添加輸出層,輸入數據爲最後一層隱藏層的輸出,激活函數線性函數
prediction = add_layer(l1, 10, 1, activate_function=None)

#定義損失函數,損失函數爲平方損失
#reduction_indices參數,表示函數的處理維度,
#沒有reduction_indices這個參數,此時該參數取默認值None,將把input_tensor降到0維,也就是一個數。
loss = tf.reduce_mean(tf.reduce_sum(tf.square(ys - prediction),reduction_indices=1))

#定義訓練的公式,tensorflow每執行一次都在重複執行這個訓練步驟, 
#優化方法是梯度降低法,學習速率是0.1
train_step = tf.train.GradientDescentOptimizer(0.1).minimize(loss)

#導入step
#tensorflow定義圖結構中有變量時必須先對變量進行初始化,激活變量
init = tf.initialize_all_variables()
sess = tf.Session()
sess.run(init)

'''
建立一個畫布
'''
fig = plt.figure()
ax = fig.add_subplot(1,1,1)
#添加輸入的散點圖
ax.scatter(x_data, y_data)
#設置block=False畫布循環,不然只展現一次,python3添加plt.ion()
plt.show(block=False)

#訓練迭代1000次
for i in range(1000):
    #訓練
    sess.run(train_step, feed_dict={xs : x_data, ys : y_data})
    #每50步輸出一下損失函數的優化狀況
    if i % 50 ==0:
        '''
        咱們須要展現的是預測值擬合的狀況,因此我須要run prediction
        remove(lines[0])是須要將前一個畫的線刪除,不然會留下全部的線
        lines[0]表示第一個
        '''
        try:
            ax.lines.remove(lines[0])
        except Exception:
            pass
        prediction_value = sess.run(prediction, feed_dict={xs : x_data})
        #設置預測值的樣式,紅色線條,線寬度爲5
        lines = ax.plot(x_data,prediction_value, 'r-', lw = 5)
        #設置暫停時間爲0.1,方便觀察
        plt.pause(0.1)

 
相關文章
相關標籤/搜索