| #include "caffe2/operators/minmax_ops.h" |
| |
| namespace caffe2 { |
| |
| REGISTER_CPU_OPERATOR(Min, MinOp<float, CPUContext>); |
| REGISTER_CPU_OPERATOR(Max, MaxOp<float, CPUContext>); |
| |
| OPERATOR_SCHEMA(Max) |
| .NumInputs(1, INT_MAX) |
| .NumOutputs(1) |
| .IdenticalTypeAndShapeOfInput(0) |
| .AllowInplace({{0, 0}}) |
| .SetDoc(R"DOC( |
| Element-wise max of an arbitrary number of input tensors. This operation can be |
| performed in-place, by using the first input blob as the output blob. All inputs |
| must have the same shape and data type, and the output will have the same shape |
| as the inputs. |
| |
| Github Link: |
| - https://github.com/pytorch/pytorch/blob/master/caffe2/operators/minmax_ops.cc |
| |
| <details> |
| |
| <summary> <b>Example</b> </summary> |
| |
| **Code** |
| |
| ``` |
| |
| workspace.ResetWorkspace() |
| |
| op = core.CreateOperator( |
| "Max", |
| ["X", "Y", "Z"], |
| ["X"], |
| ) |
| |
| workspace.FeedBlob("X", (np.random.rand(3,3)).astype(np.float32)) |
| workspace.FeedBlob("Y", (np.random.rand(3,3)).astype(np.float32)) |
| workspace.FeedBlob("Z", (np.random.rand(3,3)).astype(np.float32)) |
| print("X:", workspace.FetchBlob("X")) |
| print("Y:", workspace.FetchBlob("Y")) |
| print("Z:", workspace.FetchBlob("Z")) |
| workspace.RunOperatorOnce(op) |
| print("Max:", workspace.FetchBlob("X")) |
| |
| ``` |
| |
| **Result** |
| |
| ``` |
| |
| X: |
| [[0.4496477 0.07061381 0.7139333 ] |
| [0.83203 0.05970785 0.72786295] |
| [0.75988126 0.04601283 0.32820013]] |
| Y: |
| [[0.05683139 0.16872478 0.671098 ] |
| [0.70739156 0.09878621 0.03416285] |
| [0.34087983 0.94986707 0.67263436]] |
| Z: |
| [[0.48051122 0.07141234 0.85264146] |
| [0.77086854 0.22082241 0.13154659] |
| [0.42401117 0.995431 0.4263775 ]] |
| Max: |
| [[0.48051122 0.16872478 0.85264146] |
| [0.83203 0.22082241 0.72786295] |
| [0.75988126 0.995431 0.67263436]] |
| |
| ``` |
| |
| </details> |
| |
| )DOC") |
| .Input( |
| 0, |
| "X, Y, ...", |
| "*(type: Tensor`<Ord>`)* List of input tensors with the same shape.") |
| .Output( |
| 0, |
| "M", |
| "*(type: Tensor`<Ord>`)* Output tensor with same dimensions as input(s)." |
| "Contains the maximum valued element at each location.") |
| .InheritOnnxSchema(); |
| |
| OPERATOR_SCHEMA(Min) |
| .NumInputs(1, INT_MAX) |
| .NumOutputs(1) |
| .IdenticalTypeAndShapeOfInput(0) |
| .AllowInplace({{0, 0}}) |
| .SetDoc(R"DOC( |
| Element-wise min of an arbitrary number of input tensors. This operation can be performed in-place, by using the first input blob as the output blob. All inputs must have the same shape and data type, and the output will have the same shape as the inputs. |
| |
| Github Link: |
| - https://github.com/pytorch/pytorch/blob/master/caffe2/operators/minmax_ops.cc |
| |
| <details> |
| |
| <summary> <b>Example</b> </summary> |
| |
| **Code** |
| |
| ``` |
| |
| workspace.ResetWorkspace() |
| |
| op = core.CreateOperator( |
| "Min", |
| ["X", "Y", "Z"], |
| ["X"], |
| ) |
| |
| workspace.FeedBlob("X", (np.random.rand(2,2)).astype(np.float32)) |
| workspace.FeedBlob("Y", (np.random.rand(2,2)).astype(np.float32)) |
| workspace.FeedBlob("Z", (np.random.rand(2,2)).astype(np.float32)) |
| print("X:", workspace.FetchBlob("X")) |
| print("Y:", workspace.FetchBlob("Y")) |
| print("Z:", workspace.FetchBlob("Z")) |
| workspace.RunOperatorOnce(op) |
| print("Min:", workspace.FetchBlob("X")) |
| |
| ``` |
| |
| **Result** |
| |
| ``` |
| |
| X: |
| [[0.32731926 0.4939747 ] |
| [0.29242373 0.43460014]] |
| Y: |
| [[0.40928316 0.916115 ] |
| [0.77526504 0.29339448]] |
| Z: |
| [[0.7899794 0.90335774] |
| [0.82599413 0.2843068 ]] |
| Min: |
| [[0.32731926 0.4939747 ] |
| [0.29242373 0.2843068 ]] |
| |
| ``` |
| |
| </details> |
| |
| )DOC") |
| .Input( |
| 0, |
| "X, Y, ...", |
| "*(type: Tensor`<Ord>`)* List of input tensors with the same shape.") |
| .Output( |
| 0, |
| "M", |
| "*(type: Tensor`<Ord>`)* Output tensor with same dimensions as input(s)." |
| "Contains the minimum valued element at each location.") |
| .InheritOnnxSchema(); |
| |
| } // namespace caffe2 |