Tensorflow數學運算


一、Tensor 之間的運算規則

1) 相同大小 Tensor 之間的任何算術運算都會將運算應用到元素級

2) 不同大小 Tensor(要求dimension 0 必須相同) 之間的運算叫做廣播(broadcasting)

3) Tensor 與 Scalar(0維 tensor) 間的算術運算會將那個標量值傳播到各個元素

4) Note:TensorFLow 在進行數學運算時,一定要求各個 Tensor 數據類型一致

 

二、算術操作(+,-,*,/,Mod)

(1)tensor-tensor操作(element-wise)

大多數運算符都進行了重載操作,使我們可以快速使用 (+ - * /) 等,但是有一點不好的是使用重載操作符后就不能為每個操作命名了。

#兩個tensor 運算
#運算規則:element-wise。即c[i,j,..,k]=a[i,j,..,k] op b[i,j,..,k]
ts1=tf.constant(1.0,shape=[2,2])
ts2=tf.Variable(tf.random_normal([2,2]))
sess.run(tf.global_variables_initializer())
#以ts1和ts2為例:

#(1)加法+
ts_add1=tf.add(ts1,ts2,name=None)
ts_add2=ts1+ts2       #二者等價
#(2)減法-
ts_sub1=tf.subtract(ts1,ts2,name=None)
ts_sub2=ts1-ts2       #二者等價
#(3)乘法*
ts_mul1=tf.multiply(ts1,ts2,name=None)
ts_mul2=ts1*ts2
#(4)除法/
ts_div1=tf.divide(ts1,ts2,name=None)
ts_div2=tf.div(ts1,ts2,name=None)   #div 支持 broadcasting(即shape可不同)
ts_div3=ts1/ts2
#另外還有truediv(x,y) x,y類型必須一致,floor_div等。

(2)tensor-scalar操作

#scalar-tensor操作。  
#對tensor中所有element執行同樣的操作(+,-,*,/)  
#加法  
ts_add=ts1+2  
#減法  
ts_sub=ts1-2  
#乘法  
ts_mul=ts1*2  
#除法  
ts_div=ts1/2  

(3)基本數學函數

# 算術操作符:+ - * / % 
tf.add(x, y, name=None)        # 加法(支持 broadcasting)
tf.subtract(x, y, name=None)   # 減法
tf.multiply(x, y, name=None)   # 乘法
tf.divide(x, y, name=None)     # 浮點除法, 返回浮點數(python3 除法)
tf.mod(x, y, name=None)        # 取余


# 冪指對數操作符:^ ^2 ^0.5 e^ ln 
tf.pow(x, y, name=None)        # 冪次方
tf.square(x, name=None)        # 平方
tf.sqrt(x, name=None)          # 開根號,必須傳入浮點數或復數
tf.exp(x, name=None)           # 計算 e 的次方
tf.log(x, name=None)           # 以 e 為底,必須傳入浮點數或復數


# 取符號、負、倒數、絕對值、近似、兩數中較大/小的
tf.negative(x, name=None)      # 取負(y = -x).
tf.sign(x, name=None)          # 返回 x 的符號
tf.reciprocal(x, name=None)    # 取倒數
tf.abs(x, name=None)           # 求絕對值
tf.round(x, name=None)         # 四舍五入
tf.ceil(x, name=None)          # 向上取整
tf.floor(x, name=None)         # 向下取整
tf.rint(x, name=None)          # 取最接近的整數 
tf.maximum(x, y, name=None)    # 返回兩tensor中的最大值 (x > y ? x : y)
tf.minimum(x, y, name=None)    # 返回兩tensor中的最小值 (x < y ? x : y)


# 三角函數和反三角函數
tf.cos(x, name=None)    
tf.sin(x, name=None)    
tf.tan(x, name=None)    
tf.acos(x, name=None)
tf.asin(x, name=None)
tf.atan(x, name=None)   


# 其它
tf.div(x, y, name=None)  # python 2.7 除法, x/y-->int or x/float(y)-->float
tf.truediv(x, y, name=None) # python 3 除法, x/y-->float
tf.floordiv(x, y, name=None)  # python 3 除法, x//y-->int
tf.realdiv(x, y, name=None)
tf.truncatediv(x, y, name=None)
tf.floor_div(x, y, name=None)
tf.truncatemod(x, y, name=None)
tf.floormod(x, y, name=None)
tf.cross(x, y, name=None)
tf.add_n(inputs, name=None)  # inputs: A list of Tensor objects, each with same shape and type
tf.squared_difference(x, y, name=None)

 

三、tensor大小 比較

#(1)相等equal (element-wise)  
tf.equal(x, y, name=None) #Returns the truth value of (x == y) element-wise.  
  
#(2)不等not_equal    
tf.not_equal(x, y, name=None)  
  
#(3)其他比較  
tf.less(x, y, name=None)  
tf.less_equal(x, y, name=None)  
tf.greater(x, y, name=None)  
tf.greater_equal(x, y, name=None)  

 

四、恆等映射

#恆等映射  
tf.identity(input, name=None) #Return a tensor with the same shape and contents as the input tensor or value.  

 

五、類型轉化

tf.cast(x, dtype, name=None)  
#Casts a tensor to a new type.  
  
#For example:  
# tensor `a` is [1.8, 2.2], dtype=tf.float  
#tf.cast(a, tf.int32) ==> [1, 2]  dtype=tf.int32  

 

六、矩陣運算相關數學函數

# 矩陣乘法(tensors of rank >= 2)
tf.matmul(a, b, transpose_a=False, transpose_b=False,    adjoint_a=False, adjoint_b=False, a_is_sparse=False, b_is_sparse=False, name=None)


# 轉置,可以通過指定 perm=[1, 0] 來進行軸變換
tf.transpose(a, perm=None, name='transpose')


# 在張量 a 的最后兩個維度上進行轉置
tf.matrix_transpose(a, name='matrix_transpose')
# Matrix with two batch dimensions, x.shape is [1, 2, 3, 4]
# tf.matrix_transpose(x) is shape [1, 2, 4, 3]


# 求矩陣的跡
tf.trace(x, name=None)


# 計算方陣行列式的值
tf.matrix_determinant(input, name=None)


# 求解可逆方陣的逆,input 必須為浮點型或復數
tf.matrix_inverse(input, adjoint=None, name=None)


# 奇異值分解
tf.svd(tensor, full_matrices=False, compute_uv=True, name=None)


# QR 分解
tf.qr(input, full_matrices=None, name=None)


# 求張量的范數(默認2)
tf.norm(tensor, ord='euclidean', axis=None, keep_dims=False, name=None)



# 構建一個單位矩陣, 或者 batch 個矩陣,batch_shape 以 list 的形式傳入
tf.eye(num_rows, num_columns=None, batch_shape=None, dtype=tf.float32, name=None)
# Construct one identity matrix.
tf.eye(2)
==> [[1., 0.],
     [0., 1.]]

# Construct a batch of 3 identity matricies, each 2 x 2.
# batch_identity[i, :, :] is a 2 x 2 identity matrix, i = 0, 1, 2.
batch_identity = tf.eye(2, batch_shape=[3])

# Construct one 2 x 3 "identity" matrix
tf.eye(2, num_columns=3)
==> [[ 1.,  0.,  0.],
     [ 0.,  1.,  0.]]


# 構建一個對角矩陣,rank = 2*rank(diagonal)
tf.diag(diagonal, name=None)
# 'diagonal' is [1, 2, 3, 4]
tf.diag(diagonal) ==> [[1, 0, 0, 0]
                       [0, 2, 0, 0]
                       [0, 0, 3, 0]
                       [0, 0, 0, 4]]



# 其它
tf.diag_part
tf.matrix_diag
tf.matrix_diag_part
tf.matrix_band_part
tf.matrix_set_diag
tf.cholesky
tf.cholesky_solve
tf.matrix_solve
tf.matrix_triangular_solve
tf.matrix_solve_ls
tf.self_adjoint_eig
tf.self_adjoint_eigvals

 

七、Reduction:reduce various dimensions of a tensor

# 計算輸入 tensor 所有元素的和,或者計算指定的軸所有元素的和
tf.reduce_sum(input_tensor, axis=None, keep_dims=False, name=None)
# 'x' is [[1, 1, 1]
#         [1, 1, 1]]
tf.reduce_sum(x) ==> 6
tf.reduce_sum(x, 0) ==> [2, 2, 2]
tf.reduce_sum(x, 1) ==> [3, 3]
tf.reduce_sum(x, 1, keep_dims=True) ==> [[3], [3]]  # 維度不縮減
tf.reduce_sum(x, [0, 1]) ==> 6


# 計算輸入 tensor 所有元素的均值/最大值/最小值/積/邏輯與/或
# 或者計算指定的軸所有元素的均值/最大值/最小值/積/邏輯與/或(just like reduce_sum)
tf.reduce_mean(input_tensor, axis=None, keep_dims=False, name=None)
tf.reduce_max(input_tensor, axis=None, keep_dims=False, name=None)
tf.reduce_min(input_tensor, axis=None, keep_dims=False, name=None)
tf.reduce_prod(input_tensor, axis=None, keep_dims=False, name=None)
tf.reduce_all(input_tensor, axis=None, keep_dims=False, name=None)  # 全部滿足條件
tf.reduce_any(input_tensor, axis=None, keep_dims=False, name=None) #至少有一個滿足條件


-------------------------------------------
# 分界線以上和 Numpy 中相應的用法完全一致
-------------------------------------------



# inputs 為一 list, 計算 list 中所有元素的累計和,
# tf.add(x, y, name=None)只能計算兩個元素的和,此函數相當於擴展了其功能
tf.accumulate_n(inputs, shape=None, tensor_dtype=None, name=None)


# Computes log(sum(exp(elements across dimensions of a tensor)))
tf.reduce_logsumexp(input_tensor, axis=None, keep_dims=False, name=None)


# Computes number of nonzero elements across dimensions of a tensor
tf.count_nonzero(input_tensor, axis=None, keep_dims=False, name=None)

 

八、Scan:perform scans (running totals) across one axis of a tensor

# Compute the cumulative sum of the tensor x along axis
tf.cumsum(x, axis=0, exclusive=False, reverse=False, name=None)
# Eg:
tf.cumsum([a, b, c])  # => [a, a + b, a + b + c]
tf.cumsum([a, b, c], exclusive=True)  # => [0, a, a + b]
tf.cumsum([a, b, c], reverse=True)  # => [a + b + c, b + c, c]
tf.cumsum([a, b, c], exclusive=True, reverse=True)  # => [b + c, c, 0]


# Compute the cumulative product of the tensor x along axis
tf.cumprod(x, axis=0, exclusive=False, reverse=False, name=None)

 

九、Segmentation

沿着第一維(x 軸)根據 segment_ids(list)分割好相應的數據后再進行操作

# Computes the sum/mean/max/min/prod along segments of a tensor
tf.segment_sum(data, segment_ids, name=None)
# Eg:
m = tf.constant([5,1,7,2,3,4,1,3])
s_id = [0,0,0,1,2,2,3,3]
s.run(tf.segment_sum(m, segment_ids=s_id))
>array([13,  2,  7,  4], dtype=int32)

tf.segment_mean(data, segment_ids, name=None)
tf.segment_max(data, segment_ids, name=None)
tf.segment_min(data, segment_ids, name=None)
tf.segment_prod(data, segment_ids, name=None)


# 其它
tf.unsorted_segment_sum
tf.sparse_segment_sum
tf.sparse_segment_mean
tf.sparse_segment_sqrt_n

 

十、 序列比較與索引提取

 

# 比較兩個 list 或者 string 的不同,並返回不同的值和索引
tf.setdiff1d(x, y, index_dtype=tf.int32, name=None)


# 返回 x 中的唯一值所組成的tensor 和原 tensor 中元素在現 tensor 中的索引
tf.unique(x, out_idx=None, name=None)


# x if condition else y, condition 為 bool 類型的,可用tf.equal()等來表示
# x 和 y 的形狀和數據類型必須一致
tf.where(condition, x=None, y=None, name=None)


# 返回沿着坐標軸方向的最大/最小值的索引
tf.argmax(input, axis=None, name=None, output_type=tf.int64)
tf.argmin(input, axis=None, name=None, output_type=tf.int64)


# x 的值當作 y 的索引,range(len(x)) 索引當作 y 的值
# y[x[i]] = i for i in [0, 1, ..., len(x) - 1]
tf.invert_permutation(x, name=None)


# 其它
tf.edit_distance

 

 

 

參考文獻:

https://blog.csdn.net/zywvvd/article/details/78593618

https://blog.csdn.net/vcvycy/article/details/78489378

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM