2017-02-06 3 views
1

cntk.ops.gatherを1Dベクターに使用しようとしています。ここでは動作しませんどのような説明の抜粋です:ギャザーで1Dベクターを使用するには?

import cntk 
import numpy as np 

def main(): 
    xx = cntk.input_variable(shape=(1)) 
    yy = cntk.input_variable(shape=(1)) 
    zz = cntk.sequence.gather(xx, yy) 

    xx_value = np.arange(15, dtype=np.float64) 
    yy_value = np.array([1, 0, 0, 0, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 1], dtype=np.float64) 
    aa = zz.eval({xx: xx_value.reshape(-1, 1), yy: yy_value.reshape(-1, 1)}) 
    print(aa) 

if __name__ == "__main__": 
    main() 

答えて

2

この理由はcntkは例のバッチが提供されることを想定していることです。 (15,1)配列は長さ1の15個のサンプルのバッチに変換します。 gatherを適用すると、cntkは不都合です。ミニバッチのいくつかの例では、空のシーケンスyy_valueでは0)。

複数の方法でミニバッチに1つの例しかないという事実を指定することで、問題を解決できます。

  • この

    AA = zz.eval({XXのようなリストの値を提供することができる:[xx_value.reshape(-1、1)]、YY:[yy_value.reshapeを(-1 、1)]})

  • あなたはこのような形状のテンソル(1,15,1)の値を提供することができる:

    AA = zz.eval({XX:xx_value.reshape(1 -1,1)、yy:yy_value.reshape(1、-1,1)})

後者は、ミニバッファ内のすべてのシーケンスの長さが同じ場合にのみ機能します。

関連する問題