您是否可以定义Caffe图层以对已部署模型的输入图层进行平均减法?

时间:2017-07-18 19:57:16

标签: python neural-network transform caffe pycaffe

您可以将mean_file参数作为Input块的一部分提供给transform_param图层,例如:

layer {
  name: "data"
  type: "Input"
  top: "data"
  input_param { shape: { dim: 1 dim: 3 dim: 224 dim: 224 } }
  transform_param {
    mean_file: "imagenet_mean.binaryproto"
  }
}

但是对于Input图层,此转换似乎只是ignored without warning

在检查其他data layer types时,似乎没有一个能够使用普通Input图层作为其底部(输入)图层,因此这些图层都不能用于应用事后的平均减法。

还有一个Bias layer,但我无法弄清楚它的文档,它似乎不接受二元文件。

假设我受约束,所以我只能在proto文件中表达平均减法。在传入输入之前,我无法在C ++或Python中提前执行此操作,并且我无法将其编写为自定义图层或Python图层。

考虑到这个约束,如何通过输入层中的binaryproto文件实现平均减法 - 通过在它之后定义另一个层,或者其他方式?

1 个答案:

答案 0 :(得分:-1)

假设你可以有一个输入层" top"是'imagenet_mean.binaryproto'减去,然后您可以使用"Bias"图层来减去均值:

layer {
  name: "mean_subtract"
  type: "Bias"
  bottom: "raw_data" # shape 1-by-3-by-224-by-224
  bottom: "minus_imagenet_mean" # assuming shape 3-by-224-by-224
  top: "data"
  bias_param { axis: 1 } 
}

使用batch_size: 1,您也可以使用"Eltwise"图层进行相同的减法。

<强>更新
好吧,好像你的问题是&#34;我到底要带来"minus_imagenet_mean" blob?!&#34;
您是否考虑过使用"Parameter"来存储"minus_imagenet_mean"

layer {
  name: "minus_imagenet_mean"
  type: "Parameter"
  top: "minus_imagenet_mean"
  parameter_param { shape { dim: 3 dim: 224 dim: 224 } }
  param { lr_mult: 0 decay_mult: 0 }
}

定义此图层后,可以使用net surgery初始化此参数。然后将它与网络的所有其他参数一起存储到caffemodel,您应该没问题。