Merge pull request #2945 from reyoung/feature/grouped_ops
Skeleton Of fully connected operatorcblas_new
commit
e8304bd92a
@ -0,0 +1,76 @@
|
||||
/* Copyright (c) 2016 PaddlePaddle Authors. All Rights Reserve.
|
||||
|
||||
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 "paddle/framework/net.h"
|
||||
#include "paddle/framework/op_registry.h"
|
||||
#include "paddle/framework/operator.h"
|
||||
|
||||
namespace paddle {
|
||||
namespace operators {
|
||||
|
||||
class FullyConnectedOp : public framework::PlainNet {
|
||||
public:
|
||||
void Init() override {
|
||||
AddOp(framework::OpRegistry::CreateOp("mul",
|
||||
{
|
||||
Input("X"), Input("W"),
|
||||
},
|
||||
{Output("before_act")},
|
||||
{}));
|
||||
auto b = Input("b");
|
||||
if (b != framework::OperatorBase::EMPTY_VAR_NAME()) {
|
||||
AddOp(framework::OpRegistry::CreateOp("rowwise_add",
|
||||
{Output("before_act"), Input("b")},
|
||||
{Output("before_act")},
|
||||
{}));
|
||||
}
|
||||
|
||||
auto activation = GetAttr<std::string>("activation");
|
||||
AddOp(framework::OpRegistry::CreateOp(
|
||||
activation, {Output("before_act")}, {Output("Y")}, {}));
|
||||
CompleteAddOp(false);
|
||||
}
|
||||
};
|
||||
|
||||
class FullyConnectedOpMaker : public framework::OpProtoAndCheckerMaker {
|
||||
public:
|
||||
FullyConnectedOpMaker(framework::OpProto *proto,
|
||||
framework::OpAttrChecker *op_checker)
|
||||
: OpProtoAndCheckerMaker(proto, op_checker) {
|
||||
AddInput("X", "the input of fc operator");
|
||||
AddInput("W", "the weight of fc operator");
|
||||
AddInput("b", "the bias of fc operator");
|
||||
|
||||
AddOutput("Y", "the output of fc operator");
|
||||
AddOutput(
|
||||
"before_act", "the before activation output of fc operator", true);
|
||||
AddAttr<std::string>("activation", "The activation key for fc layer")
|
||||
.SetDefault("sigmoid")
|
||||
.InEnum({"sigmoid", "softmax"});
|
||||
|
||||
//! TODO(yuyang18): Complete comment;
|
||||
AddComment("FullyConnected Operator");
|
||||
}
|
||||
};
|
||||
} // namespace operators
|
||||
} // namespace paddle
|
||||
|
||||
USE_OP(mul);
|
||||
USE_OP(rowwise_add);
|
||||
USE_OP(sigmoid);
|
||||
USE_OP(softmax);
|
||||
|
||||
REGISTER_OP(fc,
|
||||
paddle::operators::FullyConnectedOp,
|
||||
paddle::operators::FullyConnectedOpMaker);
|
@ -1,2 +1,2 @@
|
||||
cc_library(paddle_pybind SHARED SRCS pybind.cc DEPS pybind python
|
||||
add_op mul_op rowwise_add_op sigmoid_op softmax_op)
|
||||
add_op fc_op)
|
||||
|
@ -1,3 +1,3 @@
|
||||
add_python_test(test_framework test_protobuf.py test_scope.py
|
||||
test_default_scope_funcs.py test_op_creation_methods.py
|
||||
test_tensor.py)
|
||||
test_tensor.py test_fc_op.py)
|
||||
|
@ -0,0 +1,43 @@
|
||||
import paddle.v2.framework.core as core
|
||||
import unittest
|
||||
import numpy
|
||||
import paddle.v2.framework.create_op_creation_methods as creation
|
||||
|
||||
|
||||
class TestFc(unittest.TestCase):
|
||||
def test_fc(self):
|
||||
scope = core.Scope(None)
|
||||
x = scope.create_var("X")
|
||||
x_tensor = x.get_tensor()
|
||||
x_tensor.set_dims([1000, 784])
|
||||
x_tensor.alloc_float()
|
||||
|
||||
w = scope.create_var("W")
|
||||
w_tensor = w.get_tensor()
|
||||
w_tensor.set_dims([784, 100])
|
||||
w_tensor.alloc_float()
|
||||
|
||||
w_tensor.set(numpy.random.random((784, 100)).astype("float32"))
|
||||
|
||||
# Set a real numpy array here.
|
||||
# x_tensor.set(numpy.array([]))
|
||||
|
||||
op = creation.op_creations.fc(X="X", Y="Y", W="W")
|
||||
|
||||
for out in op.outputs():
|
||||
if scope.get_var(out) is None:
|
||||
scope.create_var(out).get_tensor()
|
||||
|
||||
tensor = scope.get_var("Y").get_tensor()
|
||||
op.infer_shape(scope)
|
||||
self.assertEqual([1000, 100], tensor.shape())
|
||||
|
||||
ctx = core.DeviceContext.cpu_context()
|
||||
|
||||
op.run(scope, ctx)
|
||||
|
||||
# After complete all ops, check Y is expect or not.
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main()
|
Loading…
Reference in new issue