2016-06-30 1 views
4

numfy配列を取得するためにeval()を実行せずにTensorを反復可能にする方法はありますか?iterable取得Tensor without evalを実行

split()を使ってテンソルの2つの部分を反復しようとしていますが、それは私のニューラルネットワークの隠れた層の構造内で起こるので、セッションを開始する前に起こる必要があります。

import tensorflow as tf 
x = tf.placeholder('float', [None, nbits]) 
layer = [x] 
for i in range(1,numbits): 
    layer.append(tf.add(tf.matmul(weights[i-1], layer[i-1]), biases[i-1])) 
    aes, bes = tf.split(1, 2, layer[-1]) 
     if i%2 == 1: 
      for am, a, b in zip(add_layer, aes, bes): 
       layer.append(am.ex(a, b)) 

問題はlayer[-1]この時点でtf.placeholderので、aesbesは両方テンソルであり、私はzip()でそれらを反復処理することができないということです。

すべてのアイデアをいただければ幸いです。

+0

@Peter Hawkins、ありがとう。私はTensorflowのビルトインを掘るよりも簡単な方法はないだろうと恐れていました。私がやったことは、 'tf.slice()'を使って個々の要素に分割することでした。これは私が予想していたよりも苦痛が少なかったのです。 – Vendea

答えて

1

いいえ、ありません。直接ではありません。

Tensorflowプログラムは、計算グラフを作成するPythonの段階を構築することと、計算グラフを実行する実行段階という2つの段階に分かれていると考えるのが最も簡単です。建物の段階では実際には何も実行されません。すべての計算は実行フェーズ中に行われます。構築フェーズは、実行フェーズの結果に依存することはできません(session.run().eval()など)

グラフを作成する際には、グラフを作成する際に反復することはできません。 session.run()を呼び出すまで、実際には特定の値のセットに評価されます。代わりに、それは単に計算グラフのノードへの参照です。

一般に、Tensorflow関数を使用してPythonプリミティブ(zipなど)ではなく、Tensorsを操作する必要があります。私はそれを考えるのが好きですが、Tensorは封印された箱の中にある放射性オブジェクトであり、特定の一連のアクション(Tensorflowライブラリ関数)を実行できるロボットを使って間接的にしか処理できません:-)したがって、Tensorflowプリミティブを使用してタスクを表現する方法を見つける必要があります。

あなたがしようとしていることの完全な例を挙げた場合、より多くのことが言えるかもしれません(あなたのコード断片から私には分かりません)。 1つの可能性は、tf.splitを使用してテンソルをPythonのサブセンサーのリストに分割し、リストにzipのようなものを使用することです。

私はそれが助けてくれることを願っています!

関連する問題