Perkalian matriks tensor N-D dengan tensorflow

Misalkan saya mempunyai himpunan vektor A dan saya ingin mengalikan setiap vektor di A dengan tensor T hingga akhirnya mendapatkan tensor y yang setiap matriks irisannya adalah hasil perkalian vektor v di A dengan T:

Jika X hanya terdiri dari satu vektor, maka kode berikut berfungsi (berkat jawaban di fungsi matmul untuk vektor dengan perkalian tensor di tensorflow):

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

Namun jika X terdiri dari beberapa vektor, bagaimana kode perkaliannya?

Misalnya, saya memiliki nilai berikut untuk A (dengan 2 vektor) dan 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)

Saya ingin mendapatkan hasil berikut dengan mengalikan A ke T:

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

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

Penerapan untuk pertanyaan ini adalah penurunan gradien batch dalam regresi linier y = AX +b, di mana saya memiliki sekumpulan vektor tetapi alih-alih melatih matriks bobot X, saya ingin melatih tensor T, sehingga keluaran y akan menjadi tensor di yang mana setiap matriks pada tensor merupakan keluaran perkalian vektor masukan dengan T.

Perhatikan bahwa, Secara umum ketika kita mengalikan vektor v berdimensi 1*n dengan tensor T berdimensi m*n*k, kita berharap mendapatkan matriks/tensor berdimensi m*k/m*1*k. Artinya tensor kita memiliki m irisan matriks dengan dimensi n*k, dan v dikalikan dengan masing-masing matriks dan vektor-vektor yang dihasilkan ditumpuk menjadi satu.


person Mila    schedule 09.06.2018    source sumber


Jawaban (1)


Coba tf.tensordot:

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

Or,

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

eval melakukan ini memberi

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

       [[15., 22.],
        [43., 50.]]], dtype=float32)
person cs95    schedule 09.06.2018
comment
Oh terima kasih banyak, solusi yang sederhana. Saya tidak dapat memasang sumbu kanan di tf.tensordot - person Mila; 09.06.2018