2016-06-27 2 views
4

Это довольно простой вопрос, который я просто не могу понять. Я работаю с выходным тензором формы [100, 250]. Я хочу иметь доступ к массиву 250 размерности в любом месте по стом и изменять их отдельно. Математические инструменты tensorflow, которые я нашел, либо модифицируют по типу, либо скалярную модификацию на всем тензоре. Тем не менее, я пытаюсь сделать скалярную модификацию на подмножествах тензора.Как преобразовать вектор в единичный вектор в Tensorflow

РЕДАКТИРОВАТЬ:

Здесь NumPy код, который я хотел бы воссоздать с методами tensorflow:

update = sess.run(y, feed_dict={x: batch_xs}) 
for i in range(len(update)): 
     update[i] = update[i]/np.sqrt(np.sum(np.square(update[i]))) 
     update[i] = update[i] * magnitude 

Этот цикл следует эту формулу в 250-D вместо 3-D Unit vector formula, which is the first line of the for-loop , Затем я умножаю каждый единичный вектор по величине, чтобы преобразовать его в нужную длину.

Таким образом, обновление здесь представляет собой размерный размер [100, 250]. Я хочу преобразовать каждый 250-мерный вектор в его единичный вектор. Таким образом, я могу изменить свою длину до величины моего выбора. Используя этот Numpy код, если я бегу мой train_step и передать обновление в одном из моих заполнителей

sess.run(train_step, feed_dict={x: batch_xs, prediction: output}) 

он возвращает ошибку:

No gradients provided for any variable 

Это потому, что я сделал математику в NumPy и портирована он возвращается в тензор. Here - связанный с этим вопрос о стеке, который не получил ответа.

tf.nn.l2_normalize очень близко к тому, что я ищу, но он делит на квадратный корень максимум сумма квадратов. В то время как я пытаюсь разделить каждый вектор на свою сумму квадратов.

Спасибо!

+0

Итак, по-другому можно сформулировать следующие вопросы: , если у меня есть тензор [x, y] и тензор [x, 1], могу ли я выполнять математические операции так, чтобы значение в '1 'влияет на каждое соответствующее значение в категории' y '? Не элементный, но не специально скалярное умножение. –

+0

Я нахожу ваш вопрос очень неясным. Не могли бы вы дать код для того, как вы это сделаете в numpy? –

+0

возможно, используя карту funciont of tensorflow? Он доступен в 0,9 – jorgemf

ответ

3

Здесь нет никакой реальной трюки, вы можете сделать это как в numpy.
Единственное, что нужно сделать, это то, что norm имеет форму [100, 1], так что он хорошо транслирует в разделе x/norm.

x = tf.placeholder(tf.float32, [100, 250]) 

norm = tf.sqrt(tf.reduce_sum(tf.square(x), 1, keep_dims=True)) 

res = x/norm 
0

Вы можете пользователь tf.norm получить квадратный корень из суммы квадратов. (ТФ версия == 1.4 в моем коде.)

Пример кода:

import tensorflow as tf 
    a = tf.random_uniform((3, 4)) 
    b = tf.norm(a, keep_dims=True) 
    c = tf.norm(a, axis=1, keep_dims=True) 
    d = a/c 
    e = a/tf.sqrt(tf.reduce_sum(tf.square(a), axis=1, keep_dims=True) + 1e-8) 
    f = a/tf.sqrt(tf.reduce_sum(tf.square(a), axis=1, keep_dims=True)) 
    g = tf.sqrt(tf.reduce_sum(tf.square(a), axis=1, keep_dims=True)) 
    with tf.Session() as sess: 
    sess.run(tf.global_variables_initializer()) 
    a_eval, b_eval, c_eval, d_eval, e_eval, f_eval, g_eval = sess.run([a, b, c, d, e, f, g]) 
    print(a_eval) 
    print(b_eval) 
    print(c_eval) 
    print(d_eval) 
    print(e_eval) 
    print(f_eval) 
    print(g_eval) 

выход:

[[ 0.29823065 0.76523042 0.40478575 0.44568062] 
[ 0.0222317 0.12344956 0.39582515 0.66143286] 
[ 0.01351094 0.38285756 0.46898723 0.34417391]] 
[[ 1.4601624]] 
[[ 1.01833284] 
[ 0.78096414] 
[ 0.6965394 ]] 
[[ 0.29286167 0.75145411 0.39749849 0.43765712] 
[ 0.02846699 0.15807328 0.50684166 0.84694397] 
[ 0.01939724 0.54965669 0.6733104 0.49411979]] 
[[ 0.29286167 0.75145411 0.39749849 0.43765712] 
[ 0.02846699 0.15807328 0.50684166 0.84694397] 
[ 0.01939724 0.54965669 0.6733104 0.49411979]] 
[[ 0.29286167 0.75145411 0.39749849 0.43765712] 
[ 0.02846699 0.15807328 0.50684166 0.84694397] 
[ 0.01939724 0.54965669 0.6733104 0.49411979]] 
[[ 1.01833284] 
[ 0.78096414] 
[ 0.6965394 ]] 

Вы можете увидеть, что нет никакой разницы между a/tf.norm(a, axis=1, keep_dims=True) и a/tf.sqrt(tf.reduce_sum(tf.square(a), axis=1, keep_dims=True) + 1e-8).

a/tf.sqrt(tf.reduce_sum(tf.square(a), axis=1, keep_dims=True) + 1e-8) является предпочтительным, поскольку он может обрабатывать нулевой регистр.

Смежные вопросы