Implement manip gradient in cc.
This commit is contained in:
parent
b9b739285e
commit
3744d26060
@ -156,6 +156,7 @@ cc_library(
|
||||
":array_grad",
|
||||
":data_flow_grad",
|
||||
":image_grad",
|
||||
":manip_grad",
|
||||
":math_grad",
|
||||
":nn_grad",
|
||||
],
|
||||
@ -494,6 +495,32 @@ tf_cc_test(
|
||||
],
|
||||
)
|
||||
|
||||
cc_library(
|
||||
name = "manip_grad",
|
||||
srcs = ["gradients/manip_grad.cc"],
|
||||
deps = [
|
||||
":cc_ops",
|
||||
":grad_op_registry",
|
||||
":gradients",
|
||||
],
|
||||
alwayslink = 1,
|
||||
)
|
||||
|
||||
tf_cc_test(
|
||||
name = "gradients_manip_grad_test",
|
||||
srcs = ["gradients/manip_grad_test.cc"],
|
||||
deps = [
|
||||
":array_ops",
|
||||
":cc_ops",
|
||||
":gradient_checker",
|
||||
":manip_grad",
|
||||
":testutil",
|
||||
"//tensorflow/core:test",
|
||||
"//tensorflow/core:test_main",
|
||||
"//tensorflow/core:testlib",
|
||||
],
|
||||
)
|
||||
|
||||
# Generates separate libraries for array_ops and math_ops to reduce the dependency count of targets that depend on only these
|
||||
tf_gen_op_wrappers_cc(
|
||||
name = "math_ops",
|
||||
|
40
tensorflow/cc/gradients/manip_grad.cc
Normal file
40
tensorflow/cc/gradients/manip_grad.cc
Normal file
@ -0,0 +1,40 @@
|
||||
/* Copyright 2020 The TensorFlow Authors. All Rights Reserved.
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
==============================================================================*/
|
||||
|
||||
#include "tensorflow/cc/framework/grad_op_registry.h"
|
||||
#include "tensorflow/cc/framework/gradients.h"
|
||||
#include "tensorflow/cc/ops/manip_ops.h"
|
||||
#include "tensorflow/cc/ops/standard_ops.h"
|
||||
|
||||
namespace tensorflow {
|
||||
namespace ops {
|
||||
namespace {
|
||||
|
||||
Status RollGrad(const Scope& scope, const Operation& op,
|
||||
const std::vector<Output>& grad_inputs,
|
||||
std::vector<Output>* grad_outputs) {
|
||||
auto shift = op.input(1);
|
||||
auto axis = op.input(2);
|
||||
auto grad_op = Roll(scope, grad_inputs[0], Neg(scope, shift), axis);
|
||||
grad_outputs->push_back(grad_op);
|
||||
grad_outputs->push_back(NoGradient());
|
||||
grad_outputs->push_back(NoGradient());
|
||||
return scope.status();
|
||||
}
|
||||
REGISTER_GRADIENT_OP("Roll", RollGrad);
|
||||
|
||||
} // namespace
|
||||
} // namespace ops
|
||||
} // namespace tensorflow
|
51
tensorflow/cc/gradients/manip_grad_test.cc
Normal file
51
tensorflow/cc/gradients/manip_grad_test.cc
Normal file
@ -0,0 +1,51 @@
|
||||
/* Copyright 2020 The TensorFlow Authors. All Rights Reserved.
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
==============================================================================*/
|
||||
|
||||
#include "tensorflow/cc/framework/gradient_checker.h"
|
||||
#include "tensorflow/cc/ops/array_ops.h"
|
||||
#include "tensorflow/cc/ops/manip_ops.h"
|
||||
#include "tensorflow/core/lib/core/status_test_util.h"
|
||||
|
||||
namespace tensorflow {
|
||||
namespace {
|
||||
|
||||
using ops::Placeholder;
|
||||
using ops::Roll;
|
||||
|
||||
class ManipGradTest : public ::testing::Test {
|
||||
protected:
|
||||
ManipGradTest() : scope_(Scope::NewRootScope()) {}
|
||||
|
||||
void RunTest(const Output& x, const TensorShape& x_shape, const Output& y,
|
||||
const TensorShape& y_shape) {
|
||||
TF_ASSERT_OK(scope_.status());
|
||||
float max_error;
|
||||
TF_ASSERT_OK((ComputeGradientError<float, float, float>(
|
||||
scope_, {x}, {x_shape}, {y}, {y_shape}, &max_error)));
|
||||
EXPECT_LT(max_error, 1e-4);
|
||||
}
|
||||
|
||||
Scope scope_;
|
||||
};
|
||||
|
||||
TEST_F(ManipGradTest, RollGrad) {
|
||||
TensorShape shape({5, 4, 3});
|
||||
auto x = Placeholder(scope_, DT_FLOAT, Placeholder::Shape(shape));
|
||||
auto y = Roll(scope_, x, {2, 1}, {0, 1});
|
||||
RunTest(x, shape, y, shape);
|
||||
}
|
||||
|
||||
} // namespace
|
||||
} // namespace tensorflow
|
Loading…
Reference in New Issue
Block a user