如何在Tensorflow

时间:2016-06-27 18:45:22

标签: python numpy tensorflow

这是一个非常简单的问题,我似乎无法弄清楚。我正在使用一个形状的输出张量[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的公式 Unit vector formula, which is the first line of the for-loop 。然后,我将每个单位向量乘以大小,将其重新塑造成我想要的长度。

所以这里更新是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非常接近我要找的东西,但它除以最大平方和的平方根。而我试图将每个向量除以它自己的平方和。

谢谢!

2 个答案:

答案 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)是首选,因为它可以处理零情况。