我正在研究使用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))
非常感谢任何帮助!
答案 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]