1. 程式人生 > >caffe源碼 卷積層

caffe源碼 卷積層

擴展 .com 反向 梯度 分享 傳遞 pad lin note

通俗易懂理解卷積

  • 圖示理解神經網絡的卷積
    • input: 3 * 5 * 5 (c * h * w)
    • pading: 1
    • 步長: 2
    • 卷積核: 2 * 3 * 3 * 3 ( n * c * k * k )
    • output: 2 * 3 * 3 ( c * h * w )

如下圖所示: 技術分享

深入理解卷積

  • 首先需要理解caffe裏面的im2col和col2im
  • 然後 卷積層 其實和 全連接層 差不多了

理解im2col

  • 圖示理解im2col
    • input: 3 * 4 * 4 ( c * h * w )
    • 卷積核: 3 * 3 * 3 ( c * h * w )
    • output: ( 3 * 3 * ) * ( 2 * 2 ) ( h * w )

如下圖所示: 技術分享

卷積層的實現

im2col轉換前
  • input: 1 * c * h * w
  • 卷積核: m * c * k * k
    • m 個卷積核
  • 步長: stride
  • 填充: pad
  • 擴展: dilation
  • output: 1 * m * H * W
    • H = ( h + 2 * pad - dilation * ( k - 1 ) ) / stride + 1
    • W = ( w + 2 * pad - dilation * ( k - 1 ) ) / stride + 1

im2col轉換後
  • input: 1 * ( c * k * k ) * ( H * W )

  • weight: m * (c * k * k)

  • bias: m * 1

  • output: 1 * m * H * W

  • 則公式(即前向傳播)為:output = input * weight + bias * 全1矩陣 ( 1 * H * W )

  • 反向傳播和全連接層一樣(詳細參考全連接層的推導):

    • 梯度傳遞:bottom_diff = top_diff * weight
    • 對w求導:weight_diff = top_diff * bottom + weight_diff(累積梯度)
    • 對b求導:bias_diff = top_diff + bias_diff(累積梯度)

caffe源碼 卷積層