often 5 ماه پیش
والد
کامیت
6d48c08ebb

+ 23 - 38
recommend-model-produce/src/main/python/models/dssm/net.py

@@ -4,45 +4,30 @@ import paddle.nn.functional as F
 import numpy as np
 
 class DSSMLayer(nn.Layer):
-    def __init__(self, feature_nums=[5,5,5,5,5], embedding_dim=8, output_dim=16, 
+    def __init__(self, tag_feature_nums=[5,5,5,5,5], 
+                 stat_features_num=47,
+                 stat_features_num_embeddings=100,
+                 embedding_dim=8, output_dim=16, 
                  hidden_layers=[40, 32], hidden_acts=["relu", "relu"]):
         super(DSSMLayer, self).__init__()
-        tag_features_dict = [
-            {"vid": 3407301},
-            {"cate1": 42},
-            {"cate2": 67},
-            {"video_style": 6517},
-            {"valid_time": 728},
-            {"captions_color": 656},
-            {"audience_age_group": 65},
-            {"audience_value_type": 61},
-            {"font_size": 49},
-            {"cover_persons_num": 44},
-            {"audience_gender": 37},
-            {"sentiment_tendency": 11},
-            {"video_type": 8},
-            {"background_music_type": 6},
-            {"captions": 3},
-            {"has_end_credit_guide": 2}
-        ]
-                
-        self.stat_features_num = 47
-        self.stat_features_num_embeddings = 100
+
+        self.stat_features_num = stat_features_num
+        self.stat_features_num_embeddings = stat_features_num_embeddings
         
-        self.feature_num = len(tag_features_dict)
-        feature_nums = [list(d.values())[0] for d in tag_features_dict]
+        self.tag_feature_num = len(tag_feature_nums)
+        self.tag_feature_nums = tag_feature_nums
         self.embedding_dim = embedding_dim
         self.output_dim = output_dim
         # 第一层的输入维度是所有特征的embedding拼接
-        self.hidden_layers = [self.feature_num * embedding_dim + self.stat_features_num*3*embedding_dim] + hidden_layers + [output_dim]
+        self.hidden_layers = [self.tag_feature_num * embedding_dim + self.stat_features_num*3*embedding_dim] + hidden_layers + [output_dim]
         self.hidden_acts = hidden_acts
         
         
         # 为每个特征创建对应维度的Embedding层
         self.left_embeddings = nn.LayerList()
-        for i in range(self.feature_num): # 视频的静态特征
+        for i in range(self.tag_feature_num): # 视频的静态特征
             layer = nn.Embedding(
-                num_embeddings=feature_nums[i],
+                num_embeddings=self.tag_feature_nums[i],
                 embedding_dim=embedding_dim,
                 weight_attr=paddle.ParamAttr(
                     initializer=paddle.nn.initializer.XavierNormal()
@@ -70,9 +55,9 @@ class DSSMLayer(nn.Layer):
         
 
         self.right_embeddings = nn.LayerList()
-        for i in range(self.feature_num): # 视频的静态特征
+        for i in range(self.tag_feature_num): # 视频的静态特征
             layer = nn.Embedding(
-                num_embeddings=feature_nums[i],
+                num_embeddings=self.tag_feature_nums[i],
                 embedding_dim=embedding_dim,
                 weight_attr=paddle.ParamAttr(
                     initializer=paddle.nn.initializer.XavierNormal()
@@ -146,7 +131,7 @@ class DSSMLayer(nn.Layer):
         
         
         # 1. 处理视频静态特征 (使用Embedding)
-        for i in range(self.feature_num):
+        for i in range(self.tag_feature_num):
             feature = paddle.slice(
                 features, 
                 axes=[1], 
@@ -158,7 +143,7 @@ class DSSMLayer(nn.Layer):
             embedded_features.append(embedded)
         
         # 2. 处理长短期和品类表现的分桶特征 (使用Embedding)
-        start_idx = self.feature_num
+        start_idx = self.tag_feature_num
         for i in range(self.stat_features_num):
             feature = paddle.slice(
                 features,
@@ -167,11 +152,11 @@ class DSSMLayer(nn.Layer):
                 ends=[start_idx + i + 1]
             )
             feature = paddle.cast(feature, dtype='int64')
-            embedded = embeddings[self.feature_num + i](feature)
+            embedded = embeddings[self.tag_feature_num + i](feature)
             embedded_features.append(embedded)
         
         # 3. 处理原始值特征 (使用Linear)
-        start_idx = self.feature_num + self.stat_features_num
+        start_idx = self.tag_feature_num + self.stat_features_num
         for i in range(self.stat_features_num * 2):
             feature = paddle.slice(
                 features,
@@ -180,7 +165,7 @@ class DSSMLayer(nn.Layer):
                 ends=[start_idx + i + 1]
             )
             feature = paddle.cast(feature, dtype='float32')
-            embedded = embeddings[self.feature_num + self.stat_features_num + i](feature)
+            embedded = embeddings[self.tag_feature_num + self.stat_features_num + i](feature)
             # 将Linear层输出reshape为 [-1, 1, embedding_dim]
             embedded = paddle.reshape(embedded, [-1, 1, self.embedding_dim])
             embedded_features.append(embedded)
@@ -216,7 +201,7 @@ class DSSMLayer(nn.Layer):
         left_embedded = self._process_features(left_features, self.left_embeddings)
         
         # left_vec = left_embedded
-        left_vec = paddle.reshape(left_embedded, [-1, self.feature_num * self.embedding_dim])
+        left_vec = paddle.reshape(left_embedded, [-1, self.tag_feature_num * self.embedding_dim])
               
         for i, layer in enumerate(self._left_tower):
             left_vec = layer(left_vec)
@@ -231,7 +216,7 @@ class DSSMLayer(nn.Layer):
         # 处理右视频特征
         right_embedded = self._process_features(right_features, self.right_embeddings)
         # right_vec = right_embedded
-        right_vec = paddle.reshape(right_embedded, [-1, self.feature_num * self.embedding_dim])  
+        right_vec = paddle.reshape(right_embedded, [-1, self.tag_feature_num * self.embedding_dim])  
 
         for layer in self._right_tower:
             right_vec = layer(right_vec)
@@ -254,7 +239,7 @@ class DSSMLayer(nn.Layer):
         left_embedded = self._process_features(left_features, self.left_embeddings)
         
         # left_vec = left_embedded
-        left_vec = paddle.reshape(left_embedded, [-1, self.feature_num * self.embedding_dim])
+        left_vec = paddle.reshape(left_embedded, [-1, self.tag_feature_num * self.embedding_dim])
         
         for i, layer in enumerate(self._left_tower):
             left_vec = layer(left_vec)
@@ -263,7 +248,7 @@ class DSSMLayer(nn.Layer):
         # 处理右视频特征
         right_embedded = self._process_features(right_features, self.left_embeddings)
         # right_vec = right_embedded
-        right_vec = paddle.reshape(right_embedded, [-1, self.feature_num * self.embedding_dim])  
+        right_vec = paddle.reshape(right_embedded, [-1, self.tag_feature_num * self.embedding_dim])  
 
         for layer in self._left_tower:
             right_vec = layer(right_vec)

+ 41 - 4
recommend-model-produce/src/main/python/models/dssm/static_model.py

@@ -8,7 +8,36 @@ class StaticModel():
         self.config = config
         self._init_hyper_parameters()
         self.is_infer = False
+        tag_features_dict = [
+            {"vid": 3407301},
+            {"cate1": 42},
+            {"cate2": 67},
+            {"video_style": 6517},
+            {"valid_time": 728},
+            {"captions_color": 656},
+            {"audience_age_group": 65},
+            {"audience_value_type": 61},
+            {"font_size": 49},
+            {"cover_persons_num": 44},
+            {"audience_gender": 37},
+            {"sentiment_tendency": 11},
+            {"video_type": 8},
+            {"background_music_type": 6},
+            {"captions": 3},
+            {"has_end_credit_guide": 2}
+        ]
+                
+        self.stat_features_num = 47
+        self.stat_features_num_embeddings = 100
+        
+        self.feature_num = len(tag_features_dict)
+        self.feature_nums = [list(d.values())[0] for d in tag_features_dict]
+        self.embedding_dim = embedding_dim
+        self.output_dim = output_dim
+        # 第一层的输入维度是所有特征的embedding拼接
+        self.input_dim = feature_num * embedding_dim + self.stat_features_num*3*embedding_dim
 
+        
     def _init_hyper_parameters(self):
         # 修改超参数初始化
         self.feature_nums = self.config.get("hyper_parameters.feature_nums", [5,5,5,5,5])
@@ -29,17 +58,17 @@ class StaticModel():
                 name="label", shape=[-1, 1], dtype='float32')
             feeds_list.append(label)     
             left_features = paddle.static.data(
-                name="left_features", shape=[-1, self.feature_num], dtype='float32')
+                name="left_features", shape=[-1, self.input_dim], dtype='float32')
             feeds_list.append(left_features)
             right_features = paddle.static.data(
-                name="right_features", shape=[-1, self.feature_num], dtype='float32')
+                name="right_features", shape=[-1, self.input_dim], dtype='float32')
             feeds_list.append(right_features)
         else:
             #sample_id = paddle.static.data(
             #    name="sample_id", shape=[-1, 1], dtype='int64')
             #feeds_list.append(sample_id)     
             left_features = paddle.static.data(
-                name="left_features", shape=[-1, self.feature_num], dtype='float32')
+                name="left_features", shape=[-1, self.input_dim], dtype='float32')
             feeds_list.append(left_features)
 
 
@@ -47,8 +76,16 @@ class StaticModel():
 
     def net(self, input, is_infer=False):
         # 创建模型实例
+            def __init__(self, static_feature_nums=[5,5,5,5,5], 
+                 stat_features_num=47,
+                 stat_features_num_embeddings=100,
+                 embedding_dim=8, output_dim=16, 
+                 hidden_layers=[40, 32], hidden_acts=["relu", "relu"]):
+        
         dssm_model = DSSMLayer(
-            feature_nums=self.feature_nums,
+            tag_feature_nums=self.feature_nums,
+            stat_features_num = self.stat_features_num,
+            stat_features_num_embeddings = self.stat_features_num_embeddings,
             embedding_dim=self.embedding_dim,
             output_dim=self.output_dim,
             hidden_layers=self.hidden_layers,