この質問は、テンソル内の個々の要素、たとえば[[1,2,3]]にアクセスすることに関するものです。内部要素[1,2,3]にアクセスする必要があります(これは.eval()またはsess.run()を使用して実行できますが、テンソルのサイズが大きい場合は時間がかかります)
同じことをより速く行う方法はありますか?
前もって感謝します。
テンソル内の要素のサブセットにアクセスするには、主に2つの方法があります。どちらも例で機能します。
インデックス演算子を使用して( 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と同じ多くのスライス仕様をサポートします。
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()
入力して適切な要素を取得します。
時間がかかるのは、1つの要素にアクセスするのではなく、残りの計算だと思います。
また、結果には保存されているメモリからのコピーが必要な場合があります。そのため、グラフィックカード上にある場合は、最初にRAMにコピーしてから要素にアクセスする必要があります。この場合、テンソルフロー操作を追加して最初の要素を取得し、それだけを返すことでスキップできます。
取得する操作をrun()-ningまたはeval()-ingせずに[[1,2,3]]の0番目の要素のvalueを取得することはできません。 「実行」または「評価」する前に、この内部要素を取得する方法の説明しかありません(TFがシンボリックグラフ/計算を使用するため)。そのため、tf.gather/tf.sliceを使用する場合でも、eval/runを介してこれらの操作のvaluesを取得する必要があります。 @mrryの答えを参照してください。