1. 程式人生 > 程式設計 >TensorFLow 數學運算的示例程式碼

TensorFLow 數學運算的示例程式碼

一、Tensor 之間的運算規則

  • 相同大小 Tensor 之間的任何算術運算都會將運算應用到元素級
  • 不同大小 Tensor(要求dimension 0 必須相同) 之間的運算叫做廣播(broadcasting)
  • Tensor 與 Scalar(0維 tensor) 間的算術運算會將那個標量值傳播到各個元素
  • Note: TensorFLow 在進行數學運算時,一定要求各個 Tensor 資料型別一致

二、常用操作符和基本數學函式

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

# 算術操作符:+ - * / % 
tf.add(x,y,name=None)  # 加法(支援 broadcasting)
tf.subtract(x,name=None) # 減法
tf.multiply(x,name=None) # 乘法
tf.divide(x,name=None)  # 浮點除法,返回浮點數(python3 除法)
tf.mod(x,name=None)  # 取餘
 
# 冪指對數操作符:^ ^2 ^0.5 e^ ln 
tf.pow(x,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,name=None) # 返回兩tensor中的最大值 (x > y ? x : y)
tf.minimum(x,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,name=None) # python 2.7 除法,x/y-->int or x/float(y)-->float
tf.truediv(x,name=None) # python 3 除法,x/y-->float
tf.floordiv(x,x//y-->int
tf.realdiv(x,name=None)
tf.truncatediv(x,name=None)
tf.floor_div(x,name=None)
tf.truncatemod(x,name=None)
tf.floormod(x,name=None)
tf.cross(x,name=None)
tf.add_n(inputs,name=None) # inputs: A list of Tensor objects,each with same shape and type
tf.squared_difference(x,name=None) 

三、矩陣數學函式

# 矩陣乘法(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,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.,1.,0.]]
 
# 構建一個對角矩陣,rank = 2*rank(diagonal)
tf.diag(diagonal,name=None)
# 'diagonal' is [1,4]
tf.diag(diagonal) ==> [[1,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,name=None)
# 'x' is [[1,1]
#   [1,1]]
tf.reduce_sum(x) ==> 6
tf.reduce_sum(x,0) ==> [2,2]
tf.reduce_sum(x,1) ==> [3,3]
tf.reduce_sum(x,keep_dims=True) ==> [[3],[3]] # 維度不縮減
tf.reduce_sum(x,[0,1]) ==> 6
 
# 計算輸入 tensor 所有元素的均值/最大值/最小值/積/邏輯與/或
# 或者計算指定的軸所有元素的均值/最大值/最小值/積/邏輯與/或(just like reduce_sum)
tf.reduce_mean(input_tensor,name=None)
tf.reduce_max(input_tensor,name=None)
tf.reduce_min(input_tensor,name=None)
tf.reduce_prod(input_tensor,name=None)
tf.reduce_all(input_tensor,name=None) # 全部滿足條件
tf.reduce_any(input_tensor,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,name=None)
 
# Computes number of nonzero elements across dimensions of a tensor
tf.count_nonzero(input_tensor,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,c]) # => [a,a + b,a + b + c]
tf.cumsum([a,c],exclusive=True) # => [0,a,a + b]
tf.cumsum([a,reverse=True) # => [a + b + c,b + c,c]
tf.cumsum([a,exclusive=True,reverse=True) # => [b + c,c,0]
 
# Compute the cumulative product of the tensor x along axis
tf.cumprod(x,name=None)

六、Segmentation

沿著第一維(x 軸)根據 segment_ids(list)分割好相應的資料後再進行操作

TensorFLow 數學運算的示例程式碼

# 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,7,3])
s_id = [0,3]
s.run(tf.segment_sum(m,segment_ids=s_id))
>array([13,4],dtype=int32)
 
tf.segment_mean(data,name=None)
tf.segment_max(data,name=None)
tf.segment_min(data,name=None)
tf.segment_prod(data,name=None)
 
# 其它
tf.unsorted_segment_sum
tf.sparse_segment_sum
tf.sparse_segment_mean
tf.sparse_segment_sqrt_n

七、 序列比較與索引提取

# 比較兩個 list 或者 string 的不同,並返回不同的值和索引
tf.setdiff1d(x,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,name=None,output_type=tf.int64)
tf.argmin(input,output_type=tf.int64)
 
# x 的值當作 y 的索引,range(len(x)) 索引當作 y 的值
# y[x[i]] = i for i in [0,...,len(x) - 1]
tf.invert_permutation(x,name=None)
 
# 其它
tf.edit_distance

到此這篇關於TensorFLow 數學運算的示例程式碼的文章就介紹到這了,更多相關TensorFLow 數學運算內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!