tensorflow:實戰Google深度學習框架第三章

tensorflow的計算模型:計算圖–tf.Graph 
tensorflow的數據模型:張量–tf.Tensor 
tensorflow的運行模型:會話–tf.Session 
tensorflow可視化工具:TensorBoard python

經過集合管理資源:tf.add_to_collection、tf.get_collection 算法

Tensor主要三個屬性:名字(name)、維度(shape)、類型(type) 數組

 

#張量,能夠簡單的理解爲多維數組

import tensorflow as tf a = tf.constant([1.0,2.0],name='a') b = tf.constant([3.0,4.0],name='b') result = tf.add(a,b,name="add") print(result) 輸出:Tensor("add:0", shape=(2,), dtype=float32)

會話Session須要關閉才能釋放資源,經過Python的上下文管理器 with ,能夠自動釋放資源 網絡

#建立會話,並經過上下文管理器來管理
with tf.Session() as sess: sess.run(result) #不須要Session.close()關閉會話 #上下文管理器退出,會話自動關閉

tensorflow設備:tf.device(‘/cpu:0’)、tf.device(‘/gpu:2’)dom

 

1、前向傳播算法:函數

須要三個部分:神經網絡的輸入,神經網絡的鏈接結構,每一個神經元的參數工具

將前向傳播算法使用矩陣乘法方式表示:學習

#將前向傳播算法使用矩陣乘法方式表示:
a = tf.matmul(x,w1)#x是輸入,w1是第一層的參數
y = tf.matmul(a,w2)#a是第一層的輸出。w2是第二層的神經元的參數

在tensorflow中變量(tf.Variable)的做用:保存和更新神經網絡的參數,變量須要指定初始值:優化

一、使用隨機數初始化spa

#定義2*3的矩陣變量
weights = tf.Variable(tf.random_normal([2,3], stddev=2))

其餘隨機數生成函數在表3-2

表3-2 TensorFlow隨機數生成函數

 

函數名稱 隨機數分佈 主要參數
tf.random_normal 正太分佈 平均值、標準差、取值類型
tf.truncated_normal 正太分佈,若是隨機出來的值偏離均值超過2個標準差,從新隨機 平均值、標準差、取值類型
tf.random_uniform 平均分佈 最小、最大取值、取值類型
tf.random_gamma Gamma分佈 形狀參數alpha、尺度參數beta、取值類型

 

二、使用常數初始化

import tensorflow as tf
#定義長度3的矩陣變量
weights = tf.Variable(tf.zeros([3]))#初始值爲0,長度爲3的變量

 

 

表3-3 TensorFlow常數生成函數

 

 

函數名稱 功能 樣例
tf.zeros 產生全0數組 tf.zeros([2,3],int32)–>[[0,0,0],[0,0,0]]
tf.ones 產生全1數組 tf.ones(2,3],int32)–>[[1,1,1],[1,1,1]]
tf.fill 產生一個給定值的數組 tf.fill([2,3],9)–>[[9,9,9],[9,9,9]]
tf.constant 產生一個給定值常量 tf.constant([1,2,3])–>[1,2,3]

 

三、使用其餘變量進行初始化

import tensorflow as tf
w2 = tf.Variable(weights.initialized_value())#將w2初始化爲與變量weights相同
w3 = tf.Variable(weights.initialized_value()*2)#將w2初始化爲變量weights值的2倍

一個變量在使用前,必須先初始化

*(推薦)使用tf.initialize_all_variables()初始化全部變量

with tf.Session() as sess:
    init_op = tf.global_variables_initializer()
    sess.run(init_op)

前向傳播算法實現

import tensorflow as tf

#聲明w1和w2兩個變量,使用seed參數設定隨機種子,保證每次產生的隨機數相同
w1 = tf.Variable(tf.random_normal([2,3], stddev=1,seed=1))
w2 = tf.Variable(tf.random_normal([3,1], stddev=1,seed=1))

#暫時將輸入定義爲常量,x爲1*2的矩陣
x = tf.constant([[0.7,0.9]])

#經過前向傳播算法得到輸出
a = tf.matmul(x,w1)
y = tf.matmul(a,w2)

with tf.Session() as sess:
    init_op = tf.global_variables_initializer()
    sess.run(init_op)#初始化全部變量
    print(sess.run(y))

全部的變量都被自動的加入tf.GraphKeys.VARIABLES,經過tf.all_variables()函數獲取當前計算圖的全部變量,

在神經網絡中能夠使用變量聲明函數中的trainable參數區分須要優化的參數(神經網絡參數或迭代輪數),如當trainable=True ,這個變量將加入集合tf.GraphKeys.TRAINABLE_VARIABLES中,能夠使用tf.trainable_variables()函數獲得全部可學習的變量

表3-1 TensorFlow維護的集合列表

 

集合名稱 集合內容 使用場景
tf.GraphKeys.VARIABLES 全部變量 持久化TensorFlow模型
tf.GraphKeys.TRAINABLE_VARIABLES 可學習的變量 模型訓練、生成模型可視化內容
tf.GraphKeys.SUMMARIES 日誌生成相關張量 TensorFlow計算可視化
tf.GraphKeys.QUEUE_RUNNERS 處理輸入的QueueRunner 輸入處理
tf.GRaphKeys.MOVING_AVEGAGE_VARIABLES 全部計算了滑動平均值的變量 計算變量的滑動平均值

 2、反向傳播算法

一、上面咱們使用x = tf.contant([[0.7,0.9]])表達訓練數據,若都使用常量,計算圖將很是大(一個常量,計算圖增長一個節點),利用率低,故tensorflow提供placeholder機制提供輸入數據

placeholder機制:

定義一個位置,這個位置中的數據在程序運行時再指定

定義時,數據類型須要指定(指定後不可改變)

例如使用placeholder實現前向傳播算法:

import tensorflow as tf

w1 = tf.Variable(tf.random_normal([2,3], stddev=1,seed=1))
w2 = tf.Variable(tf.random_normal([3,1], stddev=1,seed=1))

#定義placeholder存放輸入數據,指定維度下降出錯概率(能夠不指定)
x = tf.placeholder(tf.float32, shape=(1, 2), name="x")

#經過前向傳播算法得到輸出
a = tf.matmul(x,w1)
y = tf.matmul(a,w2)

with tf.Session() as sess:
    init_op = tf.global_variables_initializer()
    sess.run(init_op)#初始化全部變量
    #feed_dict是一個字典,,在字典給出placeholder的取值
    print(sess.run(y,feed_dict={x:[[0.7,0.9]]}))

二、獲得前向傳播的結果後,須要定義一個損失函數表示預測值與真實值的差距,而後經過反向傳播算法縮小差距

#使用交叉熵損失函數表示預測值和真實值的差距
cross_entropy = -tf.reduce_mean(y_ * tf.log(tf.clip_by_value(y, 1e-10, 1.0))) 
#定義學習率
learning_rate = 0.001
#定義反向傳播算法優化神經網絡的參數
train_step = tf.train.AdamOptimizer(learning_rate).minimize(cross_entropy)
with tf.Session() as sess:
    sess.run(train_step)#優化GraphKeys.TRAINABLE_VARIABLES集合中的變量

 

TensorFlow支持7種優化算法,經常使用的三種優化算法:tf.train.AdamOptimizer,tf.train.GradientDescentOptimizer,tf.train.MomentumOptimizer

完整的樣例程序:

訓練神經網絡步驟: 
1. 定義神經網絡結構和前向傳播輸出結果 

2. 定義損失函數及反向傳播優化算法 

3. 生成會話(tf.Session)並在訓練數據上反覆運行反向傳播優化算法

 

import tensorflow as tf
from numpy.random import RandomState
# 定義神經網絡的參數,輸入和輸出節點
batch_size = 8
w1= tf.Variable(tf.random_normal([2, 3], stddev=1, seed=1))
w2= tf.Variable(tf.random_normal([3, 1], stddev=1, seed=1))
x = tf.placeholder(tf.float32, shape=(None, 2), name="x-input")
y_= tf.placeholder(tf.float32, shape=(None, 1), name='y-input')
#定義前向傳播過程,損失函數及反向傳播算法
a = tf.matmul(x, w1)
y = tf.matmul(a, w2)
cross_entropy = -tf.reduce_mean(y_ * tf.log(tf.clip_by_value(y, 1e-10, 1.0))) 
train_step = tf.train.AdamOptimizer(0.001).minimize(cross_entropy)
#生成模擬數據集
rdm = RandomState(1)
X = rdm.rand(128,2)
Y = [[int(x1+x2 < 1)] for (x1, x2) in X]
#建立一個會話來運行TensorFlow程序
with tf.Session() as sess:
    init_op = tf.global_variables_initializer()
    sess.run(init_op)
    
    # 輸出目前(未經訓練)的參數取值。
    print("w1:", sess.run(w1))
    print("w2:", sess.run(w2))
    print("\n")
    
    # 訓練模型。
    STEPS = 5000
    for i in range(STEPS):
        start = (i*batch_size) % 128
        end = (i*batch_size) % 128 + batch_size
        sess.run(train_step, feed_dict={x: X[start:end], y_: Y[start:end]})
        if i % 1000 == 0:
            total_cross_entropy = sess.run(cross_entropy, feed_dict={x: X, y_: Y})
            print("After %d training step(s), cross entropy on all data is %g" % (i, total_cross_entropy))
    
    # 輸出訓練後的參數取值。
    print("\n")
    print("w1:", sess.run(w1))
    print("w2:", sess.run(w2))
相關文章
相關標籤/搜索