|  | #include "caffe2/sgd/clip_tensor_op.h" | 
|  |  | 
|  | namespace caffe2 { | 
|  |  | 
|  | REGISTER_CPU_OPERATOR(ClipTensorByScaling, ClipTensorByScalingOp<CPUContext>); | 
|  | OPERATOR_SCHEMA(ClipTensorByScaling) | 
|  | .NumInputs(2, 3) | 
|  | .NumOutputs(1) | 
|  | .AllowInplace({{0, 0}}) | 
|  | .SetDoc(R"DOC( | 
|  | Clips the input tensor by scaling based on the input value and the threshold. | 
|  | The value is usually the (pre-computed) norm of the tensor. If the value is | 
|  | larger than the threshold, scaling would be performed in this way: | 
|  |  | 
|  | tensor *= (threshold / value). | 
|  |  | 
|  | An optional input called additional_threshold can be provided which | 
|  | will scale the original threshold before it is used. That is, | 
|  | the final threshold will become threshold * additional_threshold. | 
|  | This op could be used for gradient clipping. | 
|  | )DOC") | 
|  | .Input(0, "input_tensor", "Tensor of floats to be clipped.") | 
|  | .Input(1, "val", "Value to be compared against the threshold") | 
|  | .Input( | 
|  | 2, | 
|  | "additional_threshold", | 
|  | "An optional additional threshold to scale the original threshold") | 
|  | .Arg("threshold", "Threshold to determine whether to scale down the tensor") | 
|  | .Output( | 
|  | 0, | 
|  | "clipped", | 
|  | "Tensor of floats, which is the same size as the input tensor, " | 
|  | "representing the clipped tensor."); | 
|  |  | 
|  | SHOULD_NOT_DO_GRADIENT(ClipTensorByScaling); | 
|  | }; // namespace caffe2 |