PaddleClas的配置说明中说可以通过to_static
进行自动动态图转静态图,打开该开关的时候却发生了如下错误
File "model.py", line 174, in forwardx = getattr(self, name)(x)print(x.shape)x = F.adaptive_avg_pool2d(x, (1, 1)).reshape((x.shape[0], -1))~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ <--- HEREx = self.classifier(x)return x
打印出x
的shape才发现
(-1, 1024, 7, 7)
原来,PaddlePaddle
在编译静态图中,需要使用一个伪数据来获得网络的输入输出形状(类似于TensorFlow 1.x
中的InputSpec
,或者MATLAB Coder
中的输入矩阵)。而PaddleClas
套件生成的伪数据第一维(batch维)为?1-1?1,这就造成了reshape
被输入了两个?1-1?1。
解决方案:使用x.flatten(1)
代替x.reshape(x.shape[0], -1)
。
思考:如果我要使用的是x.reshape(x.shape[0], x.shape[1], -1)
,就不能简单用flatten
函数了,这种情况我除了手动计算输出张量的大小实在没想出好办法。
幸好保存了在MobaXTerm中设置保存了Session Log,得以找到详细的报错信息。