

以下のような行列Xと行列Yが与えられた時、  
各々の行ベクトルの内積をまとめて計算したいです。  
つまり、バッチデータに対する、単純な内積計算です。

ChainerのFunctionを使って、  
以下のようなことはどのように実現できるでしょうか？

[code]

    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
    
[/code]

私が初歩的な勘違いをしているだけかもしれないのですが、  
FunctionのLinearやmatmulを使っても、  
バッチ単位での単純な内積計算はできませんでした。

ひとまず、以下のようにして実現はできたのですが、  
もっと普通に書けるかと思います。

[code]

    dot_XY = F.expand_dims(F.sum(F.scale(X, Y, 0), 1), 1)
    print dot_XY
    >> [[ 50.] [ 32.]]
    
[/code]

よろしくお願いします。


CC BY-SA 3.0
2016-09-18T05:57:08.283
28963
2016-09-19T16:18:58.387
2016-09-19T16:18:58.387
2238
12874
question
python chainer
Chainerでバッチデータの内積を計算したい