2016-07-14 49 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-我實現了張量中的優化功能 – xxx222

+0

讓我知道這是否是您想要的更好的例子。 – Steven