我正在尝试在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])
我尝试在TensorFlow中使用tf.while_loop
和tf.TensorArray
来实现这个功能:
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})
然而,这似乎不起作用,我不确定为什么。正如你所见,我的代码与这个帖子类似:TensorFlow中如何让TensorArray和while_loop一起工作?
但它似乎不起作用,有人知道问题出在哪里吗?我得到的具体错误是:
ValueError: Inconsistent shapes: saw (?,) but expected () (and infer_shape=True)
回答:
找到了一个小错误:
# do the loop:r = tf.while_loop(while_condition, row_loop, [i, rows, areas])areas = r[2].stack()
我传给tf.while_loop
的输入是错误的,应该是area
而不是areas
。除此之外,这是一个有效的嵌套循环填充矩阵的方法。