我正在尝试理解和解释用Caffe .proto编写的模型。
昨天我看到@某人在这里分享的一个'deploy.prototxt'
样本,如下所示:
layer { name: "ip1_a" bottom: "data_a" top: "ip1_a" type: "InnerProduct" inner_product_param { num_output: 10 } param { name: "ip1_w" # 注意这个名字! lr_mult: 1 } param { name: "ip1_b" lr_mult: 2 } } layer { name: "ip1_b" bottom: "data_b" top: "ip1_b" type: "InnerProduct" inner_product_param { num_output: 10 } param { name: "ip1_w" # 注意这个名字:它是相同的! lr_mult: 10 # 这个分支的学习率不同 } param { name: "ip1_b" lr_mult: 20 } } # 一个层用于合并它们 layer { type: "Concat" bottom: "ip1_a" bottom: "ip1_b" top: "ip1_combine" name: "concat" } layer { name: "joint_ip" type: "InnerProduct" bottom: "ip1_combine" top: "joint_ip" inner_product_param { num_output: 30 } }
我对这个模型定义的理解如下:
data_a data_b | | | | ------- ------- | ip1_a | | ip1_b | ------- ------- | | | | ip1_a ip1_b | | | | V V ~~~~~~~~~~~~~~~ | | V ------------- | concat | ------------- | | ip1_combine | | ------------- | joint_ip | ------------- | | joint_ip
ip1_a
blob由ip1_a
层训练,权重使用ip1_w
(lr:1)初始化,偏置使用ip1_b
(lr:2)初始化。实际上,ip1_a
blob是使用ip1_w
初始化的新学习权重。学习到的偏置没有名称。
在一些模型中,我们可以发现一些层有:
lr_mult:1lr_mult:2
其中,第一个lr_mult
实例始终对应于权重,第二个实例对应于偏置。
我上面的理解是否正确?
回答:
你混淆了两种数据类型:输入(训练)数据和网络参数。
在训练过程中,输入数据固定为已知的训练/验证集,只有网络参数会发生变化。相反,在部署网络时,数据会变为新的图像,而网络参数是固定的。请参阅这个回答,了解Caffe存储这两种数据类型的方式的详细描述。
在你展示的例子中,有两个输入训练数据路径:data_a
和data_b
,每次可能为不同的图像。输入blob通过InnerProduct层分别变为ip1_a
和ip1_b
blob。然后它们被连接成一个单一的blob ip1_combined
,然后输入到最终的InnerProduct层中。
另一方面,模型有一组参数:第一个内积层的ip1_w
和ip1_b
(权重和偏置)。在这个特定的例子中,层的参数被明确命名,以表明它们在ip1_a
和ip1_b
层之间是共享的。
至于两个lr_mult
:是的,第一个是权重的学习率乘数,第二个是偏置项的。