图像增强时的数据拆分

来源:5-9 图像增强实战

慕虎9426780

2019-10-07

在图像增强时对mini batch里的数据拆分成单独的图片用到了
x_image_arr = tf.split(x_image, num_or_size_splits=batch_size, axis=0)
这里因为要把拆分成多少张作为参数传入所以在定义图之前预先赋值batch_size=20但这样在构建图时就要固定batch_size影响模型的泛化。
我看到之前对pooling做padding的时候用到了从tensor里获取shape的方法用在了下面的得到padding填充值的操作中

max_pooling_shape = max_pooling.get_shape().as_list()[1:]
input_shape = x.get_shape().as_list()[1:]
width_padding = (input_shape[0] - max_pooling_shape[0]) // 2

那么既然可以从tensor中获取shapex_image能不能也用get_shape()的方法每次获取batch_size的大小呢
我尝试了类似的方法

bs = list(x_image.get_shape())[0]
x_image_arr = tf.split(x_image, num_or_size_splits=bs, axis=0)

结果却得到了这样的错误

ValueError                                Traceback (most recent call last)
<ipython-input-7-ed0bd47f1056> in <module>
     74 # bs = x_image.get_shape().to_list()[0]
     75 bs = list(x_image.get_shape())[0]
---> 76 x_image_arr = tf.split(x_image, num_or_size_splits=bs, axis=0)
     77 result_x_image_arr = []
...
~Anaconda3libsite-packages	ensorflowpythonrameworkconstant_op.py in _dimension_tensor_conversion_function(d, dtype, name, as_ref)
    356   _ = as_ref
    357   if d.value is None:
--> 358     raise ValueError("Cannot convert an unknown Dimension to a Tensor: %s" % d)
    359   if dtype is not None:
    360     if dtype not in (dtypes.int32, dtypes.int64):

ValueError: Cannot convert an unknown Dimension to a Tensor: ?

这个错误的意思是说tensor第一维的batch_size不能动态的被解析吗
为什么在前面pooling的padding获取信息不会有这个问题
如何正确的动态获取batch_size呢

写回答

1回答

正十七

2019-10-18

tf里的get_shape方法虽然能获取tensor的维度信息,但是tensorflow是先构建图再去训练的,所以不支持获取动态的维度信息。前面在做padding的时候,虽然也用到了get_shape方法,但是使用的确实已经固定了的后面的维度。在这里,batch_size如果是动态的话,那么get_shape获取到的也是unknown,所以是无法这样操作的。

1
1
慕虎9426780
非常感谢!
2019-10-20
共1条回复

深度学习之神经网络(CNN/RNN/GAN)算法原理+实战

深度学习算法工程师必学,深入理解深度学习核心算法CNN RNN GAN

2617 学习 · 935 问题

查看课程