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

Je voudrais convertir en tensor([0,0,0,1,0,0,0]) (indice = 3)Comment convertir un tenseur de tableau en un_hot avec un index spécifique?

Comment puis-je faire facilement cela? Ce que j'ai vraiment essayé de faire est comme ceci: Il y a un réseau neuronal profond qui a 5 noeuds de sorties (pour la classification). Disons que la sortie d'une propagation directe est [5, 22, 3, 4, 11] (type tensor). Dans ce feedforward, l'étiquette est 1. Donc, je dois activer la valeur de cet index et désactiver d'autres comme ceci: [5, 0, 0, 0, 0]. Enfin, besoin de changer la valeur à 1: [1, 0, 0, 0, 0] et backpropagate (gradient) ce tenseur dans le réseau.

+0

Je ne comprends pas clairement, 'a' ne définit que la taille du tableau de sortie? et 'index_number' est' Tensor' avec 0 dimensions? –

+0

@VladimirBystricky J'ai édité le post. – user3595632

+0

Si vous voulez de bonnes réponses, donnez-nous d'autres exemples. En ce moment votre problème n'est pas bien défini. –

Répondre

0

Ce que vous cherchez n'est pas un codage à chaud. Peut-être cela est ce que vous voulez atteindre:

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] 

EDIT

Si vous avez des connaissances sur l'index déjà, vous pouvez le faire de plusieurs façons. S'il y a une chance que les valeurs dans votre tenseur peut répéter, vous pouvez faire quelque chose comme ceci:

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] 

Mais si vous êtes sûr que les valeurs ne sont pas répétées, vous pouvez construire ce tenseur avec l'aide du tableau numpy comme ceci:

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

sur la base de nouvelle question sous la direction, pour faire une tâche de classification et comme il me semble que vous ne faites pas backpropogation personnalisé, laissez-moi donner y ou un code squelette de la pièce que vous recherchez.

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}) 

Veuillez prendre le temps de comprendre le code. Je vous recommande également de suivre un tutoriel sur les tâches de classification car ils sont largement disponibles. Je vous suggérerais CNN by TensorFlow.

+0

Que faire si je ne connais pas la valeur, mais que j'ai une connaissance de l'index? – user3595632

+0

@ user3595632 J'ai modifié ma réponse. Vérifie ça. – user1190882

+0

Merci pour votre réponse – user3595632

0

Ce morceau de code devrait le faire. Il utilise 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)]) 

Je ne sais pas exactement si ce que vous avez besoin, mais j'espère que cela aide. Exemple:

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