Open2

onnx.onnx_cpp2py_export.shape_inference.InferenceError: [ShapeInferenceError] (op_type:ReduceMax,

PINTOPINTO

Pattern 1

onnx.onnx_cpp2py_export.shape_inference.InferenceError: [ShapeInferenceError] (op_type:ReduceMax, node name: ReduceMax_4449): [ShapeInferenceError] Inferred shape and existing shape differ in rank: (4) vs (0)

Pattern 2

onnx.onnx_cpp2py_export.shape_inference.InferenceError: [ShapeInferenceError] (op_type:ReduceMean, node name: ReduceMean_4444): [ShapeInferenceError] Inferred shape and existing shape differ in rank: (4) vs (0)

Pattern 3

onnx.onnx_cpp2py_export.shape_inference.InferenceError: [ShapeInferenceError] (op_type:ReduceMin, node name: ReduceMin_4445): [ShapeInferenceError] Inferred shape and existing shape differ in rank: (4) vs (0)

PINTOPINTO

keepdim=True を使用せずに maxminmean を使用していてさらに unsqueeze を実施して次元を足すような無駄なモデル構造になっている場合に発生するエラー。したがって、unsqueeze を削除し、keepdim=True を指定するだけで回避可能。何故PyTorchが型推定に失敗するのかは謎。

class ChannelPool(nn.Module):
    def forward(self, x):
        # return torch.cat( (torch.max(x,1)[0].unsqueeze(1), torch.mean(x,1).unsqueeze(1)), dim=1 )
        return torch.cat( (torch.max(x,dim=1,keepdim=True)[0], torch.mean(x,dim=1,keepdim=True)), dim=1 )