|
@@ -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维特征向量"""
|