这是一个非常简单的问题,我似乎无法弄清楚。我正在使用一个形状的输出张量[100,250]。我希望能够在百位的任何位置访问250维数组并单独修改它们。我发现的张量流数学工具要么对整个张量进行元素修改或标量修改。但是,我试图对张量的子集进行标量修改。
编辑:
这是我想用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
这个for循环遵循250-D而不是3-D的公式 。然后,我将每个单位向量乘以大小,将其重新塑造成我想要的长度。
所以这里更新是numpy [100,250]维度输出。我想将每个250维向量转换为其单位向量。这样我就可以将其长度改为我选择的幅度。使用这个numpy代码,如果我运行我的train_step并将update传递给我的一个占位符
sess.run(train_step, feed_dict={x: batch_xs, prediction: output})
它返回错误:
No gradients provided for any variable
这是因为我在numpy中完成了数学计算并将其移植回tensorflow。 Here是一个相关的stackoverflow问题,没有得到解答。
tf.nn.l2_normalize非常接近我要找的东西,但它除以最大平方和的平方根。而我试图将每个向量除以它自己的平方和。
谢谢!
答案 0 :(得分:5)
这里没有真正的伎俩,你可以像在numpy中那样做
唯一要确保的是WRAPPER_IMPL
具有norm
形状,以便在[100, 1]
部门中广播得很好。
x / norm
答案 1 :(得分: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)
是首选,因为它可以处理零情况。