如何在Tensorflow中将向量转换为单位向量

nes*_*boy 5 python numpy tensorflow

这是一个非常简单的问题,我似乎无法弄清楚.我正在使用一个形状的输出张量[100,250].我希望能够在百位的任何位置访问250维数组并单独修改它们.我发现的tensorflow数学工具要么对整个张量进行元素修改或标量修改.但是,我试图对张量的子集进行标量修改.

编辑:

这是我想用tensorflow方法重新创建的numpy代码:

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
Run Code Online (Sandbox Code Playgroud)

这个for循环遵循250-D而不是3-D的公式 单位向量公式,它是for循环的第一行 .然后,我将每个单位向量乘以幅度,将其重新塑造成我想要的长度.

所以这里更新是numpy [100,250]维输出.我想将每个250维向量转换为其单位向量.这样我就可以将其长度改为我选择的幅度.使用这个numpy代码,如果我运行我的train_step并将update传递给我的一个占位符

sess.run(train_step, feed_dict={x: batch_xs, prediction: output}) 
Run Code Online (Sandbox Code Playgroud)

它返回错误:

No gradients provided for any variable
Run Code Online (Sandbox Code Playgroud)

这是因为我在numpy中完成了数学运算并将其移植回tensorflow. 是一个相关的stackoverflow问题,没有得到解答.

tf.nn.l2_normalize非常接近我所期待的,但是它也把通过的平方根的最大平方和.而我试图将每个向量除以它自己的平方和.

谢谢!

Oli*_*rot 5

这里没有真正的诀窍,你可以像numpy那样做.
唯一要确保的是它norm的形状,[100, 1]以便在分区中播放得很好x / norm.

x = tf.ones([100, 250])

norm = tf.sqrt(tf.reduce_sum(tf.square(x), axis=1, keepdims=True))
assert norm.shape == [100, 1]

res = x / norm
Run Code Online (Sandbox Code Playgroud)