diff --git a/docs/images/qrcode/dinggroup1.png b/docs/images/qrcode/dinggroup1.png index b758ea4d2..cf3fd59e8 100644 Binary files a/docs/images/qrcode/dinggroup1.png and b/docs/images/qrcode/dinggroup1.png differ diff --git a/docs/images/qrcode/dinggroup2.png b/docs/images/qrcode/dinggroup2.png index f8cfb15eb..bc5344367 100644 Binary files a/docs/images/qrcode/dinggroup2.png and b/docs/images/qrcode/dinggroup2.png differ diff --git a/docs/source/feature/feature.rst b/docs/source/feature/feature.rst index 8cc25af48..97b0cdbd1 100644 --- a/docs/source/feature/feature.rst +++ b/docs/source/feature/feature.rst @@ -295,6 +295,8 @@ Sequence类特征格式一般为“XX\|XX\|XX”,如用户行为序列特征 - embedding_dim: embedding的dimension - hash_bucket_size: 同离散值特征 - sub_feature_type: 用于描述序列特征里子特征的类型,目前支持 IdFeature 和 RawFeature 两种形式,默认为 IdFeature +- pad_sequence_length: 序列补齐或截断的长度 +- max_seq_len: 最大序列长度,超过该长度的序列会被截断;当配置了`pad_sequence_length`时,`max_seq_len`会被忽略 - NOTE:SequenceFeature一般用在DIN算法或者BST算法里面。 在模型中可支持对序列特征使用Target Attention(DIN),方法如下: diff --git a/easy_rec/python/builders/loss_builder.py b/easy_rec/python/builders/loss_builder.py index b9698ba5b..55f0836e8 100644 --- a/easy_rec/python/builders/loss_builder.py +++ b/easy_rec/python/builders/loss_builder.py @@ -240,8 +240,7 @@ def build_kd_loss(kds, prediction_dict, label_dict, feature_dict): loss_dict = {} for kd in kds: assert kd.pred_name in prediction_dict, 'invalid predict_name: %s available ones: %s' % ( - kd.pred_name, - ','.join(prediction_dict.keys())) + kd.pred_name, ','.join(prediction_dict.keys())) loss_name = kd.loss_name if not loss_name: diff --git a/easy_rec/python/feature_column/feature_column.py b/easy_rec/python/feature_column/feature_column.py index 8701b55fc..f60a2a949 100644 --- a/easy_rec/python/feature_column/feature_column.py +++ b/easy_rec/python/feature_column/feature_column.py @@ -165,8 +165,11 @@ def _cmp_embed_config(a, b): config = self._share_embed_infos[embed_name] max_seq_len = config.max_seq_len if config.HasField( 'max_seq_len') else -1 + pad_sequence_length = config.pad_sequence_length if config.HasField( + 'pad_sequence_length') else -1 for fc in share_embed_fcs: fc.max_seq_length = max_seq_len + fc.pad_sequence_length = pad_sequence_length self._deep_share_embed_columns[embed_name] = share_embed_fcs # for handling wide share embedding columns @@ -182,8 +185,11 @@ def _cmp_embed_config(a, b): config = self._share_embed_infos[embed_name] max_seq_len = config.max_seq_len if config.HasField( 'max_seq_len') else -1 + pad_sequence_length = config.pad_sequence_length if config.HasField( + 'pad_sequence_length') else -1 for fc in share_embed_fcs: fc.max_seq_length = max_seq_len + fc.pad_sequence_length = pad_sequence_length self._wide_share_embed_columns[embed_name] = share_embed_fcs for fc_name in self._deep_columns: @@ -647,6 +653,8 @@ def _add_deep_embedding_column(self, fc, config): ev_params=ev_params) fc.max_seq_length = config.max_seq_len if config.HasField( 'max_seq_len') else -1 + fc.pad_sequence_length = config.pad_sequence_length if config.HasField( + 'pad_sequence_length') else -1 if config.feature_type != config.SequenceFeature: self._deep_columns[feature_name] = fc diff --git a/easy_rec/python/layers/input_layer.py b/easy_rec/python/layers/input_layer.py index 27bc9bdf4..f21cc4a20 100644 --- a/easy_rec/python/layers/input_layer.py +++ b/easy_rec/python/layers/input_layer.py @@ -180,7 +180,11 @@ def get_sequence_feature(self, features, group_name): with variable_scope.variable_scope('input_layer/' + fc.categorical_column.name): tmp_embedding, tmp_seq_len = fc._get_sequence_dense_tensor(builder) - if fc.max_seq_length > 0: + # If pad_sequence_length is set, pad or truncate to fixed length + if fc.pad_sequence_length > 0: + tmp_embedding, tmp_seq_len = shape_utils.pad_or_truncate_sequence( + tmp_embedding, tmp_seq_len, fc.pad_sequence_length) + elif fc.max_seq_length > 0: tmp_embedding, tmp_seq_len = shape_utils.truncate_sequence( tmp_embedding, tmp_seq_len, fc.max_seq_length) seq_features.append((tmp_embedding, tmp_seq_len)) diff --git a/easy_rec/python/protos/feature_config.proto b/easy_rec/python/protos/feature_config.proto index 8c0c0c214..69a2f273c 100644 --- a/easy_rec/python/protos/feature_config.proto +++ b/easy_rec/python/protos/feature_config.proto @@ -80,6 +80,8 @@ message FeatureConfig { optional string seq_multi_sep = 101; // truncate sequence data to max_seq_len optional uint32 max_seq_len = 102; + // pad or truncate sequence to fixed length (enables padding for shorter sequences) + optional uint32 pad_sequence_length = 103; optional string vocab_file = 11; repeated string vocab_list = 12; diff --git a/easy_rec/version.py b/easy_rec/version.py index 80ce168e3..ce2f7d72a 100644 --- a/easy_rec/version.py +++ b/easy_rec/version.py @@ -1,4 +1,4 @@ # -*- encoding:utf-8 -*- # Copyright (c) Alibaba, Inc. and its affiliates. -__version__ = '0.8.7' +__version__ = '0.8.8'