2017-08-08 19 views
-1

クラスインスタンスのリストが与えられたら、tf.tensorを使用してインデックスを作成する必要があります。例えば:TensorFlowテンソルを使用してクラスインスタンスのリストをインデックスする方法

Class Something(): 
    def __init__(self): 
     self.a = 1 
     self.b = 2 

list = [Something() for a in range(0, 10)] 
index_queue = tf.train.range_input_producer(len(list)) 
index = index_queue.dequeue() 
result = list[index] 
tensor = function_that_returns_tensor(result) 
with tf.Session() as sess: 
    sess.run(tensor) 

上記のコードは、次のエラーを与える:TypeError: list indices must be integers, not Tensor

そしてtf.gather(list, index)を使用すると、次のエラーを与える:

TypeError: Expected binary or unicode string, got <__main__.Something object at 0x7f4529fae2b0> 

すべてのヘルプは高く評価されるだろう。ありがとう!

+0

なぜtf.constant(..)を使用しますか? 'list [2]'は正常に動作します... –

+0

私は質問を修正しました。したがって、インデックスはグラフの実行中にある値を持つtf.tensorです。 –

答えて

0

この問題は、TensorFlowがどのように機能するかについての主要なメカニックによるものです。 tf.train.range_input_producer(len(list))またはtf.constantのようなTensorFlowメソッドを呼び出すと、実際にはとなり、これらの操作はとなります。これらの操作をTensorFlow計算グラフに追加するだけです。これらの操作を実行して結果を得るには、tf.Sessionインスタンスのrunメソッドを使用する必要があります。 TypeError: list indices must be integers, not Tensorは、テンソルを生成する演算を実行して戻された結果ではなく、計算グラフ上のテンソルへの参照をインデックスとして渡していることを伝えています。

詳細については、this TensorFlow documentationを参照してください。

+0

お返事ありがとうございました。はい、私はTensorflowの全体的なメカニックを理解しています。私が報告したエラーは、これらの操作をtf.Sessionで実行しているときに得られるものです。私はそれに応じて問題を修正しました。 –

+0

@UmarIqbal、あなたの更新されたコードでは、 'tf.Session'の実行から返されるものではなく、テンソルへの参照をリストのインデックスとして渡しています。あなたのコードでは、 'index'は整数ではなくテンソルへの参照です。整数を取得するには、 'index_value = sess.run(index)'を実行する必要があります。それで 'list [index_value]'が動作します。 – golmschenk

+0

@UmarIqbalしかし、キューには別の問題があることにも注意してください。私が述べた変更を行うと、あなたのコードはハングアップしているように見えます。これは、キューが動作するためにキューのランナーを必要とするためです。 [here](https://www.tensorflow.org/programmers_guide/threading_and_queues)に関する詳しい情報。しかし、キューの代わりに定数(または他の何らかの非テンソル生成テンソル)を使用していた元の例では、それがうまくいくはずです。 – golmschenk

関連する問題