【TensorFlow】Programming model + 小試牛刀(模擬Neural Network )
1 【TensorFlow】程式設計模式
TensorFlow 程式設計模式的核心是“計算圖”,可分為兩部分:建立“計算圖”與執行計算圖 ,更多說明可以檢視 《TensorFlow+Keras》Learning notes
1.1 建立計算圖
匯入TensorFlow模組
import tensorflow as tf
1.1.1 tf.constant
tf.constant(
value,
dtype=None,
shape=None,
name='Const',
verify_shape=False
)
除了直接賦值以外,tf還提供使用tf.ones()、tf.zeros()等初始化張量的方法
ts_c = tf.constant(2,name='ts_c')
檢視常數
ts_c
output
<tf.Tensor 'ts_c:0' shape=() dtype=int32>
- tf.Tensor 代表是張量
- shape=() 代表0維的tensor ,也就是數值
- dtype=int32> 資料型別是int32
1.1.2 tf.Variable 建立變數
tensorflow中的變數是通過Variable類來實現的,類初始化函式為tf.Variable():
def __init__(self,
initial_value=None ,
trainable=True,
collections=None,
validate_shape=True,
caching_device=None,
name=None,
variable_def=None,
dtype=None,
expected_shape=None,
import_scope=None)
TensorFlow中的變數特指深度學習機制中,控制輸入到輸出對映的可以變化的資料,這些變化資料隨著訓練迭代的進行,不斷地改變數值,不斷優化,使輸出的結果越來越接近於正確的結果。
tensorflow中的可以改變的量包括訓練過程中的輸入資料,輸出資料以及控制從輸入到輸出的學習機制(具體體現為網路引數),輸入輸出資料在tf中是用placeholder佔位符定義的,tf的學習機制使用變數來表示。
ts_x = tf.Variable(ts_c+5,name='ts_x')
ts_x
output
<tf.Variable 'ts_x:0' shape=() dtype=int32_ref>
必須要執行計算圖後才能夠看到結果
1.2 執行“計算圖”
1.2.1 建立Session
sess=tf.Session()
1.2.2 初始化
init = tf.global_variables_initializer()
sess.run(init)
1.2.3 使用sess.run() 顯示常量和變數
print('ts_c=',sess.run(ts_c))
print('ts_x=',sess.run(ts_x))
output
ts_c= 2
ts_x= 7
1.2.4 使用name.eval() 顯示常量和變數
print('ts_c=',ts_c.eval(session=sess))
print('ts_x=',ts_x.eval(session=sess))
output
ts_c= 2
ts_x= 7
1.2.5 關閉Session
sess.close()
1.2.6 整合一遍
import tensorflow as tf
# 建立計算圖
ts_c = tf.constant(2,name='ts_c')
ts_x = tf.Variable(ts_c+5,name='ts_x')
# 開啟Session開始執行“計算圖”
sess=tf.Session()
init = tf.global_variables_initializer()
sess.run(init)
print('ts_c=',sess.run(ts_c))
print('ts_x=',sess.run(ts_x))
# 關閉計算圖
sess.close()
1.2.7 with語句開啟Session並且自動關閉
import tensorflow as tf
ts_c = tf.constant(2,name='ts_c')
ts_x = tf.Variable(ts_c+5,name='ts_x')
with tf.Session() as sess:
init = tf.global_variables_initializer()
sess.run(init)
print('ts_c=',sess.run(ts_c))
print('ts_x=',sess.run(ts_x))
output
ts_c= 2
ts_x= 7
1.3 TensorFlow placeholder
第二節中,在建立“計算圖”時,我們設定了ts_c常量值為2,並且設定變數ts_x為 ts_c + 5,這都是在建立“計算圖”階段就已經設定完成的。可是我們如果希望在執行“計算圖”階段才設定數值,那麼就需要用到 placeholder。
tensorflow中的可以改變的量包括訓練過程中的輸入資料,輸出資料以及控制從輸入到輸出的學習機制(具體體現為網路引數),輸入輸出資料在tf中是用placeholder佔位符定義的,tf的學習機制使用變數來表示。
tf.placeholder(
dtype,
shape=None,
name=None
)
- dtype:表示tensorflow中的資料型別,如常用的tf.float32,tf.float64等數值型別;
- shape:表示資料型別,預設的None是一個一維的數值,shape=[None,5],表示行不定,列是5;
- name:張量名稱;
1.3.1 建立“計算圖”
width = tf.placeholder("int32")
height = tf.placeholder("int32")
area=tf.multiply(width,height)
1.3.2 執行“計算圖”
with tf.Session() as sess:
init = tf.global_variables_initializer()
sess.run(init)
print('area=',sess.run(area,feed_dict={width: 6, height: 8}))
output
area= 48
1.4 TensorFlow數值方法介紹
- tf.add
- tf.subtract
- tf.multiply
- tf.divide
- tf.mod
- tf.sqrt
- tf.abs
你也許會覺得只是簡單的數值相乘,為什麼要用tf.multiply
?這樣做的目的是讓TensorFlow具備跨平臺的能力
1.5 TensorBoard
加如name,使得計算圖更容易讀懂
import tensorflow as tf
width = tf.placeholder("int32",name='width')
height = tf.placeholder("int32",name='height')
area=tf.multiply(width,height,name='area')
with tf.Session() as sess:
init = tf.global_variables_initializer()
sess.run(init)
print('area=',sess.run(area,feed_dict={width: 6,height: 8}))
把資料寫入log中
# 將所有要顯示在TensorBoard的資料整合
tf.summary.merge_all()
# 將所有要顯示在TensorBoard的資料寫入log檔案
train_writer = tf.summary.FileWriter('log/area',sess.graph)
生成檔案為
events.out.tfevents.1532769241.71efb41a2c4a
本地開啟伺服器上的tensorboard的方法
# cd到area的路徑
cd /path/to/log/area
export CUDA_VISIBLE_DEVICES=2
tensorboard --logdir=./
會顯示
TensorBoard 1.8.0 at http://71efb41a2c4a:6006 (Press CTRL+C to quit)
在git下輸入
ssh -L 6006:127.0.0.1:6006 [email protected]伺服器ip -p 埠號
填下登入密碼
即可開啟tensor board
顯示的結果為
1.6 建立一維與二維張量
1.6.1 Create dim 1 tensor
ts_X = tf.Variable([0.4,0.2,0.4])
with tf.Session() as sess:
init = tf.global_variables_initializer()
sess.run(init)
X=sess.run(ts_X)
print(X)
output
[0.4 0.2 0.4]
檢視一維張量
print(X.shape)
output
(3,)
1.6.2 Create dim 2 tensor
ts_X = tf.Variable([[0.4,0.2,0.4]])
with tf.Session() as sess:
init = tf.global_variables_initializer()
sess.run(init)
X=sess.run(ts_X)
print(X)
output
[[0.4 0.2 0.4]]
檢視二維張量
print('shape:',X.shape)
output
shape: (1, 3)
once more
W = tf.Variable([[-0.5,-0.2 ],
[-0.3, 0.4 ],
[-0.5, 0.2 ]])
with tf.Session() as sess:
init = tf.global_variables_initializer()
sess.run(init)
W_array=sess.run(W)
print(W_array)
output
[[-0.5 -0.2]
[-0.3 0.4]
[-0.5 0.2]]
檢視二維張量
print(W_array.shape)
結果為
(3, 2)
1.7 矩陣基本運算
1.7.1 矩陣乘法
#1,3
X = tf.Variable([[1.,1.,1.]])
# 3,2
W = tf.Variable([[-0.5,-0.2 ],
[-0.3, 0.4 ],
[-0.5, 0.2 ]])
#(1,3)*(3*2) = (1,2)
XW =tf.matmul(X,W )
with tf.Session() as sess:
init = tf.global_variables_initializer()
sess.run(init)
print(sess.run(XW ))
output
[[-1.3 0.4]]
1.7.2 矩陣加法
b = tf.Variable([[ 0.1,0.2]])
XW =tf.Variable([[-1.3,0.4]])
Sum =XW+b
with tf.Session() as sess:
init = tf.global_variables_initializer()
sess.run(init)
print('Sum:')
print(sess.run(Sum ))
output
Sum:
[[-1.1999999 0.6 ]]
1.7.3 矩陣乘法與加法
X = tf.Variable([[1.,1.,1.]])
W = tf.Variable([[-0.5,-0.2 ],
[-0.3, 0.4 ],
[-0.5, 0.2 ]])
b = tf.Variable([[0.1,0.2]])
XWb =tf.matmul(X,W)+b
with tf.Session() as sess:
init = tf.global_variables_initializer()
sess.run(init)
print('XWb:')
print(sess.run(XWb ))
output
XWb:
[[-1.1999999 0.6 ]]
2 模擬 Neural Network
2.1 以矩陣運算模擬神經網路
2.1.1 以矩陣運算模擬神經網路的資訊傳導
1×2 = 1×3 × 3×2 + 1*2
另外一種書寫模式
2.1.2 TensorFlow張量運算模擬神經網路
import tensorflow as tf
import numpy as np
X = tf.Variable([[0.4,0.2,0.4]]) # 1 3
# 3 2
W = tf.Variable([[-0.5,-0.2 ],
[-0.3, 0.4 ],
[-0.5, 0.2 ]])
# 1 2
b = tf.Variable([[0.1,0.2]])
XWb =tf.matmul(X,W)+b
y=tf.nn.relu(tf.matmul(X,W)+b)
with tf.Session() as sess:
init = tf.global_variables_initializer()
sess.run(init)
print('XWb:')
print(sess.run(XWb ))
print('y:')
print(sess.run(y ))
output
XWb:
[[-0.35999998 0.28 ]]
y:
[[0. 0.28]]
2.1.3 矩陣表示式加入sigmoid啟用函式
X = tf.Variable([[0.4,0.2,0.4]])
W = tf.Variable([[-0.5,-0.2 ],
[-0.3, 0.4 ],
[-0.5, 0.2 ]])
b = tf.Variable([[0.1,0.2]])
XWb=tf.matmul(X,W)+b
y=tf.nn.sigmoid(tf.matmul(X,W)+b)
with tf.Session() as sess:
init = tf.global_variables_initializer()
sess.run(init)
print('XWb:')
print(sess.run(XWb))
print('y:')
print(sess.run(y ))
output
XWb:
[[-0.35999998 0.28 ]]
y:
[[0.41095957 0.5695462 ]]
2.1.4 以正態分佈的隨機數生成權重與偏差的初始值
tf.random_normal
ts_norm = tf.random_normal([1000])
with tf.Session() as session:
norm_data=ts_norm.eval()
print(len(norm_data))
print(norm_data[:30])
畫一下直方圖 plt.hist
import matplotlib.pyplot as plt
plt.hist(norm_data)
plt.show()
output
W = tf.Variable(tf.random_normal([3, 2]))
b = tf.Variable(tf.random_normal([1, 2]))
X = tf.Variable([[0.4,0.2,0.4]])
y=tf.nn.relu(tf.matmul(X,W)+b)
with tf.Session() as sess:
init = tf.global_variables_initializer()
sess.run(init)
print('b:')
print(ses