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

私はどのように私は簡単にこれを行うことができtensor([0,0,0,1,0,0,0])(インデックス= 3)配列テンソルを特定のインデックスのone_hotに変換するにはどうすればよいですか?

にこれを変換したいですか?

私が実際にやったことは次のようなものです:5つの出力ノード(分類用)を持つディープニューラルネットワークがあります。 1つのフィードフォワード伝播の出力が[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] 

EDIT

すでにインデックスについての知識を持っている場合は、複数の方法でこれを行うことができます。

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をしていないように私には見えるので、分類タスクを行うとするために、私はYを与えてみましょうあなたが探している部分のスケルトンコード。

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

このコードを実行する必要があります。あなたが必要なもの、この場合

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

私は正確にわからないが、私はそれが役に立てば幸い:それはnumpyのを使用しています。 例:

>>> print(one_hot(np.array([2,3,4]))) 
>>> [[ 0. 0. 1. 0. 0.] 
    [ 0. 0. 0. 1. 0.] 
    [ 0. 0. 0. 0. 1.]] 
関連する問題