2015-12-14 1 views
2

Следующий код работает нормально, но использует eval(), который, я думаю, будет неэффективным. Есть ли лучший способ добиться того же?Tensorflow: одна горячая кодировка

import tensorflow as tf 
import numpy as np 
sess = tf.Session() 
t = tf.constant([[4,5.1,6.3,5,6.5,7.2,9.3,7,1,1.4],[4,5.1,9.3,5,6.5,7.2,1.3,7,1,1.4],[4,3.1,6.3,5,6.5,3.2,5.3,7,1,1.4]]) 
print t 
a = tf.argmax(t,1).eval(session=sess) 
z = [ k==np.arange(14) for k in a] 
z1 = tf.convert_to_tensor(np.asarray(z).astype('int32')) 
print z1 
print sess.run(z1) 

выход

Tensor("Const_25:0", shape=TensorShape([Dimension(3), Dimension(10)]), dtype=float32) 
Tensor("Const_26:0", shape=TensorShape([Dimension(3), Dimension(14)]), dtype=int32) 
[[0 0 0 0 0 0 1 0 0 0 0 0 0 0] 
[0 0 1 0 0 0 0 0 0 0 0 0 0 0] 
[0 0 0 0 0 0 0 1 0 0 0 0 0 0]] 

ответ

3

Один из способов ее достижения является вычисление макс на каждой строке, а затем сравнить каждый элемент к этому значению. У меня нет тензорного потока, установленного на этой машине, поэтому не может предоставить вам точный код, но он будет выглядеть следующим образом:

z1 = tf.equal(t, tf.reduce_max(t, reduction_indices=[1], keep_dims=True)) 
+0

Спасибо тонну. Делали это в течение 3 дней подряд, и последний испорченный код, который я написал, потому что eval не работал, поглотил весь мой 16Gig при компиляции этого шага и все еще был голоден, когда я убил :( –

+0

Вы также можете проверить из основного примера обучения в Scikit Flow, если ваши данные слишком велики, чтобы вписаться в память. –