說明

這個是使用PaddlePaddle訓練cifar10數據集的一個例子

問題1:網絡結構

問題:計算每層網絡結構和輸入輸出尺寸和參數個數。不加BN?更深?每層的尺寸變化?更多結構?

def convolutional_neural_network(img):
    print('輸入層的shape:', img.shape)
    conv_pool_1 = fluid.nets.simple_img_conv_pool(
        input=img,
        filter_size=5,
        num_filters=20,
        pool_size=2,
        pool_stride=2,
        act="relu")
    print('第一層卷積池化層輸出shape:', conv_pool_1.shape)
    conv_pool_1 = fluid.layers.batch_norm(conv_pool_1)
    conv_pool_2 = fluid.nets.simple_img_conv_pool(
        input=conv_pool_1,
        filter_size=5,
        num_filters=50,
        pool_size=2,
        pool_stride=2,
        act="relu")
    print('第二層卷積池化層輸出shape:', conv_pool_2.shape)
    conv_pool_2 = fluid.layers.batch_norm(conv_pool_2)
    conv_pool_3 = fluid.nets.simple_img_conv_pool(
        input=conv_pool_2,
        filter_size=5,
        num_filters=50,
        pool_size=2,
        pool_stride=2,
        act="relu")
    print('第三層卷積池化層輸出shape:', conv_pool_3.shape)
    prediction = fluid.layers.fc(input=conv_pool_3, size=10, act='softmax')
    print('全連接層輸出shape:', prediction.shape)
    return prediction

卷積層輸出計算公式:

  • 輸入shape:\((N,C_{in},H_{in},W_{in})\)
  • 卷積核shape:\((C_{out},C_{in},H_f,W_f)\)

\(H_{out}=\frac{(H_{in}+2*padding-(dilation*(H_f-1)+1))}{stride}+1\)

\(W_{out}=\frac{(W_{in}+2*padding-(dilation*(W_f-1)+1))}{stride}+1\)

  • 輸出shape:\((N,C_{out},H_{out},W_{out})\)

池化層輸出計算公式:

  • 輸入shape:\((N,C,H_{in},W_{in})\)
  • 池化shape:\((1,1,ksize,ksize)\)

\(H_{out}=\frac{H_{in}-ksize}{stride}+1\)

\(W_{out}=\frac{W_{in}-ksize}{stride}+1\)

  • 輸出shape:\((N,C,H_{out},W_{out})\)

參數大小計算公式:

\(psize=C_{out}*C_{in}*ksize*ksize\)

答1: 本網絡的的輸入數據的shape爲(128, 3, 32, 32),所以輸出如下:

  • 第一層的卷積層輸出shape:(128, 20, 28, 28),參數大小爲:\(20*3*5*5=1500\)
  • 第一層的池化層輸出shape:(128, 20, 14, 14)
  • 第二層的卷積層輸出shape:(128, 50, 10, 10),參數大小爲:\(50*20*5*5=25000\)
  • 第二層的池化層輸出shape:(128, 50, 5, 5)
  • 第三層的卷積層輸出shape:(128, 50, 1, 1),參數大小爲:\(50*50*5*5=62500\)
  • 第三層的池化層輸出shape:(128, 50, 1, 1)
  • 最後的全連接層輸出shape:(128, 10),參數大小爲:\(50*10=500\)
  • 總參數大小:\(1500+25000+62500+500=89500\)

PaddlePaddle的網絡輸出

輸入層的shape: (-1, 3, 32, 32)
第一層卷積池化層輸出shape: (-1, 20, 14, 14)
第二層卷積池化層輸出shape: (-1, 50, 5, 5)
第三層卷積池化層輸出shape: (-1, 50, 1, 1)
全連接層輸出shape: (-1, 10)

答2:
在沒有使用BN層之前:

  • 參數的更新,使得每層的輸入輸出分佈發生變化,稱作ICS(Internal Covariate Shift)
  • 差異hui會隨着網絡深度增大而增大
  • 需要更小的學習率和較好的參數進行初始化

加入了BN層之後:

  • 可以使用較大的學習率
  • 可以減少對參數初始化的依賴
  • 可以擬製梯度的彌散
  • 可以起到正則化的作用
  • 可以加速模型收斂速度

用BN層的訓練情況:

不使用BN層的訓練情況:

從圖中可以看出使用BN層的準確率更高,訓練過程中損失值和準確率的幅度更加小。

答3: 因爲該網絡的第三層卷積池化層輸出的寬和高都是1,所以不能再增加捲積池化層,如果再使用卷積池化層,就會報以下的錯誤。

EnforceNotMet: Due to the settings of padding(0), filter_size(5), dilation(1) and stride(1), the output size is less than 0, please check again. Input_size:1
小夜