这里写自定义目录标题
问题概述
在使用PaddleDetection训练模型修改训练图片输入大小时遇到了如下的错误
ValueError: (InvalidArgument) The 2-th dimension of input[0] and input[1] is expected to be equal.But received input[0]'s shape = [1, 256, 20, 20], input[1]'s shape = [1, 512, 19, 19].
[Hint: Expected inputs_dims[0][j] == inputs_dims[i][j], but received inputs_dims[0][j]:20 != inputs_dims[i][j]:19.] (at …\paddle/fluid/operators/concat_op.h:63)
[operator < concat > error]
大致意思时输入的参数与预期不符等等(我还没有完全搞清楚)。
起因:修改config文件
首先来看一下在发生这个错误前我对yolov3_reader.yml做的修改:
我将batch_transforms中初始的- BatchRandomResize: {target_size: [320, 352, 384, 416, 448, 480, 512, 544, 576, 608], random_size: True, random_interp: True, keep_ratio: False}
修改为- BatchRandomResize: {target_size: [160, 176, 192, 208, 224, 240, 256, 272, 288, 304], random_size: True, random_interp: True, keep_ratio: False},本意是Resize训练输入图片,让模型变小一些,然后就出现了上述报错。
排查原因
首先根据报错的字面意思,我怀疑问题与输入图片的shape有关。
由于默认是开启了random_size的,因此每次读一个batch的训练图片时会将图片Resize成target_size列表中随机的一个大小,我推测报错的原因与target_size有关。我尝试将列表中的其它数值删除,只留下256、320等单个数值,发现个别数值可用。反复测试后发现32的整数倍的size均可用,例如target_size: [288, 320, 352]。
解决方案
可以通过修改BatchRandomResize中的target_size来达到修改输入图片size的目的,但注意size要是32的倍数,即可避免该报错。同样的,如果对它进行了修改,那么在下面的EvalReader和TestReader中也要对target_size做相应的修改,否则在评估阶段也会出现同样的报错。
一点思考
实际上我们可以看到,在初始的BatchRandomResize中,给出的target_size实际上都是32的倍数,所以理论上导致该报错的原因应该是PaddleDetection框架中做的限制,这一点在源码中应该有体现,欢迎讨论!