Chainerでバッチデータの内積を計算したい
以下のような行列Xと行列Yが与えられた時、
各々の行ベクトルの内積をまとめて計算したいです。
つまり、バッチデータに対する、単純な内積計算です。
ChainerのFunctionを使って、
以下のようなことはどのように実現できるでしょうか?
import numpy as np
import chainer.functions as F
X = np.array([[1, 2, 3],
[4, 5, 6]],
dtype=np.float32)
Y = np.array([[7, 8, 9],
[1, 2, 3]],
dtype=np.float32)
dot_XY = [[np.dot(X[0], Y[0])],
[np.dot(X[1], Y[1])]]
print dot_XY
>> [[50.0], [32.0]]
dot_XY = F.matmul(X, Y, transb=True)
print dot_XY.data
>> [[ 50. 14.]
[ 122. 32.]]
dot_XY = F.Linear(X, Y)
print dot_XY.data
>> TypeError: only length-1 arrays can be converted to Python scalars
私が初歩的な勘違いをしているだけかもしれないのですが、
FunctionのLinearやmatmulを使っても、
バッチ単位での単純な内積計算はできませんでした。
ひとまず、以下のようにして実現はできたのですが、
もっと普通に書けるかと思います。
dot_XY = F.expand_dims(F.sum(F.scale(X, Y, 0), 1), 1)
print dot_XY
>> [[ 50.] [ 32.]]
よろしくお願いします。