web-dev-qa-db-ja.com

Tensorflow python:テンソルの個々の要素へのアクセス

この質問は、テンソル内の個々の要素、たとえば[[1,2,3]]にアクセスすることに関するものです。内部要素[1,2,3]にアクセスする必要があります(これは.eval()またはsess.run()を使用して実行できますが、テンソルのサイズが大きい場合は時間がかかります)

同じことをより速く行う方法はありますか?

前もって感謝します。

41
cipher42

テンソル内の要素のサブセットにアクセスするには、主に2つの方法があります。どちらも例で機能します。

  1. インデックス演算子を使用して( tf.slice() に基づいて)テンソルから連続スライスを抽出します。

    input = tf.constant([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
    
    output = input[0, :]
    print sess.run(output)  # ==> [1 2 3]
    

    インデックス演算子は、NumPyと同じ多くのスライス仕様をサポートします。

  2. tf.gather() opを使用して、テンソルから不連続なスライスを選択します。

    input = tf.constant([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
    
    output = tf.gather(input, 0)
    print sess.run(output)  # ==> [1 2 3]
    
    output = tf.gather(input, [0, 2])
    print sess.run(output)  # ==> [[1 2 3] [7 8 9]]
    

    tf.gather()では、0番目の次元(マトリックスの例では行全体)のスライス全体のみを選択できるため、 tf.reshape() または tf.transpose() 入力して適切な要素を取得します。

51
mrry

時間がかかるのは、1つの要素にアクセスするのではなく、残りの計算だと思います。

また、結果には保存されているメモリからのコピーが必要な場合があります。そのため、グラフィックカード上にある場合は、最初にRAMにコピーしてから要素にアクセスする必要があります。この場合、テンソルフロー操作を追加して最初の要素を取得し、それだけを返すことでスキップできます。

1
Sorin

取得する操作をrun()-ningまたはeval()-ingせずに[[1,2,3]]の0番目の要素のvalueを取得することはできません。 「実行」または「評価」する前に、この内部要素を取得する方法の説明しかありません(TFがシンボリックグラフ/計算を使用するため)。そのため、tf.gather/tf.sliceを使用する場合でも、eval/runを介してこれらの操作のvaluesを取得する必要があります。 @mrryの答えを参照してください。