Sharing parameters in Siamese network, Siamese 网络中的参数共享问题
Created by: rulai-huiyingl
网络:siamese网络。给定一对输入,分别放入一个相同的网络,得到两个不同的embedding,然后求两个embedding的相似度(和recommender system的例子相似只不过两个不同输入穿过相同的网络得到不同输出)。 使用paddle 0.10.0.
问题:
- 用下面这个网络算相似度的时候 cosine layer算出来不论输入如何结果都是1(是5如果scale=5)。 如果不把两个fc用同样的名字就没这个问题。
def main():
##some initialization & get input here
##input1 and input2 each is a dense float number vector(e.g. word embedding)
fc1_o1 = paddle.layer.fc(input=input1,
size=hidden_size,
name="fc1")
fc1_o2 = paddle.layer.fc(input=input2,
size=hidden_size,
name="fc1") ##Here the parameter names are the same
cosine_sim = paddle.layer.cos_sim(a=fc1_o1, b=fc1_o2, size=1, scale=5)
y = paddle.layer.data(name='similarity', type=paddle.data_type.dense_vector(1))
loss = paddle.layer.mse_cost(input=cosine_sim, label=y)
parameters = paddle.parameters.create(loss)
我是在训练程序运行的时候设置pdb断点并且infer想观察的变量来观察网络的输出。这里抓取了fc1_o1(v1)和fc1_o2(v2)(两个直接输入到paddle.layer.cos_sim的变量),以及算出来的cosine值。作为比较我自己另外单独用scipy给v1和v2算了cosine 相似度
if isinstance(event, paddle.event.EndIteration):
v1 = paddle.infer(output_layer=fc1_o1,
parameters=parameters,
input=test_data[:1],
feeding=infer_feed)
v2 = paddle.infer(output_layer=fc1_s2,
parameters=parameters,
input=test_data[:1],
feeding=infer_feed)
cos = paddle.infer(output_layer=cosine_sim,
parameters=parameters,
input=test_data[:1],
feeding=infer_feed)
pdb.set_trace() #python hangs up here and I check the values
十分困惑的是,看到的v1和v2变量是不同的(我的例子里大概0.8的相似度),不过paddle.layer.cosine算出来是1......照理说如果v1 v2infer出来不同,那么网络的设置应该是对的。但是为什么cosine layer仿佛一直在算两个一模一样的输入的相似度呢?
2. 有没有更方便合理的打印变量值的方法?
十分感谢!