训练一个全卷积网络,怎么做?

...........layer {
  name: "relu6"
  type: "ReLU"
  bottom: "conv6"
  top: "conv6"
}
layer {
  name: "conv7"
  type: "Convolution"
  bottom: "conv6"
  top: "conv7"
  convolution_param {
    num_output: 512
    pad: 1
    kernel_size: 3
  }
}
layer {
  name: "relu7"
  type: "ReLU"
  bottom: "conv7"
  top: "conv7"
}
layer {
  name: "accuracy"
  type: "Accuracy"
  bottom: "conv7"
  bottom: "label"
  top: "accuracy"
  include {
    phase: TEST
  }
}
layer {
  name: "loss"
  type: "SoftmaxWithLoss"
  bottom: "conv7"
  bottom: "label"
  top: "loss"
}
请问训练这种全卷积网络的时候,必须保证conv7层的输出个数与类别标签个数一致,并且conv7层的通道数为1,维度为1x1,对吗?不然无法训练?
 
已邀请:

星空下的巫师 - https://github.com/shicai/Caffe_Manual

赞同来自: alex68 HelloDL 起个名字好费事 bhj52099 bonerkiller CrazyVertigo Huaijin更多 »

在训练分类的全卷积网络的时候,因为标签是单个数字,通常需要在某一步将Feature Map输出变成1x1的。
这一步可以是通过卷积,卷积核的长宽需要事先计算好,也可以通过Global Average Pooling一步到位。
然后接1x1的Conv层来进行分类,卷积核数量与类别的数量相同。
PS:FC层其实是1x1的卷积,所以接FC层也是一样的,不过使用分辨率不一样的图像的时候进行测试需要将FC层转为Conv的格式,略麻烦一些。
 
最常用的做法如下:
 
layer {
name: "pool5"
type: "Pooling"
bottom: "conv5_3"
top: "pool5"
pooling_param {
pool: AVE
global_pooling: true
}
}
layer {
name: "fc6"
type: "Convolution"
bottom: "pool5"
top: "fc6"
param {
lr_mult: 1
decay_mult: 1
}
param {
lr_mult: 2
decay_mult: 0
}
convolution_param {
num_output: 1000
kernel_size: 1
weight_filler {
type: "xavier"
}
bias_filler {
type: "constant"
}
}
}
layer {
name: "loss"
top: "loss"
type: "SoftmaxWithLoss"
bottom: "fc6"
bottom: "label"
}

要回复问题请先登录注册