使用循环填充TensorFlow中的矩阵

时间:2017-06-27 21:51:06

标签: python numpy matrix machine-learning tensorflow

所以我试图在TensorFlow中填充矩阵,这个矩阵的大小会根据输入而改变,所以我使用TensorArray来做。基本上,Numpy相当于:

areas = np.zeros((len(rows)-1,len(cols)-1))
for r in range(len(rows)-1):
    for c in range(len(cols)-1):
        areas[r,c] = (rows[r+1]-rows[r])*(cols[c+1]-cols[c])

我尝试使用tf.while_looptf.TensorArray在TensorFlow中实现此功能:

i = tf.constant(0)
areas = tf.TensorArray(dtype='float32', size=length_rc-1)
while_condition = lambda i, rows, areas: tf.less(i, length_rc-1)
def row_loop(i, rows, areas):        
    j = tf.constant(0)
    area = tf.TensorArray(dtype='float32', size=length_rc-1)
    while_condition = lambda j, cols, area: tf.less(j, length_rc-1)

    def col_loop(j, cols, area):
        area = area.write(j, tf.multiply(tf.subtract(rows[i+1],rows[i]),tf.subtract(cols[j+1],cols[j])))
        return [tf.add(j,1), cols, area]

    r = tf.while_loop(while_condition, col_loop, [j, cols, areas])
    areas = areas.write(i, r[2].stack())
    return [tf.add(i, 1), rows, areas]

# do the loop:
r = tf.while_loop(while_condition, row_loop, [i, rows, areas])
areas = r[2].stack()

p = sess.run([areas], feed_dict={pred_batch: pred, gt_batch: gt})

然而,它似乎不起作用,我不知道为什么。正如您所看到的,我的代码类似于这篇文章: Howe TensorArray and while_loop work together in tensorflow?

但它似乎不起作用,任何人都知道问题是什么?我得到的具体错误是:

ValueError: Inconsistent shapes: saw (?,) but expected () (and infer_shape=True)

2 个答案:

答案 0 :(得分:1)

什么不起作用?你期望发生什么与实际发生的事情相比?

首先,在两种情况下,你的循环条件都会以1为单位。在第一种情况下,您将错过最后一行和最后一列,因为range仅生成值 less 而不是其参数。

同样,在第二种情况下,您的条件为tf.less(i, length_rc-1):您可能希望i在上一次迭代中等于length_rc-1,而不是小于tf.less(i, length_rc)。条件应为{{1}}。

答案 1 :(得分:0)

找到了小虫子:

# do the loop:
r = tf.while_loop(while_condition, row_loop, [i, rows, areas])
areas = r[2].stack()

我对tf.while_loop的输入不正确,应该是area而不是areas。除此之外,这是一个有效的方法来执行嵌套循环来填充矩阵。