2016-07-14 3 views
1

セイtensorflowで、私はテンソルの一部へのポインタをテンソルフローで得ることはできますか?

C = tf.Variable(tf.random_uniform([n_sample, n_sample], -1, 1), name='C')で変数を作成し、

今、私は変数の最初の列へのポインタを取得したい、私はそれを行うことができとにかくがありますか? tf.slice(C, [0,0], [n_sample,1])私に欲しいものを教えてもらうか、値がCに格納された別の変数を作成します。

私の最適化機能は、CとC

+0

実際にこれを自分でテストしようとしましたか?私の推測では、スライスは元のテンソルのビューであり、全く異なるオブジェクトではありません。 –

+0

今、私はそれが単なるテンソルだと思っていますが、変数ではないと思います。 – xxx222

答えて

1

の各列の両方に依存しているので、私はそれをしたい理由は、私の知る限り、あなたが本当にデータ自体(すなわちへのアクセスを得ることができない知っているようですポインタのように)。その理由は、コードがデータに依存しないため、その部分について心配することなく、異なるCPUやGPUにデータを渡すことができることです(または使用するデバイスを指定することは難しくなりますが、面倒です)。

だから、tf.sliceは正しい関数です。

あなたができる

for i in range(n_sample): 
    curr_slice = tf.slice(C, [i,0], [n_sample,1]) 
    do_something(curr_slice) 

これが最も効率的なバージョンではありませんが、それはあなたがコメントでを求めたものです。非常にクリーン

for i inVectorized range(n_sample):approach 
curr_sliceloss = tf.slice(C, [i,0], [n_sample,1]) 
y.assign_add(tf.nn.l2_loss(tf.sub(curr_slice,X - tf.matmul(X,curr_slice)C)) + lambdalamb * tf.nn.l2_loss(curr_slice) C) 

loss=tf.reduce_sum(y) 

ベクトル化のアプローチ:あなたはプレースホルダを作成することにより、一部の値を初期化する必要があるかもしれません

loss = tf.nn.l2_loss(X - tf.matmul(X,C)) + lamb * tf.nn.l2_loss(C) 

train_step = tf.train.GradientDescentOptimizer(0.01).minimize(loss) 
init = tf.initialize_all_variables() 
sess = tf.Session() 
sess.run(init)  
sess.run(train_step) 

。 また、私はまだskflowでそれを見つけることができませんでしたが、scikitでそれは簡単な3ライナーを学ぶ。

from sklearn.linear_model import Ridge 
clf = Ridge(alpha=1.0) 
clf.fit(X, W) 
+0

私がやろうとしているのは、最小化することで最適化されたCの値を得ることができるコスト関数を構築することです。私がここに投稿する質問と同様に、http://stackoverflow.com/questions/38376473/how-do- i-implement-the-optimized-function-in-tensorflow – xxx222

+0

これがあなたが望むもののより良い例かどうか教えてください。 – Steven

関連する問題