2017-10-19 48 views
0
a = tf.constant([20, 1, 5, 3, 123, 4]) 

我想將其轉換爲tensor([0,0,0,1,0,0,0])(指數= 3)如何將數組張量轉換爲具有特定索引的one_hot?

我怎麼能輕易做到這一點?

我真正試圖做的是這樣的:有是有5個輸出節點(分類)一深層神經網絡。假設一個前饋傳播的輸出是[5,22,3,4,11](類型爲tensor)。在此前饋中,標籤爲1.因此,我需要打開此索引的值並關閉其他人,如[5,0,0,0,0]。最後,需要將該值更改爲1:[1,0,0,0,0],並在網絡中反向傳播(梯度)該張量。

+0

我不清楚地理解,'A'僅限定輸出數組的大小? 'index_number'是0維度的'Tensor'? –

+0

@VladimirBystricky我編輯後。 – user3595632

+0

如果你想得到好的答案,給我們更多的例子。現在你的問題沒有很好的定義。 –

回答

0

你要找的是不是一個熱編碼。也許這就是你想要達到的目標:

a = tf.constant([20, 1, 5, 3, 123, 4]) 
c = tf.cast(tf.equal(a, 3), tf.int32) # 3 is your matching element 
with tf.Session() as sess: 
    print(c.eval()) 

# [0 0 0 1 0 0] 

編輯

如果您有關於指數知識已經,您可以通過多種方式做到這一點。 如果在您的張量的值可以重複的機會,你可以做這樣的事情:

a = tf.constant([20, 1, 5, 3, 123, 4, 3]) 
c = tf.cast(tf.equal(a, a[3]), tf.int32) 
with tf.Session() as sess: 
    print(c.eval()) 
# [0 0 0 1 0 0 1] 

但如果你確信值不重複,就可以構造這個張量numpy的陣列狀的幫助這樣的:

import numpy as np 

c = np.zeros((7), np.int32) 
c[3] = 1 
c_tensor = tf.constant(c) 
with tf.Session() as sess: 
    print(c_tensor.eval()) 
# [0 0 0 1 0 0 0] 

EDIT 2

基於新編輯的問題,做一個分類的任務,因爲在我看來,你是不是做定製backpropogation,讓我給ÿ ou是你正在尋找的部分的骨架代碼。

tf.reset_default_graph() 

X = tf.placeholder(tf.float32, (None, 224, 224, 3)) 
y = tf.placeholder(tf.int32, (None)) 
one_hot_y = tf.one_hot(y, n_outputs) # Generate one-hot vector 

logits = My_Network(X) # This function returns your network. 
cross_entropy = tf.reduce_sum(tf.nn.softmax_cross_entropy_with_logits(logits, one_hot_y)) 
    # This function will compute softmax and get the loss function which you 
    # would like to minimize. 

optimizer = tf.train.AdamOptimizer(learning_rate = 0.01).minimize(cross_entropy) 

with tf.Session() as sess: 
    sess.run(tf.global_variables_initializer()) 

    for **each epoch**: 
     for **generate batches of your data**: 
      sess.run(optimizer, feed_dict = {X: batch_x, y: batch_y}) 

請花一些時間瞭解代碼。我還建議你遵循一些分類任務的教程,因爲它們很豐富。我建議你CNN by TensorFlow

+0

如果我不知道價值,但只知道指數,該怎麼辦? – user3595632

+0

@ user3595632我編輯了我的答案。覈實。 – user1190882

+0

感謝您的回答 – user3595632

0

這段代碼應該這樣做。它使用Numpy:

import numpy as np 
def one_hot(y): 
    y = y.reshape(len(y)) 
    n_values = int(np.max(y)) + 1 
    return tf.convert_to_tensor(np.eye(n_values)[np.array(y, dtype=np.int32)]) 

我不完全確定這是否你需要,但我希望它有幫助。 實施例:

>>> print(one_hot(np.array([2,3,4]))) 
>>> [[ 0. 0. 1. 0. 0.] 
    [ 0. 0. 0. 1. 0.] 
    [ 0. 0. 0. 0. 1.]] 
相關問題