TensorFlow未知图像尺寸下按随机因子缩放图像报错求助
解决TensorFlow随机缩放未知尺寸图像的
ValueError问题 你遇到的问题核心在于几个细节没处理好:一是获取图像尺寸的方式不对(静态形状 vs 动态形状),二是缩放后的尺寸类型和维度不符合tf.image.resize_images的要求。咱们一步步来修正:
问题分析
img.get_shape()返回的是TensorShape对象,当图像尺寸未知时,H/W可能是None,而且它不是可计算的Tensor,没法和scale(Tensor)直接相乘;scale是形状为[1]的float32 Tensor,直接计算H*scale会得到不符合要求的结果;tf.image.resize_images要求size必须是一维int32类型的Tensor,而你当前的计算结果是浮点型,维度也不对。
修正后的代码方案
# 1. 获取图像的动态形状(返回的是Tensor,支持运行时计算) img_shape = tf.shape(img) H = img_shape[0] W = img_shape[1] # 2. 生成标量形式的随机缩放因子(避免多余维度带来的计算麻烦) scale = tf.random_uniform([], minval=1, maxval=1.5, dtype=tf.float32, seed=None, name=None) # 3. 计算缩放后的尺寸,转换为int32类型并整理成一维Tensor new_H = tf.cast(tf.multiply(tf.cast(H, tf.float32), scale), tf.int32) new_W = tf.cast(tf.multiply(tf.cast(W, tf.float32), scale), tf.int32) target_size = tf.stack([new_H, new_W]) # 4. 执行缩放操作 resized_img = tf.image.resize_images(tf.expand_dims(img, 0), target_size)
关键细节说明
- 用
tf.shape(img)替代img.get_shape():前者获取的是图像的动态形状Tensor,在运行时会根据输入图像的实际尺寸计算,完全适配尺寸未知的场景; - 生成标量缩放因子:
tf.random_uniform([])生成的是标量Tensor,比[1]形状的Tensor更方便后续计算,不需要额外处理维度挤压; - 类型转换:先把H/W转成float32和scale相乘,再转成int32,完美满足
resize_images对size参数的类型要求; - 用
tf.stack组合尺寸:把new_H和new_W组合成一维Tensor,完全匹配size参数的格式要求。
这样修改后,就能顺利执行未知尺寸图像的随机缩放操作啦。
内容的提问来源于stack exchange,提问作者Gerry
相关产品推荐
相关产品推荐

