张量流中是否有与list.append()类似的功能?

时间:2018-12-29 09:31:25

标签: python tensorflow

最近我遇到了一个问题,该问题在具有形状的占位符中逐个预处理每个图像二进制代码(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感到很奇怪。

1 个答案:

答案 0 :(得分:1)

您可以尝试"quotes": ["error", "single", { avoidEscape: true, allowTemplateLiterals: true }], link),它支持动态长度并且可以写入或读取
值到指定的索引。

tf.TensorArray()