簡介
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
,數值全爲x
到y
的隨機數矩陣
生成幾行幾列的全零矩陣
tf.zeros([m])
,生成格式爲m
的全零矩陣
更新變量
tf.assign(x, way)
,將x
以way
方式更新數據
使用舉例:
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/