onnx.onnx_cpp2py_export.shape_inference.InferenceError: [ShapeInferenceError] (op_type:ReduceMax,
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)
keepdim=True
を使用せずに max
や min
、mean
を使用していてさらに 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 )