2015-11-30 33 views
10

テンソルフローのインデックスがまだ開いていることがわかりました。(#206)ですので、現時点では回避策として何が使えるのか不思議です。私は、すべてのトレーニングの例で変わる変数に基づいて行列の行/列をインデックス/スライスする必要があります。プレースホルダに基づいて変数に基づいたTensorflowスライシング

  1. スライス(動作しない)

を一定の数に基づいて、次の(作業)コードスライス:私がこれまで試したどのような

import tensorflow as tf 
import numpy as np 

x = tf.placeholder("float") 
y = tf.slice(x,[0],[1]) 

#initialize 
init = tf.initialize_all_variables() 
sess = tf.Session() 
sess.run(init) 

#run 
result = sess.run(y, feed_dict={x:[1,2,3,4,5]}) 
print(result) 

しかし、これらの固定数のうちの1つを単にtf.placeholderに置き換えることはできないようです。次のコードは私にエラーを与えます。 "TypeError:単一のTensorが期待するときのテンソルのリスト"

import tensorflow as tf 
import numpy as np 

x = tf.placeholder("float") 
i = tf.placeholder("int32") 
y = tf.slice(x,[i],[1]) 

#initialize 
init = tf.initialize_all_variables() 
sess = tf.Session() 
sess.run(init) 

#run 
result = sess.run(y, feed_dict={x:[1,2,3,4,5],i:0}) 
print(result) 

は、これはあまりにも多くのです[i]は周りの括弧のように聞こえるが、それらを除去することのいずれか助けていません。プレースホルダ/変数をインデックスとして使用する方法

Pythonの変数に基づいて
  • スライシング(適切に更新/バックプロパゲーションない)
  • Iはまた、指標として通常のPython変数を使用して試みました。これによりエラーは発生しませんが、ネットワークはトレーニング中に何も学習しません。変化する変数が適切に登録されておらず、グラフが不正であり、更新が機能しないためです。

    ワンホットベクター+乗算(作品が、遅い)を介し
  • スライス

    一つ私が見つけた問題を回避するには、ワンホットベクターを使用しています。 numpyでワンホットベクトルを作成し、プレースホルダを使用してこれを渡し、次に行列乗算によってスライスします。これは動作しますが、かなり遅いです。

    変数に基づいて効率的にスライス/インデックスする方法はありますか?

  • 答えて

    15

    プレースホルダに基づくスライシングはうまくいくはずです。形状やタイプの微妙な問題のために、タイプエラーに遭遇しているようです。あなたは以下のいるところ:

    x = tf.placeholder("float") 
    i = tf.placeholder("int32") 
    y = tf.slice(x,i,[1]) 
    

    を...そしてあなたがsess.run()への呼び出しに[0]ようi養う必要があります。

    x = tf.placeholder("float") 
    i = tf.placeholder("int32") 
    y = tf.slice(x,[i],[1]) 
    

    ...あなたの代わりに持っている必要があります。また

    import tensorflow as tf 
    import numpy as np 
    
    x = tf.placeholder(tf.float32, shape=[None]) # 1-D tensor 
    i = tf.placeholder(tf.int32, shape=[1]) 
    y = tf.slice(x, i, [1]) 
    
    #initialize 
    init = tf.initialize_all_variables() 
    sess = tf.Session() 
    sess.run(init) 
    
    #run 
    result = sess.run(y, feed_dict={x: [1, 2, 3, 4, 5], i: [0]}) 
    print(result) 
    

    追加shape引数をtf.placeholder OPのヘルプを使用すると、フィードの値が適切な形状を有していることを保証するために、そして:

    は、私は次のようにコードを書き換えることをお勧めします、この小さな明確にするために、シェイプが正しくない場合、TensorFlowはエラーを発生させます。

    +0

    これは動作します、ありがとうございます! – Daniela

    +0

    それは以下のエラーを出しました: ValueError:Shape()はランク1を持つ必要があります – tejaskhot

    +0

    ああ、TensorFlowはこれを投稿してからスカラーと長さ1のベクトルの違いについて厳密になりました。それを修正する答えを更新しました。 – mrry

    関連する問題