|
|
|
@ -88,9 +88,10 @@ template <typename Place, typename T>
|
|
|
|
|
class ContextProjectFunctor {
|
|
|
|
|
public:
|
|
|
|
|
void operator()(const platform::DeviceContext& context, const LoDTensor& in,
|
|
|
|
|
const Tensor& padding_data, Tensor& col,
|
|
|
|
|
bool padding_trainable, int context_start, int context_length,
|
|
|
|
|
int context_stride, int up_pad, int down_pad) {
|
|
|
|
|
const Tensor& padding_data, bool padding_trainable,
|
|
|
|
|
const int context_start, const int context_length,
|
|
|
|
|
const int context_stride, const int up_pad,
|
|
|
|
|
const int down_pad, Tensor* col) {
|
|
|
|
|
auto lod_level_0 = in.lod()[0];
|
|
|
|
|
|
|
|
|
|
math::Im2ColFunctor<math::ColFormat::kOCF, Place, float> im2col_ocf;
|
|
|
|
@ -109,8 +110,8 @@ class ContextProjectFunctor {
|
|
|
|
|
: static_cast<int>(lod_level_0[i]);
|
|
|
|
|
input_row_end = static_cast<int>(lod_level_0[i + 1]);
|
|
|
|
|
|
|
|
|
|
Tensor out_t = col.Slice(static_cast<int>(lod_level_0[i]),
|
|
|
|
|
static_cast<int>(lod_level_0[i + 1]));
|
|
|
|
|
Tensor out_t = col->Slice(static_cast<int>(lod_level_0[i]),
|
|
|
|
|
static_cast<int>(lod_level_0[i + 1]));
|
|
|
|
|
|
|
|
|
|
sequence_height = static_cast<int>(out_t.dims()[0]);
|
|
|
|
|
|
|
|
|
@ -133,8 +134,8 @@ class ContextProjectFunctor {
|
|
|
|
|
}
|
|
|
|
|
if (padding_trainable) {
|
|
|
|
|
for (int i = 0; i < static_cast<int>(lod_level_0.size()) - 1; ++i) {
|
|
|
|
|
Tensor out_t = col.Slice(static_cast<int>(lod_level_0[i]),
|
|
|
|
|
static_cast<int>(lod_level_0[i + 1]));
|
|
|
|
|
Tensor out_t = col->Slice(static_cast<int>(lod_level_0[i]),
|
|
|
|
|
static_cast<int>(lod_level_0[i + 1]));
|
|
|
|
|
|
|
|
|
|
sequence_height = static_cast<int>(out_t.dims()[0]);
|
|
|
|
|
|
|
|
|
@ -197,10 +198,11 @@ class ContextProjectFunctor {
|
|
|
|
|
template <typename Place, typename T>
|
|
|
|
|
class ContextProjectGradFunctor {
|
|
|
|
|
public:
|
|
|
|
|
void operator()(const platform::DeviceContext& context, LoDTensor& in,
|
|
|
|
|
Tensor& padding_data, Tensor& col, bool padding_trainable,
|
|
|
|
|
int context_start, int context_length, int context_stride,
|
|
|
|
|
int up_pad, int down_pad, bool input_grad, bool pad_grad) {
|
|
|
|
|
void operator()(const platform::DeviceContext& context, const LoDTensor& in,
|
|
|
|
|
bool padding_trainable, const int context_start,
|
|
|
|
|
const int context_length, const int context_stride,
|
|
|
|
|
const int up_pad, const int down_pad, bool pad_grad,
|
|
|
|
|
bool input_grad, Tensor* padding_data, Tensor* col) {
|
|
|
|
|
auto lod_level_0 = in.lod()[0];
|
|
|
|
|
|
|
|
|
|
math::Col2ImFunctor<math::ColFormat::kOCF, Place, float> col2im_ocf;
|
|
|
|
@ -220,8 +222,8 @@ class ContextProjectGradFunctor {
|
|
|
|
|
: static_cast<int>(lod_level_0[i]);
|
|
|
|
|
input_row_end = static_cast<int>(lod_level_0[i + 1]);
|
|
|
|
|
|
|
|
|
|
Tensor out_t = col.Slice(static_cast<int>(lod_level_0[i]),
|
|
|
|
|
static_cast<int>(lod_level_0[i + 1]));
|
|
|
|
|
Tensor out_t = col->Slice(static_cast<int>(lod_level_0[i]),
|
|
|
|
|
static_cast<int>(lod_level_0[i + 1]));
|
|
|
|
|
|
|
|
|
|
sequence_height = static_cast<int>(out_t.dims()[0]);
|
|
|
|
|
|
|
|
|
@ -247,8 +249,8 @@ class ContextProjectGradFunctor {
|
|
|
|
|
if (pad_grad) {
|
|
|
|
|
if (padding_trainable) {
|
|
|
|
|
for (int i = 0; i < static_cast<int>(lod_level_0.size()) - 1; ++i) {
|
|
|
|
|
Tensor out_t = col.Slice(static_cast<int>(lod_level_0[i]),
|
|
|
|
|
static_cast<int>(lod_level_0[i + 1]));
|
|
|
|
|
Tensor out_t = col->Slice(static_cast<int>(lod_level_0[i]),
|
|
|
|
|
static_cast<int>(lod_level_0[i + 1]));
|
|
|
|
|
|
|
|
|
|
sequence_height = static_cast<int>(out_t.dims()[0]);
|
|
|
|
|
out_t.Resize({sequence_height * context_length, sequence_width});
|
|
|
|
@ -262,7 +264,7 @@ class ContextProjectGradFunctor {
|
|
|
|
|
k + context_length < up_pad ? context_length : up_pad - k;
|
|
|
|
|
Tensor out_t_sub = out_t.Slice(k * context_length,
|
|
|
|
|
k * context_length + padding_size);
|
|
|
|
|
Tensor w_sub = padding_data.Slice(k, k + padding_size);
|
|
|
|
|
Tensor w_sub = padding_data->Slice(k, k + padding_size);
|
|
|
|
|
auto out_t_sub_e = EigenMatrix<T>::From(out_t_sub);
|
|
|
|
|
auto w_sub_e = EigenMatrix<T>::From(w_sub);
|
|
|
|
|
w_sub_e.device(*context.GetEigenDevice<Place>()) =
|
|
|
|
@ -295,7 +297,7 @@ class ContextProjectGradFunctor {
|
|
|
|
|
Tensor out_t_sub = out_t.Slice(
|
|
|
|
|
(down_pad_begin_row + t) * context_length - padding_size,
|
|
|
|
|
(down_pad_begin_row + t) * context_length);
|
|
|
|
|
Tensor w_sub = padding_data.Slice(
|
|
|
|
|
Tensor w_sub = padding_data->Slice(
|
|
|
|
|
up_pad + padding_idx, up_pad + padding_idx + padding_size);
|
|
|
|
|
auto out_t_sub_e = EigenMatrix<T>::From(out_t_sub);
|
|
|
|
|
auto w_sub_e = EigenMatrix<T>::From(w_sub);
|
|
|
|
|