Tensorflow - 拆分,操作,然后求和2D数据点

时间:2018-05-28 20:56:57

标签: python tensorflow

我正在研究使用tensorflow的问题,我想对2d数据集中的所有1d数据应用相同的张量操作,然后将这些操作的结果加在一起。

例如,让我们说我有一个数据点:

x0 = [[1, 0, 1, 1],
      [0, 1, 1, 0],
      [1, 2, 0, 1],
      [0, 2, 2, 0]]

张量操作(函数可能是更准确的术语)f(x)

我想做点什么

y = sum([f(x) for x in x0]

我在TF中正确表达这一点有点困难。我认为我得到的最接近的是。

x = tf.placeholder(tf.float32, [None, 10, 10])

x_sub = tf.placeholder(tf.float32, [None, 10])

W1 = weight_variable([10, 10])
b1= bias_variable([10])

l1 = tf.nn.relu(tf.matmul(x_sub, W1) + b1)

Wf = weight_variable([10, 1])
bf = bias_variable([1])

y_sub = tf.matmul(l1, Wf) + bf

y = ? # I would like to split/unstack x here, apply y_sub to each
      # tensor resulting from the split (shaped [None, 10]) and then
      # add the results together

y_ = tf.placeholder(tf.float32, [None, 1]) 

cross_entropy = tf.reduce_mean(tf.losses.mean_squared_error(y_, y))

非常感谢任何帮助!

2 个答案:

答案 0 :(得分:1)

如果我正确地理解了你的问题,你似乎想要执行批量矩阵乘法和加法(乘法,分别添加,...).GroupBy(i => i.Key).Select(g => g.First()).ToDictionary(... 堆积在第一维上的一批元素,{{1}然后是x,分别是W1,然后是Wf)。

这可以通过一些手动或自动广播直接完成:

b1

答案 1 :(得分:1)

有一个功能完全符合您的要求:tf.foldl

tf.foldl的第一个参数是函数fn这不是您的功能f 。相反,它是一个功能,它结合了您的f和您想要执行的总和。换句话说,如果您有一个函数f可以在单个张量上运行,那么您可以将fn定义为:

fn=lambda acc,x: acc+f(x)

在此lambda表达式中,acc表示所有行的当前累计总和,x表示当前行。因此,fn在这种情况下的作用是在当前行上应用f并将结果添加到累计总和中。

tf.foldl的下一个参数只是你想要应用这些函数的张量。

例如,我们假设f只是一个平方函数。然后:

import tensorflow as tf

x0 = tf.constant([[1, 0, 1, 1],
      [0, 1, 1, 0],
      [1, 2, 0, 1],
      [0, 2, 2, 0]])
f = lambda u: tf.square(u)

fn = lambda acc,x: acc+f(x)
y = tf.foldl(fn,x0)

sess = tf.InteractiveSession()
sess.run(y) # output is [2,9,6,2]

tf.foldl的另一个论点是initializer,它将积累初始化为正确的值和形状。如果函数f更改了每行的大小,则需要这样做。这是一个例子:

x0 = tf.constant([[1, 0, 1, 1],
      [0, 1, 1, 0],
      [1, 2, 0, 1],
      [0, 2, 2, 0]])
f = lambda u: tf.concat([u,u],0)

fn = lambda acc,x: acc+f(x)
initializer = tf.constant([0,0,0,0,0,0,0,0])
y = tf.foldl(fn,x0,initializer)

sess = tf.InteractiveSession()
sess.run(y) # output is  [2, 5, 4, 2, 2, 5, 4, 2]