1 #include "caffe2/operators/normalize_op.h" 3 #include "caffe2/core/tensor.h" 7 template <
typename T,
class Context>
8 void NormalizeOp<T, Context>::DoNormalize(
14 using InnerStride = Eigen::InnerStride<Eigen::Dynamic>;
16 Eigen::Map<Eigen::Matrix<T, 1, Eigen::Dynamic>, 0, InnerStride>;
17 using ConstStridedVec =
18 Eigen::Map<const Eigen::Matrix<T, 1, Eigen::Dynamic>, 0, InnerStride>;
20 for (
int i = 0; i < n; ++i) {
21 auto base = (i / sf) * sf * m + (i % sf);
22 ConstStridedVec xVec(xData + base, 1, m, InnerStride(sf));
23 auto norm = xVec.template lpNorm<2>();
25 StridedVec yVec(yData + base, 1, m, InnerStride(sf));
31 template <
typename T,
class Context>
32 void NormalizeGradientOp<T, Context>::DoNormalize(
39 using InnerStride = Eigen::InnerStride<Eigen::Dynamic>;
41 Eigen::Map<Eigen::Matrix<T, 1, Eigen::Dynamic>, 0, InnerStride>;
42 using ConstStridedVec =
43 Eigen::Map<const Eigen::Matrix<T, 1, Eigen::Dynamic>, 0, InnerStride>;
45 for (
int i = 0; i < n; ++i) {
46 auto base = (i / sf) * sf * m + (i % sf);
47 ConstStridedVec xVec(xData + base, 1, m, InnerStride(sf));
48 ConstStridedVec gOutVec(gOutData + base, 1, m, InnerStride(sf));
50 auto row_sum = xVec.dot(gOutVec);
51 auto row_norm = xVec.template lpNorm<2>();
52 auto row_norm_3 = pow(row_norm, 3);
54 StridedVec gInVec(gInData + base, 1, m, InnerStride(sf));
55 gInVec = (gOutVec / row_norm) - ((xVec / row_norm_3) * row_sum);
60 REGISTER_CPU_OPERATOR(Normalize, NormalizeOp<float, CPUContext>);
61 OPERATOR_SCHEMA(Normalize)
64 .Arg(
"axis",
"axis to normalize")
66 Given a matrix, apply L2-normalization along the specified dimension. 68 .IdenticalTypeAndShape(); 70 REGISTER_CPU_OPERATOR( 72 NormalizeGradientOp<float, CPUContext>); 73 OPERATOR_SCHEMA(NormalizeGradient) 76 .Arg("axis",
"axis to normalize");
79 using GradientMakerBase::GradientMakerBase;
80 vector<OperatorDef> GetGradientDefs()
override {
81 CAFFE_ENFORCE_EQ(def_.input_size(), 1);
85 vector<string>{I(0), GO(0)},
86 vector<string>{GI(0)});
A global dictionary that holds information about what Caffe2 modules have been loaded in the current ...
static vector< OperatorDef > SingleGradientDef(const Args &...args)
a helper function to allow one to create one single operator def, which is usually the case for many ...