提交 fe2ab2ee 编写于 作者: L Liu Yiqun

Set the default value of xNumColDims and rename the output to "Out" in FCOp.

上级 0b21b854
...@@ -41,10 +41,19 @@ class FCOp : public NetOp { ...@@ -41,10 +41,19 @@ class FCOp : public NetOp {
"The size of inputs X(%d) should be no less than 1.", n); "The size of inputs X(%d) should be no less than 1.", n);
auto x_num_col_dims = Attr<std::vector<int>>("xNumColDims"); auto x_num_col_dims = Attr<std::vector<int>>("xNumColDims");
PADDLE_ENFORCE_EQ(x_num_col_dims.size(), n,
"The size of attribute xNumColDims(%d) should be the " // Set all values or set no values (use the default value)
"same as that of inputs X(%d).", if (!x_num_col_dims.empty()) {
x_num_col_dims.size(), n); PADDLE_ENFORCE_EQ(x_num_col_dims.size(), n,
"The size of attribute xNumColDims(%d) should be the "
"same as that of inputs X(%d).",
x_num_col_dims.size(), n);
} else {
x_num_col_dims.resize(n);
for (size_t i = 0; i < n; i++) {
x_num_col_dims[i] = 1;
}
}
// mul_out[i] = X[i] * W[i] // mul_out[i] = X[i] * W[i]
for (size_t i = 0; i < n; i++) { for (size_t i = 0; i < n; i++) {
...@@ -81,7 +90,7 @@ class FCOp : public NetOp { ...@@ -81,7 +90,7 @@ class FCOp : public NetOp {
auto activation = Attr<std::string>("activation"); auto activation = Attr<std::string>("activation");
AppendOp(framework::OpRegistry::CreateOp( AppendOp(framework::OpRegistry::CreateOp(
activation, {{"X", {Output(add_out)}}}, {{"Y", {Output("Y")}}}, {})); activation, {{"X", {Output(add_out)}}}, {{"Y", {Output("Out")}}}, {}));
CompleteAddOp(false); CompleteAddOp(false);
} }
}; };
...@@ -105,7 +114,7 @@ class FCOpMaker : public framework::OpProtoAndCheckerMaker { ...@@ -105,7 +114,7 @@ class FCOpMaker : public framework::OpProtoAndCheckerMaker {
"(Tensor) the bias of FC operator, a 1-D vector of size " "(Tensor) the bias of FC operator, a 1-D vector of size "
"number_of_neurons."); "number_of_neurons.");
AddOutput("Y", AddOutput("Out",
"(Tensor) the activated output matrix of FC operator, a 2-D " "(Tensor) the activated output matrix of FC operator, a 2-D "
"matrix of size (minibatch, number_of_neurons)."); "matrix of size (minibatch, number_of_neurons).");
AddOutput("MulOut", AddOutput("MulOut",
...@@ -137,7 +146,8 @@ class FCOpMaker : public framework::OpProtoAndCheckerMaker { ...@@ -137,7 +146,8 @@ class FCOpMaker : public framework::OpProtoAndCheckerMaker {
"`X_i.dims[0] x ... x X_i.dims[xNumColDims_i - 1]`. " "`X_i.dims[0] x ... x X_i.dims[xNumColDims_i - 1]`. "
"The matrix's second dimension (the length of row) will be the product " "The matrix's second dimension (the length of row) will be the product "
"of `X_i`'s first `rank - xNumColDims_i` dimensions, that is " "of `X_i`'s first `rank - xNumColDims_i` dimensions, that is "
"`X_i.dims[xNumColDims_i] x ... x X_i.dims[rank - 1]`)"); "`X_i.dims[xNumColDims_i] x ... x X_i.dims[rank - 1]`)")
.SetDefault(std::vector<int>{});
AddComment(R"DOC( AddComment(R"DOC(
Fully Connected Operator, known as Fully Connected Layer or Inner Product Layer Fully Connected Operator, known as Fully Connected Layer or Inner Product Layer
...@@ -148,13 +158,13 @@ learned weights with a matrix multiplication followed by a bias offset ...@@ -148,13 +158,13 @@ learned weights with a matrix multiplication followed by a bias offset
(optionally). (optionally).
Equation: Equation:
Y = Act(sum_n{X_i * W_i} + B) Out = Act(sum_n{X_i * W_i} + B)
where X_i is Tensor that will be reshaped to a 2-D matrix of size (M x K), where X_i is Tensor that will be reshaped to a 2-D matrix of size (M x K),
usually M is the minibatch size and K is the number of input features. usually M is the minibatch size and K is the number of input features.
W_i is a 2-D matrix of size (K x N), where N means the number of neurons W_i is a 2-D matrix of size (K x N), where N means the number of neurons
in the fully connected layer. B is a 1-D vector of size N. in the fully connected layer. B is a 1-D vector of size N.
Thus, the output Y is a 2-D matrix of size (M x N). Thus, the output Out is a 2-D matrix of size (M x N).
Activation type can be set to `identity` (default), `sigmoid` or `softmax`. Activation type can be set to `identity` (default), `sigmoid` or `softmax`.
)DOC"); )DOC");
} }
......
...@@ -20,15 +20,14 @@ class TestFCOp1(OpTest): ...@@ -20,15 +20,14 @@ class TestFCOp1(OpTest):
"MulOut": [("MulOut0", mul_out0)], "MulOut": [("MulOut0", mul_out0)],
"SumOut": sum_out, "SumOut": sum_out,
"AddOut": add_out, "AddOut": add_out,
"Y": identity_out "Out": identity_out
} }
self.attrs = {"xNumColDims": [1]}
def test_check_output(self): def test_check_output(self):
self.check_output() self.check_output()
def test_check_grad(self): def test_check_grad(self):
self.check_grad(["X0", "W0", "B"], "Y", max_relative_error=0.01) self.check_grad(["X0", "W0", "B"], "Out", max_relative_error=0.01)
class TestFCOp2(OpTest): class TestFCOp2(OpTest):
...@@ -56,7 +55,7 @@ class TestFCOp2(OpTest): ...@@ -56,7 +55,7 @@ class TestFCOp2(OpTest):
"MulOut": [("MulOut0", mul_out0), ("MulOut1", mul_out1)], "MulOut": [("MulOut0", mul_out0), ("MulOut1", mul_out1)],
"SumOut": sum_out, "SumOut": sum_out,
"AddOut": add_out, "AddOut": add_out,
"Y": sigmoid_out "Out": sigmoid_out
} }
def test_check_output(self): def test_check_output(self):
...@@ -64,7 +63,7 @@ class TestFCOp2(OpTest): ...@@ -64,7 +63,7 @@ class TestFCOp2(OpTest):
def test_check_grad(self): def test_check_grad(self):
self.check_grad( self.check_grad(
["X0", "X1", "W0", "W1", "B"], "Y", max_relative_error=0.01) ["X0", "X1", "W0", "W1", "B"], "Out", max_relative_error=0.01)
if __name__ == '__main__': if __name__ == '__main__':
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册