การคูณเมทริกซ์เทนเซอร์ N-D ด้วยเทนเซอร์โฟลว์

พิจารณาว่าฉันมีเซตของเวกเตอร์ A และฉันต้องการคูณเวกเตอร์แต่ละตัวใน A ด้วยเทนเซอร์ T เพื่อให้ในที่สุดมีเทนเซอร์ y โดยที่เมทริกซ์แต่ละชิ้นเป็นผลมาจากการคูณเวกเตอร์ v ใน A ด้วย T:

หาก X ประกอบด้วยเวกเตอร์เพียงตัวเดียว โค้ดต่อไปนี้ก็ใช้งานได้ (ขอบคุณคำตอบใน ฟังก์ชัน matmul สำหรับเวกเตอร์ที่มีการคูณเทนเซอร์ในเทนเซอร์โฟลว์):

tf.reduce_sum(tf.expand_dims(v,2)*T,1)

แต่ถ้า X ประกอบด้วยเวกเตอร์หลายตัว รหัสสำหรับการคูณจะเป็นอย่างไร

ตัวอย่างเช่น ฉันมีค่าต่อไปนี้สำหรับ A (พร้อมเวกเตอร์ 2) และ T:

A = tf.constant([1,2,3,4], shape=[2,2], dtype=tf.float32) #v1 =[1,2], v2=[3,4]
T = tf.constant([1,2,3,4,5,6,7,8], shape=[2,2,2], dtype=tf.float32)

ฉันต้องการรับผลลัพธ์ต่อไปนี้โดยการคูณ A ถึง T:

[[[ 7. 10.]
  [19. 22.]]

 [[15. 22.]
  [43. 50.]]]

การประยุกต์ใช้กับคำถามนี้คือ การไล่ระดับแบทช์ในการถดถอยเชิงเส้น y = AX +b ซึ่งฉันมีเซตของเวกเตอร์ แต่แทนที่จะฝึกเมทริกซ์น้ำหนัก X ฉันต้องการฝึกเทนเซอร์ T ดังนั้นเอาต์พุต y จะเป็นเทนเซอร์ใน ซึ่งแต่ละเมทริกซ์ในเทนเซอร์เป็นเอาท์พุตของการคูณเวกเตอร์อินพุตด้วย T

โปรดทราบว่า โดยทั่วไป เมื่อเราคูณเวกเตอร์ v ของมิติ 1*n ด้วยเทนเซอร์ T ของมิติ m*n*k เราคาดว่าจะได้เมทริกซ์/เทนเซอร์ของมิติ m*k/m*1*k ซึ่งหมายความว่าเทนเซอร์ของเรามีเมทริกซ์ m ส่วนที่มีมิติ n*k และ v คูณด้วยแต่ละเมทริกซ์ และเวกเตอร์ที่ได้จะซ้อนกัน


person Mila    schedule 09.06.2018    source แหล่งที่มา


คำตอบ (1)


ลองใช้ tf.tensordot:

tf.tensordot(A, T, axes=[-1, -2])

Or,

tf.squeeze(tf.tensordot(A[:, None], T, axes=[2, 1]))

evalสิ่งนี้ทำให้

array([[[ 7., 10.],
        [19., 22.]],

       [[15., 22.],
        [43., 50.]]], dtype=float32)
person cs95    schedule 09.06.2018
comment
โอ้ ขอบคุณมากครับ เป็นวิธีแก้ปัญหาง่ายๆ เลย ฉันไม่สามารถใส่แกนที่ถูกต้องใน tf.tensordot ได้ - person Mila; 09.06.2018