机器学习入门(四):关于卷积运算量和参数数量的计算

卷积层的运算量公式

num(MAC)=I*J*M*N*K*L

I J 为卷积核大小

M N为卷积之后输出特征的大小

K表示输入通道个数

L表示输出通道个数(这里的通道数可以理解为单样本特征图的个数)

以lenet中的参数为示例:

layer {
  name: "conv1"
  type: "Convolution"
  bottom: "data"
  top: "conv1"
  param {
    lr_mult: 1
  }
  param {
    lr_mult: 2
  }
  convolution_param {
    num_output: 20
    kernel_size: 5
    stride: 1
    weight_filler {
      type: "xavier"
    }
    bias_filler {
      type: "constant"
    }
  }
}
layer {
  name: "pool1"
  type: "Pooling"
  bottom: "conv1"
  top: "pool1"
  pooling_param {
    pool: MAX
    kernel_size: 2
    stride: 2
  }
}
layer {
  name: "conv2"
  type: "Convolution"
  bottom: "pool1"
  top: "conv2"
  param {
    lr_mult: 1
  }
  param {
    lr_mult: 2
  }
  convolution_param {
    num_output: 50
    kernel_size: 5
    stride: 1
    weight_filler {
      type: "xavier"
    }
    bias_filler {
      type: "constant"
    }
  }
}
输出通道数为50,对应公式中的L,卷积核尺寸为5,对应I和J,conv1层经过池化之后通道数应该不变,还是20,所以K为20,输出特征图的大小如何确定?1是查看之前的层,根据网络描述文件一步步的计算得到,2是查看训练的日志文件,在setup conv2层之后,会输出这一层的blob shape,第一维为batchsize,第二维为通道数,第三维第四维代表输入特征图大小M和N,因为这里计算的是单样本的运算量,所以和batchsize没有关系。

此时,MAC=5*5*8*8*50*20.

注意:输入通道数为K,输出通道数为L,那么卷积核个数为K*L。因为高维卷积计算是多个通道与多个卷积核分别进行二维计算,所以K个通道会需要K个卷积核,计算之后,合并也就是相加得到一个通道,又因为输出通道为L,所以需要K*L个卷积核。

然后就是如何求解参数数量?

其实很简单,就是卷积核个数乘以卷积核尺寸,para=I*J*K*L。

同理可以计算全连接。



你可能感兴趣的:(Caffe)