回答:
ネイティブ.dot_product
メソッドはありません。ただし、2つのベクトル間の内積は、要素ごとに乗算合計されるため、次の例は機能します。
import tensorflow as tf
# Arbitrarity, we'll use placeholders and allow batch size to vary,
# but fix vector dimensions.
# You can change this as you see fit
a = tf.placeholder(tf.float32, shape=(None, 3))
b = tf.placeholder(tf.float32, shape=(None, 3))
c = tf.reduce_sum( tf.multiply( a, b ), 1, keep_dims=True )
with tf.Session() as session:
print( c.eval(
feed_dict={ a: [[1,2,3],[4,5,6]], b: [[2,3,4],[5,6,7]] }
) )
出力は次のとおりです。
[[ 20.]
[ 92.]]
チェックする価値のあるもう1つのオプションは[tf.einsum][1]
、本質的にEinstein Notationの簡易バージョンです。
ニールとダンカーの例に続いて:
import tensorflow as tf
a = tf.placeholder(tf.float32, shape=(None, 3))
b = tf.placeholder(tf.float32, shape=(None, 3))
c = tf.einsum('ij,ij->i', a, b)
with tf.Session() as session:
print( c.eval(
feed_dict={ a: [[1,2,3],[4,5,6]], b: [[2,3,4],[5,6,7]] }
) )
の最初の引数einsum
は、乗算および合計される軸を表す方程式です。方程式の基本的なルールは次のとおりです。
この場合、ij,ij->i
は、入力が同じ形状の2つの行列に(i,j)
なり、出力が形状のベクトルになることを意味します(i,)
。
慣れてきたらeinsum
、他の多くの操作を一般化することがわかります。
X = [[1, 2]]
Y = [[3, 4], [5, 6]]
einsum('ab->ba', X) == [[1],[2]] # transpose
einsum('ab->a', X) == [3] # sum over last dimension
einsum('ab->', X) == 3 # sum over both dimensions
einsum('ab,bc->ac', X, Y) == [[13,16]] # matrix multiply
einsum('ab,bc->abc', X, Y) == [[[3,4],[10,12]]] # multiply and broadcast
残念ながら、einsum
手動の乗算と削減と比較すると、かなり大きなパフォーマンスヒットがかかります。パフォーマンスが重要な場合は、ニールのソリューションを使用することをお勧めします。
tf.tensordotの対角線をとっても、軸を例えば
[[1], [1]]
私はニール・スレーターの例を採用しました:
import tensorflow as tf
# Arbitrarity, we'll use placeholders and allow batch size to vary,
# but fix vector dimensions.
# You can change this as you see fit
a = tf.placeholder(tf.float32, shape=(None, 3))
b = tf.placeholder(tf.float32, shape=(None, 3))
c = tf.diag_part(tf.tensordot( a, b, axes=[[1],[1]]))
with tf.Session() as session:
print( c.eval(
feed_dict={ a: [[1,2,3],[4,5,6]], b: [[2,3,4],[5,6,7]] }
) )
これも今与える:
[ 20. 92.]
reduce_sum
)