將tf.batch_matmul替換成tf.matmul的實現
我就廢話不多說了,大家還是直接看程式碼吧~
import tensorflow as tf h_doc=tf.placeholder(tf.int32,[None,30,512]) h_query=tf.placeholder(tf.int32,10,512]) temp = tf.matmul(h_doc,h_query,adjoint_b = True) # tf.batch_matmul(h_doc,adj_y=True) print(temp.get_shape())
(?,10)
補充知識:tf.matmul() 和tf.multiply() 的區別
1.tf.multiply()兩個矩陣中對應元素各自相乘
格式: tf.multiply(x,y,name=None)
引數:
x: 一個型別為:half,float32,float64,uint8,int8,uint16,int16,int32,int64,complex64,complex128的張量。
y: 一個型別跟張量x相同的張量。
返回值: x * y element-wise.
注意:
(1)multiply這個函式實現的是元素級別的相乘,也就是兩個相乘的數元素各自相乘,而不是矩陣乘法,注意和tf.matmul區別。
(2)兩個相乘的數必須有相同的資料型別,不然就會報錯。
2.tf.matmul()將矩陣a乘以矩陣b,生成a * b。
格式: 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)
引數:
a: 一個型別為 float16,complex128 且張量秩 > 1 的張量。
b: 一個型別跟張量a相同的張量。
transpose_a: 如果為真,a則在進行乘法計算前進行轉置。
transpose_b: 如果為真,b則在進行乘法計算前進行轉置。
adjoint_a: 如果為真,a則在進行乘法計算前進行共軛和轉置。
adjoint_b: 如果為真,b則在進行乘法計算前進行共軛和轉置。
a_is_sparse: 如果為真,a會被處理為稀疏矩陣。
b_is_sparse: 如果為真,b會被處理為稀疏矩陣。
name: 操作的名字(可選引數)
返回值: 一個跟張量a和張量b型別一樣的張量且最內部矩陣是a和b中的相應矩陣的乘積。
注意:
(1)輸入必須是矩陣(或者是張量秩 >2的張量,表示成批的矩陣),並且其在轉置之後有相匹配的矩陣尺寸。
(2)兩個矩陣必須都是同樣的型別,支援的型別如下:float16,complex128。
引發錯誤:
ValueError: 如果transpose_a 和 adjoint_a,或 transpose_b 和 adjoint_b 都被設定為真
程式示例:
執行結果:
注意:
在TensorFlow的世界裡,變數的定義和初始化是分開的,所有關於圖變數的賦值和計算都要通過tf.Session的run來進行。想要將所有圖變數進行集體初始化時應該使用tf.global_variables_initializer。
以上這篇將tf.batch_matmul替換成tf.matmul的實現就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援我們。