Python Tensorflow框架使用

簡介

TensorFlow是採用數據流圖,用於數值計算的深度學習框架(常用於神經網絡相),其中在數據流圖裏,節點表示數學操作,線表示節點間相互聯繫的數據,即張量(tensor)

安裝

其分爲CPU和GPU(更快,但要有硬件支持)版本,安裝命令如下:

pip install tensorflow
pip install tensorflow-gpu

注:
安裝時要求python版本爲2.7+或者3.5+(3.5需要爲64位)

使用步驟

Tensorflow不單獨地運行單一的複雜計算,而是讓我們可以先用圖描述一系列可交互的計算操作,然後全部一起在Python之外運行,從而減少開銷,因此基本上所有的 Tensorflow 代碼都包含兩個重要部分:
1.計算圖(Graph),表示計算任務
2.會話(Session),用於執行計算圖中的運算

因此使用步驟大體如下:
1.導入tensorflow框架:import tensorflow as tf
2.創建計算圖,定義張量(如:常量tf.constant()、變量tf.Variable()等)和運算方法(如:矩陣乘法tf.matmul()等)
3.創建會話(sess = tf.session()),用於運行計算圖中運算
4.通過會話運行計算(sess.run()
5.關閉會話(sess.close()

簡單示例
import tensorflow as tf

x = tf.constant([[1,2]])
# 創建一個1行2列的矩陣
y = tf.constant([[3], [4]])
# 創建一個兩行一列的矩陣
mul = tf.matmul(x, y)
# 將兩個矩陣相乘

sess = tf.Session()
# 創建一個會話
result = sess.run(mul)
# 執行前面運算圖中定義的常量和運算方法
print(result)
# 輸出運算圖中乘法運算執行的結果
sess.close()
# 關閉會話

由於會話執行結束後需要關閉,因此上面的也可以使用with關鍵字來實現自動關閉,舉例:

import tensorflow as tf

with tf.Session() as sess:
    # 使用with關鍵字可以在sess使用結束時自動關閉資源
    x = tf.constant([[1, 2]])
    y = tf.constant([[3], [4]])
    mul = tf.matmul(x, y)
    result = sess.run(mul)
    print(result)

基本語句

定義常量

tf.constant()
注:
當運算圖中定義了變量以後,需要在會話中先調用語句tf.global_variables_initializer()來對所有變量進行初始化

定義變量

tf.Variable()

基本運算
加減乘除

tf.add(x, y)/subtract(x, y)/tf.multiply(x, y)/tf.div(x, y)(整除)/tf.divide(x, y)(小數除,需要除數被除數都爲float),舉例:

import tensorflow as tf

init = tf.Variable(10.0)
# 定義一個變量
two = tf.constant(2.0)
# 定義一個常量
div_two = tf.divide(init, two)
# 定義一個除法運算
矩陣相乘

tf.matmul(x, y)

平方運算

tf.square(x)

獲取矩陣裏數的總和/平均值/最大值/最小值

tf.reduce_sum(x)/reduce_mean(x)/reduce_max(x)/reduce_min(x)

生成幾行幾列的隨機數矩陣

tf.random_uniform([m], x, y),即生成格式爲m,數值全爲xy的隨機數矩陣

生成幾行幾列的全零矩陣

tf.zeros([m]),生成格式爲m的全零矩陣

更新變量

tf.assign(x, way),將xway方式更新數據
使用舉例:

import tensorflow as tf

init = tf.Variable(0)
# 定義一個變量
one = tf.constant(1)
# 定義一個常量
add_one = tf.add(init, one)
# 定義一個加法運算
update = tf.assign(init, add_one)
# 定義一個將當前值加一併更新的運算
init_var = tf.global_variables_initializer()
# 定義一個變量初始化

with tf.Session() as sess:
    sess.run(init_var)
    #  初始化變量
    for i in range(3):
        print(sess.run(update), end="\t")
        # 輸出每次加1並更新後的結果

# 結果爲:
# 1 2   3
feed_dict傳參

對於會話中的run()方法,一般都是將常量和初始化完成的變量傳入運算,但其實也可以通過feed_dict參數將數值以字典方式傳入,此時對於這些值,需要先通過tf.placeholder()方法創建佔位符,然後再傳入對應格式的數據,舉例:

import tensorflow as tf

input1 = tf.placeholder(tf.float32)
input2 = tf.placeholder(tf.float32)
# 創建兩個float型佔位符
output = tf.multiply(input1, input2)
# 進行乘法運算

with tf.Session() as sess:
  print(sess.run([output], feed_dict={input1:7., input2:2.}))
  # 傳入兩個佔位符的值分別爲7.0和2.0
訓練優化

tf.train(),其下提供了很多優化器,其中最簡單的就是梯度下降.GradientDescentOptimizer()

會話操作

創建會話

sess = tf.Session()

執行運算

sess.run()
注:
如果只傳入一個運算,那麼當前會話會返回該運算執行完畢後對應的結果,但如果想進行多個運算並返回多個對應的結果,則可以通過一個列表將多個運算一起傳入,結果也是一個列表,依次爲每個運算的結果
注2:
當傳入多個運算時,其將一起執行,而不是按傳入順序去執行,因此如果在一次run()裏傳入多個相同的運算,那麼就相當於執行一次

關閉會話

sess.close()

簡單綜合示例

import tensorflow as tf

# 預測一個一元線性方程y=Wx+b的W和b的值,使其符合當x依次爲1,2,3,4時,對應的y值依次爲0,-1,-2,-3
W = tf.Variable(1., tf.float32)
b = tf.Variable(-1., tf.float32)
# 定義變量W和b,值分別爲1.0和-1.0
x = tf.placeholder(tf.float32)
y = tf.placeholder(tf.float32)
# 定義佔位符,用於執行開始時的數據輸入
init = tf.global_variables_initializer()
# 定義初始化變量
linear_model = W*x + b
# 定義y=Wx+b的一元線性方程模型
squared_deltas = tf.square(linear_model - y)
# 定義期望值和實際值之差的平方,用於後面的損失函數
loss = tf.reduce_sum(squared_deltas)
# 定義損失函數,值爲所有計算差的平方和
optimizer = tf.train.GradientDescentOptimizer(0.01)
# 定義一個梯度下降的優化器,學習速率爲0.01
train = optimizer.minimize(loss)
# 通過梯度下降方法儘可能使損失函數的值減小
with tf.Session() as sess:
    sess.run(init)
    # 初始化變量
    for i in range(1000):
        sess.run(train, {x: [1., 2., 3., 4.], y: [0., -1., -2., -3.]})
        # 訓練1000次,並在這期間自動調整W和b的大小
    print(sess.run([W, b]))
    # 輸出訓練1000次後W和b的值:[-0.99999523, 0.999986](最完美的是W=-1,b=1,但不可能達到)

激活函數

relu

tf.nn.relu,其將所有小於0的數置爲0,大於0的數保持不變
參考:https://blog.csdn.net/Random_R/article/details/80523265

莫凡TensorFlow教程

https://morvanzhou.github.io/tutorials/machine-learning/tensorflow/1-1-A-ANN-and-NN/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章