1. 程式人生 > >【TensorFlow】Programming model + 小試牛刀(模擬Neural Network )

【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 以矩陣運算模擬神經網路的資訊傳導

[y1y2]=activation([x1x2x3]×[w11w12w21w22w31w32])+[b1b2]\left [y1 \ y2 \right ]= activation\left ( \left [x1 \ x2 \ x3 \right ]\times \begin{bmatrix} w11 &amp; w12\\ w21 &amp; w22\\ w31 &amp; w32 \end{bmatrix} \right )+\left [b1 \ b2 \right ]

1×2 = 1×3 × 3×2 + 1*2

另外一種書寫模式
y=activationXW+by = activation(XW+b)

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