加载预训练网络时错误表示扁平维度

Error indicates flattened dimensions when loading pre-trained network

问题

我正在尝试加载预训练网络,但出现以下错误

F1101 23:03:41.857909 73 net.cpp:757] Cannot copy param 0 weights

from layer 'fc4'; shape mismatch. Source param shape is 512 4096

(2097152); target param shape is 512 256 4 4 (2097152). To learn this

layer's parameters from scratch rather than copying from a saved net,

rename the layer.

我注意到 512 x 256 x 4 x 4 == 512 x 4096,所以似乎在保存和重新加载网络权重时,图层以某种方式变平了。

如何解决这个错误?

重现

我正在尝试在这个 GitHub 存储库中使用 D-CNN 预训练网络。

我用

加载网络

import caffe

net = caffe.Net('deploy_D-CNN.prototxt', 'D-CNN.caffemodel', caffe.TEST)
name:"D-CNN"

input:"data"

input_dim: 10

input_dim: 3

input_dim: 259

input_dim: 259

layer {

 name:"conv1"

 type:"Convolution"

 bottom:"data"

 top:"conv1"

 convolution_param {

  num_output: 64

  kernel_size: 5

  stride: 2

 }

}

layer {

 name:"relu1"

 type:"ReLU"

 bottom:"conv1"

 top:"conv1"

}

layer {

 name:"pool1"

 type:"Pooling"

 bottom:"conv1"

 top:"pool1"

 pooling_param {

  pool: MAX

  kernel_size: 2

  stride: 2

 }

}

layer {

 name:"norm1"

 type:"LRN"

 bottom:"pool1"

 top:"norm1"

 lrn_param {

  local_size: 5

  alpha: 0.0001

  beta: 0.75

 }

}

layer {

 name:"conv2"

 type:"Convolution"

 bottom:"norm1"

 top:"conv2"

 convolution_param {

  num_output: 128

  pad: 1

  kernel_size: 3

 }

}

layer {

 name:"relu2"

 type:"ReLU"

 bottom:"conv2"

 top:"conv2"

}

layer {

 name:"pool2"

 type:"Pooling"

 bottom:"conv2"

 top:"pool2"

 pooling_param {

  pool: MAX

  kernel_size: 2

  stride: 2

 }

}

layer {

 name:"conv3"

 type:"Convolution"

 bottom:"pool2"

 top:"conv3"

 convolution_param {

  num_output: 256

  pad: 1

  kernel_size: 3

  stride: 1

 }

}

layer {

 name:"relu3"

 type:"ReLU"

 bottom:"conv3"

 top:"conv3"

}

layer {

 name:"fc4"

 type:"Convolution"

 bottom:"conv3"

 top:"fc4"

 convolution_param {

  num_output: 512

  pad: 0

  kernel_size: 4

 }

}

layer {

 name:"relu4"

 type:"ReLU"

 bottom:"fc4"

 top:"fc4"

}

layer {

 name:"drop4"

 type:"Dropout"

 bottom:"fc4"

 top:"fc4"

 dropout_param {

  dropout_ratio: 0.5

 }

}

layer { 

 name:"pool5_spm3"

 type:"Pooling"

 bottom:"fc4"

 top:"pool5_spm3"

 pooling_param {

  pool: MAX

  kernel_size: 10

  stride: 10

 }

}

layer {

 name:"pool5_spm3_flatten"

 type:"Flatten"

 bottom:"pool5_spm3"

 top:"pool5_spm3_flatten"

}

layer { 

 name:"pool5_spm2"

 type:"Pooling"

 bottom:"fc4"

 top:"pool5_spm2"

 pooling_param {

  pool: MAX

  kernel_size: 14

  stride: 14

 }

}

layer {

 name:"pool5_spm2_flatten"

 type:"Flatten"

 bottom:"pool5_spm2"

 top:"pool5_spm2_flatten"

}

layer { 

 name:"pool5_spm1"

 type:"Pooling"

 bottom:"fc4"

 top:"pool5_spm1"

 pooling_param {

  pool: MAX

  kernel_size: 29

  stride: 29

 }

}

layer {

 name:"pool5_spm1_flatten"

 type:"Flatten"

 bottom:"pool5_spm1"

 top:"pool5_spm1_flatten"

}

layer {

 name:"pool5_spm"

 type:"Concat"

 bottom:"pool5_spm1_flatten"

 bottom:"pool5_spm2_flatten"

 bottom:"pool5_spm3_flatten"

 top:"pool5_spm"

 concat_param {

  concat_dim: 1

 }

}





layer {

 name:"fc4_2"

 type:"InnerProduct"

 bottom:"pool5_spm"

 top:"fc4_2"

 param {

  lr_mult: 1

  decay_mult: 1

 }

 param {

  lr_mult: 2

  decay_mult: 0

 }

 inner_product_param {

  num_output: 512

  weight_filler {

   type:"gaussian"

   std: 0.005

  }

  bias_filler {

   type:"constant"

   value: 0.1

  }

 }

}

layer {

 name:"relu4"

 type:"ReLU"

 bottom:"fc4_2"

 top:"fc4_2"

}

layer {

 name:"drop4"

 type:"Dropout"

 bottom:"fc4_2"

 top:"fc4_2"

 dropout_param {

  dropout_ratio: 0.5

 }

}



layer {

 name:"fc5"

 type:"InnerProduct"

 bottom:"fc4_2"

 top:"fc5"

 param {

  lr_mult: 1

  decay_mult: 1

 }

 param {

  lr_mult: 2

  decay_mult: 0

 }

 inner_product_param {

  num_output: 19

  weight_filler {

   type:"gaussian"

   std: 0.01

  }

  bias_filler {

   type:"constant"

   value: 0

  }

 }

}

layer {

 name:"prob"

 type:"Softmax"

 bottom:"fc5"

 top:"prob"

}
layer {

 name:"fc4"

 type:"Convolution"

 bottom:"conv3"

 top:"fc4"

 convolution_param {

  num_output: 512

  pad: 0

  kernel_size: 4

 }

 param {

  lr_mult: 1

  decay_mult: 1

  share_mode: PERMISSIVE # should help caffe overcome the shape mismatch

 }

 param {

  lr_mult: 2

  decay_mult: 0

  share_mode: PERMISSIVE

 }

}

prototxt 文件是

import caffe

net = caffe.Net('deploy_D-CNN.prototxt', 'D-CNN.caffemodel', caffe.TEST)
name:"D-CNN"

input:"data"

input_dim: 10

input_dim: 3

input_dim: 259

input_dim: 259

layer {

 name:"conv1"

 type:"Convolution"

 bottom:"data"

 top:"conv1"

 convolution_param {

  num_output: 64

  kernel_size: 5

  stride: 2

 }

}

layer {

 name:"relu1"

 type:"ReLU"

 bottom:"conv1"

 top:"conv1"

}

layer {

 name:"pool1"

 type:"Pooling"

 bottom:"conv1"

 top:"pool1"

 pooling_param {

  pool: MAX

  kernel_size: 2

  stride: 2

 }

}

layer {

 name:"norm1"

 type:"LRN"

 bottom:"pool1"

 top:"norm1"

 lrn_param {

  local_size: 5

  alpha: 0.0001

  beta: 0.75

 }

}

layer {

 name:"conv2"

 type:"Convolution"

 bottom:"norm1"

 top:"conv2"

 convolution_param {

  num_output: 128

  pad: 1

  kernel_size: 3

 }

}

layer {

 name:"relu2"

 type:"ReLU"

 bottom:"conv2"

 top:"conv2"

}

layer {

 name:"pool2"

 type:"Pooling"

 bottom:"conv2"

 top:"pool2"

 pooling_param {

  pool: MAX

  kernel_size: 2

  stride: 2

 }

}

layer {

 name:"conv3"

 type:"Convolution"

 bottom:"pool2"

 top:"conv3"

 convolution_param {

  num_output: 256

  pad: 1

  kernel_size: 3

  stride: 1

 }

}

layer {

 name:"relu3"

 type:"ReLU"

 bottom:"conv3"

 top:"conv3"

}

layer {

 name:"fc4"

 type:"Convolution"

 bottom:"conv3"

 top:"fc4"

 convolution_param {

  num_output: 512

  pad: 0

  kernel_size: 4

 }

}

layer {

 name:"relu4"

 type:"ReLU"

 bottom:"fc4"

 top:"fc4"

}

layer {

 name:"drop4"

 type:"Dropout"

 bottom:"fc4"

 top:"fc4"

 dropout_param {

  dropout_ratio: 0.5

 }

}

layer { 

 name:"pool5_spm3"

 type:"Pooling"

 bottom:"fc4"

 top:"pool5_spm3"

 pooling_param {

  pool: MAX

  kernel_size: 10

  stride: 10

 }

}

layer {

 name:"pool5_spm3_flatten"

 type:"Flatten"

 bottom:"pool5_spm3"

 top:"pool5_spm3_flatten"

}

layer { 

 name:"pool5_spm2"

 type:"Pooling"

 bottom:"fc4"

 top:"pool5_spm2"

 pooling_param {

  pool: MAX

  kernel_size: 14

  stride: 14

 }

}

layer {

 name:"pool5_spm2_flatten"

 type:"Flatten"

 bottom:"pool5_spm2"

 top:"pool5_spm2_flatten"

}

layer { 

 name:"pool5_spm1"

 type:"Pooling"

 bottom:"fc4"

 top:"pool5_spm1"

 pooling_param {

  pool: MAX

  kernel_size: 29

  stride: 29

 }

}

layer {

 name:"pool5_spm1_flatten"

 type:"Flatten"

 bottom:"pool5_spm1"

 top:"pool5_spm1_flatten"

}

layer {

 name:"pool5_spm"

 type:"Concat"

 bottom:"pool5_spm1_flatten"

 bottom:"pool5_spm2_flatten"

 bottom:"pool5_spm3_flatten"

 top:"pool5_spm"

 concat_param {

  concat_dim: 1

 }

}





layer {

 name:"fc4_2"

 type:"InnerProduct"

 bottom:"pool5_spm"

 top:"fc4_2"

 param {

  lr_mult: 1

  decay_mult: 1

 }

 param {

  lr_mult: 2

  decay_mult: 0

 }

 inner_product_param {

  num_output: 512

  weight_filler {

   type:"gaussian"

   std: 0.005

  }

  bias_filler {

   type:"constant"

   value: 0.1

  }

 }

}

layer {

 name:"relu4"

 type:"ReLU"

 bottom:"fc4_2"

 top:"fc4_2"

}

layer {

 name:"drop4"

 type:"Dropout"

 bottom:"fc4_2"

 top:"fc4_2"

 dropout_param {

  dropout_ratio: 0.5

 }

}



layer {

 name:"fc5"

 type:"InnerProduct"

 bottom:"fc4_2"

 top:"fc5"

 param {

  lr_mult: 1

  decay_mult: 1

 }

 param {

  lr_mult: 2

  decay_mult: 0

 }

 inner_product_param {

  num_output: 19

  weight_filler {

   type:"gaussian"

   std: 0.01

  }

  bias_filler {

   type:"constant"

   value: 0

  }

 }

}

layer {

 name:"prob"

 type:"Softmax"

 bottom:"fc5"

 top:"prob"

}
layer {

 name:"fc4"

 type:"Convolution"

 bottom:"conv3"

 top:"fc4"

 convolution_param {

  num_output: 512

  pad: 0

  kernel_size: 4

 }

 param {

  lr_mult: 1

  decay_mult: 1

  share_mode: PERMISSIVE # should help caffe overcome the shape mismatch

 }

 param {

  lr_mult: 2

  decay_mult: 0

  share_mode: PERMISSIVE

 }

}

看起来你正在使用一个预训练的网络,其中层 "fc4" 是一个完全连接的层(又名 type:"InnerProduct" 层),它被"重塑"成一个卷积层。

由于内积层和卷积层都对输入执行大致相同的线性运算,因此可以在某些假设下进行此更改(例如,参见此处)。

正如您已经正确识别的那样,原始预训练的全连接层的权重被保存为"扁平化"w.r.t caffe 期望卷积层的形状。

我认为可以使用 share_mode: PERMISSIVE:

来解决这个问题

import caffe

net = caffe.Net('deploy_D-CNN.prototxt', 'D-CNN.caffemodel', caffe.TEST)
name:"D-CNN"

input:"data"

input_dim: 10

input_dim: 3

input_dim: 259

input_dim: 259

layer {

 name:"conv1"

 type:"Convolution"

 bottom:"data"

 top:"conv1"

 convolution_param {

  num_output: 64

  kernel_size: 5

  stride: 2

 }

}

layer {

 name:"relu1"

 type:"ReLU"

 bottom:"conv1"

 top:"conv1"

}

layer {

 name:"pool1"

 type:"Pooling"

 bottom:"conv1"

 top:"pool1"

 pooling_param {

  pool: MAX

  kernel_size: 2

  stride: 2

 }

}

layer {

 name:"norm1"

 type:"LRN"

 bottom:"pool1"

 top:"norm1"

 lrn_param {

  local_size: 5

  alpha: 0.0001

  beta: 0.75

 }

}

layer {

 name:"conv2"

 type:"Convolution"

 bottom:"norm1"

 top:"conv2"

 convolution_param {

  num_output: 128

  pad: 1

  kernel_size: 3

 }

}

layer {

 name:"relu2"

 type:"ReLU"

 bottom:"conv2"

 top:"conv2"

}

layer {

 name:"pool2"

 type:"Pooling"

 bottom:"conv2"

 top:"pool2"

 pooling_param {

  pool: MAX

  kernel_size: 2

  stride: 2

 }

}

layer {

 name:"conv3"

 type:"Convolution"

 bottom:"pool2"

 top:"conv3"

 convolution_param {

  num_output: 256

  pad: 1

  kernel_size: 3

  stride: 1

 }

}

layer {

 name:"relu3"

 type:"ReLU"

 bottom:"conv3"

 top:"conv3"

}

layer {

 name:"fc4"

 type:"Convolution"

 bottom:"conv3"

 top:"fc4"

 convolution_param {

  num_output: 512

  pad: 0

  kernel_size: 4

 }

}

layer {

 name:"relu4"

 type:"ReLU"

 bottom:"fc4"

 top:"fc4"

}

layer {

 name:"drop4"

 type:"Dropout"

 bottom:"fc4"

 top:"fc4"

 dropout_param {

  dropout_ratio: 0.5

 }

}

layer { 

 name:"pool5_spm3"

 type:"Pooling"

 bottom:"fc4"

 top:"pool5_spm3"

 pooling_param {

  pool: MAX

  kernel_size: 10

  stride: 10

 }

}

layer {

 name:"pool5_spm3_flatten"

 type:"Flatten"

 bottom:"pool5_spm3"

 top:"pool5_spm3_flatten"

}

layer { 

 name:"pool5_spm2"

 type:"Pooling"

 bottom:"fc4"

 top:"pool5_spm2"

 pooling_param {

  pool: MAX

  kernel_size: 14

  stride: 14

 }

}

layer {

 name:"pool5_spm2_flatten"

 type:"Flatten"

 bottom:"pool5_spm2"

 top:"pool5_spm2_flatten"

}

layer { 

 name:"pool5_spm1"

 type:"Pooling"

 bottom:"fc4"

 top:"pool5_spm1"

 pooling_param {

  pool: MAX

  kernel_size: 29

  stride: 29

 }

}

layer {

 name:"pool5_spm1_flatten"

 type:"Flatten"

 bottom:"pool5_spm1"

 top:"pool5_spm1_flatten"

}

layer {

 name:"pool5_spm"

 type:"Concat"

 bottom:"pool5_spm1_flatten"

 bottom:"pool5_spm2_flatten"

 bottom:"pool5_spm3_flatten"

 top:"pool5_spm"

 concat_param {

  concat_dim: 1

 }

}





layer {

 name:"fc4_2"

 type:"InnerProduct"

 bottom:"pool5_spm"

 top:"fc4_2"

 param {

  lr_mult: 1

  decay_mult: 1

 }

 param {

  lr_mult: 2

  decay_mult: 0

 }

 inner_product_param {

  num_output: 512

  weight_filler {

   type:"gaussian"

   std: 0.005

  }

  bias_filler {

   type:"constant"

   value: 0.1

  }

 }

}

layer {

 name:"relu4"

 type:"ReLU"

 bottom:"fc4_2"

 top:"fc4_2"

}

layer {

 name:"drop4"

 type:"Dropout"

 bottom:"fc4_2"

 top:"fc4_2"

 dropout_param {

  dropout_ratio: 0.5

 }

}



layer {

 name:"fc5"

 type:"InnerProduct"

 bottom:"fc4_2"

 top:"fc5"

 param {

  lr_mult: 1

  decay_mult: 1

 }

 param {

  lr_mult: 2

  decay_mult: 0

 }

 inner_product_param {

  num_output: 19

  weight_filler {

   type:"gaussian"

   std: 0.01

  }

  bias_filler {

   type:"constant"

   value: 0

  }

 }

}

layer {

 name:"prob"

 type:"Softmax"

 bottom:"fc5"

 top:"prob"

}
layer {

 name:"fc4"

 type:"Convolution"

 bottom:"conv3"

 top:"fc4"

 convolution_param {

  num_output: 512

  pad: 0

  kernel_size: 4

 }

 param {

  lr_mult: 1

  decay_mult: 1

  share_mode: PERMISSIVE # should help caffe overcome the shape mismatch

 }

 param {

  lr_mult: 2

  decay_mult: 0

  share_mode: PERMISSIVE

 }

}

相关推荐

  • Spring部署设置openshift

    Springdeploymentsettingsopenshift我有一个问题让我抓狂了三天。我根据OpenShift帐户上的教程部署了spring-eap6-quickstart代码。我已配置调试选项,并且已将Eclipse工作区与OpehShift服务器同步-服务器上的一切工作正常,但在Eclipse中出现无法消除的错误。我有这个错误:cvc-complex-type.2.4.a:Invali…
    2025-04-161
  • 检查Java中正则表达式中模式的第n次出现

    CheckfornthoccurrenceofpatterninregularexpressioninJava本问题已经有最佳答案,请猛点这里访问。我想使用Java正则表达式检查输入字符串中特定模式的第n次出现。你能建议怎么做吗?这应该可以工作:MatchResultfindNthOccurance(intn,Patternp,CharSequencesrc){Matcherm=p.matcher…
    2025-04-161
  • 如何让 JTable 停留在已编辑的单元格上

    HowtohaveJTablestayingontheeditedcell如果有人编辑JTable的单元格内容并按Enter,则内容会被修改并且表格选择会移动到下一行。是否可以禁止JTable在单元格编辑后转到下一行?原因是我的程序使用ListSelectionListener在单元格选择上同步了其他一些小部件,并且我不想在编辑当前单元格后选择下一行。Enter的默认绑定是名为selectNext…
    2025-04-161
  • Weblogic 12c 部署

    Weblogic12cdeploy我正在尝试将我的应用程序从Tomcat迁移到Weblogic12.2.1.3.0。我能够毫无错误地部署应用程序,但我遇到了与持久性提供程序相关的运行时错误。这是堆栈跟踪:javax.validation.ValidationException:CalltoTraversableResolver.isReachable()threwanexceptionatorg.…
    2025-04-161
  • Resteasy Content-Type 默认值

    ResteasyContent-Typedefaults我正在使用Resteasy编写一个可以返回JSON和XML的应用程序,但可以选择默认为XML。这是我的方法:@GET@Path("/content")@Produces({MediaType.APPLICATION_XML,MediaType.APPLICATION_JSON})publicStringcontentListRequestXm…
    2025-04-161
  • 代码不会停止运行,在 Java 中

    thecodedoesn'tstoprunning,inJava我正在用Java解决项目Euler中的问题10,即"Thesumoftheprimesbelow10is2+3+5+7=17.Findthesumofalltheprimesbelowtwomillion."我的代码是packageprojecteuler_1;importjava.math.BigInteger;importjava…
    2025-04-161
  • Out of memory java heap space

    Outofmemoryjavaheapspace我正在尝试将大量文件从服务器发送到多个客户端。当我尝试发送大小为700mb的文件时,它显示了"OutOfMemoryjavaheapspace"错误。我正在使用Netbeans7.1.2版本。我还在属性中尝试了VMoption。但仍然发生同样的错误。我认为阅读整个文件存在一些问题。下面的代码最多可用于300mb。请给我一些建议。提前致谢publicc…
    2025-04-161
  • Log4j 记录到共享日志文件

    Log4jLoggingtoaSharedLogFile有没有办法将log4j日志记录事件写入也被其他应用程序写入的日志文件。其他应用程序可以是非Java应用程序。有什么缺点?锁定问题?格式化?Log4j有一个SocketAppender,它将向服务发送事件,您可以自己实现或使用与Log4j捆绑的简单实现。它还支持syslogd和Windows事件日志,这对于尝试将日志输出与来自非Java应用程序…
    2025-04-161