TensorFlow基礎知識3-操作
1運算操作的相關知識點
一個運算操作代表了一種型別的抽象運算,比如矩陣乘法或者向量加法。
一個運算操作可以有自己的屬性,但是所有屬性都必須被預先設定,或者能夠在建立計算圖時根據上下文推斷出來。
通過設定運算操作的屬性可以用來支援不同的tensor元素型別,比如讓向量加法支援浮點或者整數。
運算核(kernel)是一個運算操作在某個具體的硬體(比如cpu或者gpu中)的實現。
在TensorFlow中,可以通過註冊機制加入新的運算操作或者為已有的運算操作新增新的計算核。
與操作相關的API均位於tf.Operation類中
操作 | 描述 |
---|---|
tf.Operation.name | 操作的名稱 |
tf.Operation.type | 操作的型別,如MatMul |
tf.Operation.inputs | 操作的輸入 |
tf.Operation.outputs | 操作的輸出 |
tf.Operation.run | 在會話中執行該操作 |
tf.Operation.get_attr | 獲取操作的屬性值 |
TensorFlow內建運算操作
運算型別 | 運算示例 |
---|---|
標量運算 | add、sub、mul、div、exp、log、greater、less、equal |
向量運算 | concat、slice、split、constant、rank、shape、shuffle |
矩陣運算 | matmul、matricinverse、matrixdeterminant |
帶狀態的運算 | variable、assign、assignadd |
神經網路元件 | softmax、sigmoid、relu、convolution2D、maxpooling |
儲存,恢復 | save、restore |
佇列及同步運算 | enqueue、dequeue、mutexAcquire、mutexrelease |
控制流 | merge、switch、enter、leave、nextInteration |
2操作的使用
下圖顯示了一個數據流圖:
根據資料流圖寫出程式碼如下:
import tensorflow as tf
a = tf.constant(5, name="input_a")
b = tf.constant(3, name="input_b")
c = tf.multiply(a, b, name="mul_c")
d = tf.add(a, b, name="add_d")
e = tf.add(c, d, name="add_e")
通過會話執行最後結果e
sess = tf.Session()
sess.run(e)
輸出:23
a = tf.constant(5, name="input_a")
b = tf.constant(3, name="input_b")
節點a和b,引用了Operation:tf.constant()。在TensorFlow中,資料流圖中的每個節點都被稱為一個Operation(簡記Op)
c = tf.multiply(a, b, name="mul_c")
節點c使用了tf.multiply Op,節點c接收兩個輸入a和b,然後將它們的乘積輸出。
3運算子過載
運算子過載
TensorFlow還對常見數學運算子進行了過載,以使乘法、加法、減法及其他常見運算更加簡潔。如果運算子有一個或多個引數(操作物件)為Tensor物件,則會有一個TensorFlow Op被呼叫,並被新增到資料流圖中。例如,可按照下列方式輕鬆地實現兩個張量的加法:
假設a和b均為Tensor物件,且形狀匹配
下面給出可用於張量的過載運算子的完整清單。
一元運算子
運算子 | 相關TensorFlow運算 | 描述 |
---|---|---|
-x | tf.neg() | 返回x中每個元素的相反數 |
~x | tf.logical_not() | 返回x中每個元素的邏輯非。只適用於dtype為tf.bool的Tensor物件 |
abs(x) | tf.abs() | 返回x中每個元素的絕對值 |
二元運算子
運算子 | 相關TensorFlow運算 | 描述 |
---|---|---|
x+y | tf.add() | 將x和y逐元素相加 |
x-y | tf.sub() | 將x和y逐元素相減 |
x*y | tf.mul() | 將x和y逐元素相乘 |
x/y(Python2.x) | tf.div() | 給定整數張量時,執行逐元素的整數除法;給定浮點型張量時,將執行浮點數(“真正的”)除法 |
x/y(Python3.x) | tf.truediv() | 逐元素的浮點數除法(包括分子分母為整數的情形) |
x//y(Python3.x) | tf.floordiv() | 逐元素的向下取整除法,不返回餘數 |
x%y | tf.mod() | 逐元素取模 |
x**y | tf.pow() | 逐一計算x中的每個元素為底數,y中相應元素為指數時的冪 |
x | tf.less() | 逐元素地計算x<y的真值表 |
x<=y | tf.less_equal() | 逐元素地計算x≤y的真值表 |
x>y | tf.greater() | 逐元素地計算x>y的真值表 |
x>=y | tf.greater_equal() | 逐元素地計算x≥y的真值表 |
x&y | tf.logical_and() | 逐元素地計算x & y的真值表,每個元素的dtype屬性必須為tf.bool |
x|y | tf.logical_or() | 逐元素地計算x|y的真值表,每個元素的dtype屬性必須為tf.bool |
x^y | tf.logical_xor() | 逐元素地計算x^y的真值表,每個元素的dtype屬性必須為tf.bool |
利用這些過載運算子可快速地對程式碼進行整合,但卻無法為這些Op指定name值。如果需要為Op指定name值,請直接呼叫TensorFlow Op。
從技術角度講,==運算子也被過載了,但它不會返回一個布林型的Tensor物件。它所判斷的是兩個Tensor物件名是否引用了同一個物件,若是,則返回True,否則,返回False。這個功能主要是在TensorFlow內部使用。如果希望檢查張量值是否相同,請使用tf.equal()和tf.not_equal()。