提交 4c6bccbe 编写于 作者: C chengduoZH

fix doc and remove useless code

上级 154dbb46
...@@ -7,7 +7,7 @@ if(WITH_GPU) ...@@ -7,7 +7,7 @@ if(WITH_GPU)
nv_library(cross_entropy SRCS cross_entropy.cc cross_entropy.cu DEPS operator) nv_library(cross_entropy SRCS cross_entropy.cc cross_entropy.cu DEPS operator)
nv_library(pooling SRCS pooling.cc pooling.cu DEPS device_context) nv_library(pooling SRCS pooling.cc pooling.cu DEPS device_context)
nv_library(vol2col SRCS vol2col.cc vol2col.cu DEPS device_context) nv_library(vol2col SRCS vol2col.cc vol2col.cu DEPS device_context)
nv_library(sequence_project SRCS sequence_project.cc sequence_project.cu DEPS device_context math_function) nv_library(sequence_project SRCS sequence_project.cc sequence_project.cu DEPS device_context)
else() else()
cc_library(math_function SRCS math_function.cc im2col.cc DEPS cblas device_context operator) cc_library(math_function SRCS math_function.cc im2col.cc DEPS cblas device_context operator)
cc_library(selected_rows_functor SRCS selected_rows_functor.cc DEPS selected_rows math_function) cc_library(selected_rows_functor SRCS selected_rows_functor.cc DEPS selected_rows math_function)
...@@ -15,7 +15,7 @@ else() ...@@ -15,7 +15,7 @@ else()
cc_library(cross_entropy SRCS cross_entropy.cc DEPS operator) cc_library(cross_entropy SRCS cross_entropy.cc DEPS operator)
cc_library(pooling SRCS pooling.cc DEPS device_context) cc_library(pooling SRCS pooling.cc DEPS device_context)
cc_library(vol2col SRCS vol2col.cc DEPS device_context) cc_library(vol2col SRCS vol2col.cc DEPS device_context)
cc_library(sequence_project SRCS sequence_project.cc DEPS device_context math_function) cc_library(sequence_project SRCS sequence_project.cc DEPS device_context)
endif() endif()
cc_test(math_function_test SRCS math_function_test.cc DEPS math_function tensor) cc_test(math_function_test SRCS math_function_test.cc DEPS math_function tensor)
......
...@@ -18,7 +18,6 @@ limitations under the License. */ ...@@ -18,7 +18,6 @@ limitations under the License. */
#include "paddle/framework/lod_tensor.h" #include "paddle/framework/lod_tensor.h"
#include "paddle/framework/tensor.h" #include "paddle/framework/tensor.h"
#include "paddle/operators/math/im2col.h" #include "paddle/operators/math/im2col.h"
#include "paddle/operators/math/math_function.h"
namespace paddle { namespace paddle {
namespace operators { namespace operators {
...@@ -32,37 +31,59 @@ template <typename T, int MajorType = Eigen::RowMajor, ...@@ -32,37 +31,59 @@ template <typename T, int MajorType = Eigen::RowMajor,
typename IndexType = Eigen::DenseIndex> typename IndexType = Eigen::DenseIndex>
using EigenMatrix = framework::EigenMatrix<T, MajorType, IndexType>; using EigenMatrix = framework::EigenMatrix<T, MajorType, IndexType>;
/* /*
* \brief Converts the feature data of four dimensions(CDHW) into a colData of * \brief SequenceProject projects features of context_length time-steps of each
* seven dimensions in the Vol2ColFunctor calculation, * instance.
* And in the Col2VolFunctor calculation, it is reversed.
* *
* \param volData Vol data. * \param in Input data.
* \param volShape The shape of volData, * \param inShape The shape of Input data,
* [input_channels, input_depth, input_height, input_width]. * [minibatch, number_of_input_features].
* \param colData Column data. * \param inShape A float LoDTensor.
* \param colShape The shape of colData.
* *
* The shape of colData is: * \param padding_data Padding data.
* [input_channels, filter_depth, filter_height, filter_width, output_depth, * \param inShape The shape of Padding data,
* output_height, output_width] * [up_pad + down_pad, number_of_input_features].
* So, it is easy to reshape into a convolution matrix for convolution * \param inShape A float LoDTensor.
* calculation based on matrix multiplication.
* The shape of convolution matrix is [height, width], where the height is equal
* input_channels * filter_depth * filter_height * filter_width, and the width
* is equal output_depth * output_height * output_width.
* *
* Reshape: * \param col Col data.
* shape of colData shape of convolution matrix * \param inShape The shape of Col data,
* [input_channels, * [minibatch, 1].
* filter_depth, * \param inShape A float LoDTensor.
* filter_height, *
* filter_width, ======> [height, width] * For a mini-batch of 2 variable lengths sentences, containing 3, and 1
* output_depth, * time-steps:
* output_height, *
* output_width] * Assumed input (X) is a [4, M, N] float LoDTensor, and X->lod()[0] = [0, 3,
* 4].
* Besides, for the sake of simplicity, we assume M=1 and N=2.
*
* X = [[a1, a2;
* b1, b2;
* c1, c2]
* [d1, d2]]
*
* This is to say that input (X) has 4 words and the dimension of each word
* representation is 2.
*
* - Case1:
* If context_start is -1 and padding_trainable is false, we use zero to pad
* instead of learned weight to pad,
* and the context_lenth is 3, the output (Out) is:
*
* Out =[[0, 0, a1, a2, b1, b2;
* a1, a2, b1, b2, c1, c2;
* b1, b2, c1, c2, 0, 0 ]
* [0, 0, d1, d2, 0, 0 ]]
*
* - Case2:
* If context_start is -1 and padding_trainable is true, we use learned weight
* to pad,
* and the context_lenth is 3, the output (Out) is:
*
* Out = [[w1, w2, a1, a2, b1, b2;
* a1, a2, b1, b2, c1, c2;
* b1, b2, c1, c2, w3, w4]
* [w1, w2, d1, d2, w3, w4]]
* *
* \note The caller needs to ensure that volShape.inputChannels is equal to
* colShape.inputChannels.
*/ */
template <typename Place, typename T> template <typename Place, typename T>
...@@ -96,14 +117,16 @@ class SequenceProjectFunctor { ...@@ -96,14 +117,16 @@ class SequenceProjectFunctor {
sequence_height = static_cast<int>(out_t.dims()[0]); sequence_height = static_cast<int>(out_t.dims()[0]);
if (input_row_begin < input_row_end) {
framework::Tensor in_t = in->Slice(input_row_begin, input_row_end);
std::vector<int64_t> output_shape( std::vector<int64_t> output_shape(
{sequence_height, 1, 1, context_length, {sequence_height, 1, 1, context_length,
sequence_width}); // output_height, output_width, sequence_width}); // output_height, output_width,
// input_channels, filter_height, filter_width // input_channels, filter_height, filter_width
out_t.Resize(framework::make_ddim(output_shape)); out_t.Resize(framework::make_ddim(output_shape));
if (input_row_begin < input_row_end) {
framework::Tensor in_t = in->Slice(input_row_begin, input_row_end);
std::vector<int64_t> input_shape( std::vector<int64_t> input_shape(
{1, input_row_end - input_row_begin, {1, input_row_end - input_row_begin,
sequence_width}); // input_channels, input_height, input_width sequence_width}); // input_channels, input_height, input_width
......
...@@ -135,39 +135,18 @@ class SequenceConvOpMaker : public framework::OpProtoAndCheckerMaker { ...@@ -135,39 +135,18 @@ class SequenceConvOpMaker : public framework::OpProtoAndCheckerMaker {
.GreaterThan(0); .GreaterThan(0);
AddComment(R"DOC( AddComment(R"DOC(
SequenceConvOp projects features of context_length time-steps of each instance. SequenceConvOp performs convolution operation on features of
context_length time-steps of each instance.
For a mini-batch of 2 variable lengths sentences, containing 3, and 1 time-steps: The convolution operation calculates the output based on the input, filter
and strides, paddings parameters. The size of each dimension of the
Assumed input (X) is a [4, M, N] float LoDTensor, and X->lod()[0] = [0, 3, 4]. parameters is checked in the infer-shape.
Besides, for the sake of simplicity, we assume M=1 and N=2.
Example:
X = [[a1, a2; Input:
b1, b2; X shape: (minibatch, number_of_input_features)
c1, c2] Filter shape: (context_length, number_of_input_features)
[d1, d2]] Output:
Out shape: (minibatch, 1)
This is to say that input (X) has 4 words and the dimension of each word
representation is 2.
- Case1:
If context_start is -1 and padding_trainable is false, we use zero to pad instead of learned weight to pad,
and the context_lenth is 3, the output (Out) is:
Out =[[0, 0, a1, a2, b1, b2;
a1, a2, b1, b2, c1, c2;
b1, b2, c1, c2, 0, 0 ]
[0, 0, d1, d2, 0, 0 ]]
- Case2:
If context_start is -1 and padding_trainable is true, we use learned weight to pad,
and the context_lenth is 3, the output (Out) is:
Out = [[w1, w2, a1, a2, b1, b2;
a1, a2, b1, b2, c1, c2;
b1, b2, c1, c2, w3, w4]
[w1, w2, d1, d2, w3, w4]]
)DOC"); )DOC");
} }
}; };
......
...@@ -182,12 +182,6 @@ class SequenceConvGradKernel : public framework::OpKernel<T> { ...@@ -182,12 +182,6 @@ class SequenceConvGradKernel : public framework::OpKernel<T> {
functor(context.device_context(), padding_data_g, 0); functor(context.device_context(), padding_data_g, 0);
for (int i = 0; i < static_cast<int>(lod_g_level_0.size()) - 1; ++i) { for (int i = 0; i < static_cast<int>(lod_g_level_0.size()) - 1; ++i) {
input_row_begin =
(context_start > 0)
? static_cast<int>(lod_g_level_0[i]) + context_start
: static_cast<int>(lod_g_level_0[i]);
input_row_end = static_cast<int>(lod_g_level_0[i + 1]);
Tensor col_t = col.Slice(static_cast<int>(lod_g_level_0[i]), Tensor col_t = col.Slice(static_cast<int>(lod_g_level_0[i]),
static_cast<int>(lod_g_level_0[i + 1])); static_cast<int>(lod_g_level_0[i + 1]));
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册