代码之家  ›  专栏  ›  技术社区  ›  Gerry

tensorflow通过随机因子调整图像大小

  •  2
  • Gerry  · 技术社区  · 6 年前

    当图像大小未知时,我正在尝试在图形构建过程中按系数调整图像大小:

    H, W, _ = img.get_shape()
    scale = tf.random_uniform([1], minval=1, maxval=1.5, dtype=tf.float32, seed=None, name=None)
    

    其中,我需要神奇地计算出一个大小,它将转化为以下内容:

    tf.image.resize_images(tf.expand_dims(img, 0), [H*scale, W*scale])
    

    返回:

    ValueError: 'size' must be a 1-D int32 Tensor
    

    非常感谢您的帮助。非常感谢。

    2 回复  |  直到 6 年前
        1
  •  4
  •   javidcf    6 年前

    scale (1,) 所以 [H*scale, W*scale] (1, 2) 。要修复它,只需生成一个标量随机数,而不是一个1元素向量:

    scale = tf.random_uniform([], minval=1, maxval=1.5, dtype=tf.float32, seed=None, name=None)
    

    请注意,形状是一个空列表,这意味着您需要一个标量。

    除此之外,您还必须修复 size 参数,如下所示:

    tf.image.resize_images(tf.expand_dims(img, 0), tf.cast([H*scale, W*scale], tf.int32))
    
        2
  •  3
  •   David Parks    6 年前

    您的问题是,您正在混合python列表 [H*scale, W*scale] 用张量。默认情况下,tensorflow会根据需要将类似这样的列表转换为tensorflow常量。但在这种情况下,您的列表包含张量,最终得到的是一组不是1D的嵌套张量。

    为了避免在这种情况下出现混淆,请停止使用诸如列表之类的python构造,并显式地将高度和宽度转换为tensorflow构造,并在继续之前检查其形状。

    x = tf.concat((scale*W, scale*H), axis=0)
    print(x)
    Tensor("concat_3:0", shape=(2,), dtype=float32)
    

    这样做表明我们现在有了所需的一维张量。但它是float32(至少在我设置的简单测试用例中是这样),所以让我们将其转换为int:

    x = tf.cast(x, tf.int32)
    

    现在你准备好了

    tf.image.resize_images(tf.expand_dims(img, 0), size=x)
    

    此处不应出现错误。