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
函數名稱 | 隨機數分佈 | 主要參數 |
---|---|---|
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的變量
函數名稱 | 功能 | 樣例 |
---|---|---|
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()函數獲得全部可學習的變量
集合名稱 | 集合內容 | 使用場景 |
---|---|---|
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))