-
关键字:
数据维度
,余弦相似度
-
问题描述:通过定义一个用户提取用户特征综合模型输出大小为100和一个电影特征模型输出大小为200,来训练一个个性化推荐模型,在训练的时候,出现输入数据维度不相同错误。
-
报错信息:
<ipython-input-5-7d5f9bd60bf7> in inference_program()
3 mov_combined_features = get_mov_combined_features()
4
----> 5 inference = layers.cos_sim(X=usr_combined_features, Y=mov_combined_features)
6 scale_infer = layers.scale(x=inference, scale=5.0)
7
/opt/conda/envs/py35-paddle1.0.0/lib/python3.5/site-packages/paddle/fluid/layers/nn.py in cos_sim(X, Y)
947 outputs={'Out': [out],
948 'XNorm': [xnorm],
--> 949 'YNorm': [ynorm]})
950 return out
951
/opt/conda/envs/py35-paddle1.0.0/lib/python3.5/site-packages/paddle/fluid/layer_helper.py in append_op(self, *args, **kwargs)
48
49 def append_op(self, *args, **kwargs):
---> 50 return self.main_program.current_block().append_op(*args, **kwargs)
51
52 def multiple_input(self, input_param_name='input'):
/opt/conda/envs/py35-paddle1.0.0/lib/python3.5/site-packages/paddle/fluid/framework.py in append_op(self, *args, **kwargs)
1205 """
1206 op_desc = self.desc.append_op()
-> 1207 op = Operator(block=self, desc=op_desc, *args, **kwargs)
1208 self.ops.append(op)
1209 return op
/opt/conda/envs/py35-paddle1.0.0/lib/python3.5/site-packages/paddle/fluid/framework.py in __init__(***failed resolving arguments***)
654 if self._has_kernel(type):
655 self.desc.infer_var_type(self.block.desc)
--> 656 self.desc.infer_shape(self.block.desc)
657
658 def _has_kernel(self, op_type):
EnforceNotMet: Enforce failed. Expected framework::slice_ddim(x_dims, 1, x_dims.size()) == framework::slice_ddim(y_dims, 1, y_dims.size()), but received framework::slice_ddim(x_dims, 1, x_dims.size()):100 != framework::slice_ddim(y_dims, 1, y_dims.size()):200.
All dimensions except the 1st of Input(X) and Input(Y) must be equal. at [/paddle/paddle/fluid/operators/cos_sim_op.cc:50]
PaddlePaddle Call Stacks:
- 问题复现:定义一个用户特征模型,在最后的全连接层
fluid.layers.fc
的接口中设置大小为100。在定义一个电影特征模型,在最后的全连接层fluid.layers.fc
的接口中设置大小为200。最后对这两个模型的全连接层通过fluid.layers.cos_sim
计算它们的余弦相似度,在训练的时候就会出现以上的问题。错误代码如下:
concat_embed = layers.concat(input=[usr_fc, usr_gender_fc, usr_age_fc, usr_job_fc], axis=1)
usr_combined_features = layers.fc(input=concat_embed, size=100, act="tanh")
······
concat_embed = layers.concat(input=[mov_fc, mov_categories_hidden, mov_title_conv], axis=1)
mov_combined_features = layers.fc(input=concat_embed, size=200, act="tanh")
inference = layers.cos_sim(X=usr_combined_features, Y=mov_combined_features)
- 解决问题:
fluid.layers.cos_sim
接口的参数X
和Y
要求必须有相同的形状,除了输入Y的第一维可以是1(与输入X不同),而上面的错误时因为两个全连接层的大小设置不一样,导致的输出X
和Y
形状不相同,所以才导致错误。正确代码如下:
concat_embed = layers.concat(input=[usr_fc, usr_gender_fc, usr_age_fc, usr_job_fc], axis=1)
usr_combined_features = layers.fc(input=concat_embed, size=200, act="tanh")
······
concat_embed = layers.concat(input=[mov_fc, mov_categories_hidden, mov_title_conv], axis=1)
mov_combined_features = layers.fc(input=concat_embed, size=200, act="tanh")
inference = layers.cos_sim(X=usr_combined_features, Y=mov_combined_features)