| 
					
				 | 
			
			
				@@ -98,18 +98,63 @@ class DSSMLayer(nn.Layer): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         return paddle.concat(embedded_features, axis=1) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    def forward(self, left_features, right_features): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        # 获取两个视频的特征表示       
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        left_vec, right_vec = self.get_vectors(left_features, right_features) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        # 计算相似度 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        sim_score = F.cosine_similarity( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            left_vec,  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            right_vec,  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            axis=1 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        ).reshape([-1, 1]) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        return sim_score, left_vec, right_vec 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    def forward(self, left_features, right_features, is_infer): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if is_infer: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            left_vec = get_leftvectors(left_features) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            return left_vec 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        else: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            # 获取两个视频的特征表示       
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            left_vec, right_vec = self.get_vectors(left_features, right_features) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            # 计算相似度 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            sim_score = F.cosine_similarity( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                left_vec,  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                right_vec,  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                axis=1 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            ).reshape([-1, 1]) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            return sim_score, left_vec, right_vec 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    def get_leftvectors(self, left_features): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        """获取两个视频的16维特征向量""" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        # 处理左视频特征 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+         
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        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]) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+               
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        for i, layer in enumerate(self._left_tower): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            left_vec = layer(left_vec) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+         
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        return left_vec 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    def get_rightvectors(self,right_features):         
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        # 处理右视频特征 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        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])   
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        for layer in self._right_tower: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            right_vec = layer(right_vec) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+             
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        # 确保输出是L2归一化的 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        left_vec = F.normalize(left_vec, p=2, axis=1) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        right_vec = F.normalize(right_vec, p=2, axis=1) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+         
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        return right_vec 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     def get_vectors(self, left_features, right_features): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         """获取两个视频的16维特征向量""" 
			 |