最近遇到一个问题,将每个图像二进制代码(tf.string类型)在形状占位符中一一进行预处理
[batch_size] = [None]
然后我需要在预处理后连接每个结果。
显然我无法创建一个 FOR 句子来解决这个问题。
所以,我使用 tf.while_loop 来做到这一点。它看起来像:
in_ph = tf.placeholder(shape=[None], dtype=tf.string)
i = tf.constant(0)
imgs_combined = tf.zeros([1, 224, 224, 3], dtype=tf.float32)
def body(i, in_ph, imgs_combined):
img_content = tf.image.decode_jpeg(in_ph[i], channels=3)
c_image = some_preprocess_fn(img_content)
c_image = tf.expand_dims(c_image, axis=0)
# c_image shape [1, 224, 224, 3]
return [tf.add(i, 1), in_ph, tf.concat([imgs_combined, c_image], axis=0)]
def condition(i, in_ph, imgs_combined):
return tf.less(i, tf.shape(in_ph)[0])
_, _, image_4d = tf.while_loop(condition,
body,
[i, in_ph, imgs_combined],
shape_invariants=[i.get_shape(), in_ph.get_shape(), tf.TensorShape([None, 224, 224, 3])])
image_4d = image_4d[1:, ...]
这段代码运行正常,没有任何问题。 但在这里,我使用 imgs_combined 来迭代地一张一张地连接每个图像。 imgs_combined 使用 imgs_combined = tf.zeros([1, 224, 224, 3], dtype=tf.float32) 初始化,在这种情况下我可以使用 tf.concat执行此操作,并在最终结果中删除了第一个元素。
但在正常情况下,这个函数就像一个list.append()操作。
X = []
for i, datum in enumerate(data):
x.append(datum)
请注意,这里我仅使用空列表初始化 X。
我想知道tensorflow中是否有类似list.append()的函数?
或者..这段代码有更好的实现吗? 我对初始化imgs_combined感到很奇怪。
最佳答案
您可以尝试tf.TensorArray()
( link ),它支持动态长度,可以写入或读取
值到指定的索引。
import tensorflow as tf
def condition(i, imgs_combined):
return tf.less(i, 5)
def body(i, imgs_combined):
c_image = tf.zeros(shape=(224, 224, 3),dtype=tf.float32)
imgs_combined = imgs_combined.write(i, c_image)
return [tf.add(i, 1), imgs_combined]
i = tf.constant(0)
imgs_combined = tf.TensorArray(dtype=tf.float32,size=1,dynamic_size=True,clear_after_read=False)
_, image_4d = tf.while_loop(condition,body,[i, imgs_combined])
image_4d = image_4d.stack()
with tf.Session() as sess:
image_4d_value = sess.run(image_4d)
print(image_4d_value.shape)
#print
(5, 224, 224, 3)
关于python - tensorflow 中是否有与list.append()类似的函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53968334/