VGG 参数分析 转

 

上面放了一个keras用vgg16训练测试的例子,我也试过用vgg16训练然后测试自己的例子,效果一般,这里我们来分析一下vgg16的网络结果

keras代码如下

[python]  view plain  copy
 
  1. def VGG_16(weights_path=None):  
  2.     model = Sequential()  
  3.     model.add(ZeroPadding2D((1,1),input_shape=(3,224,224)))#卷积输入层,指定了输入图像的大小  
  4.     model.add(Convolution2D(64, 3, 3, activation='relu'))#64个3x3的卷积核,生成64*224*224的图像,激活函数为relu  
  5.     model.add(ZeroPadding2D((1,1)))#补0,保证图像卷积后图像大小不变,其实用<span style="font-family:Consolas, 'Andale Mono WT', 'Andale Mono', 'Lucida Console', 'Lucida Sans Typewriter', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Liberation Mono', 'Nimbus Mono L', Monaco, 'Courier New', Courier, monospace;color:#333333;"><span style="font-size:10.8px;">padding = 'valid'参数就可以了</span></span>  
  6.     model.add(Convolution2D(64, 3, 3, activation='relu'))#再来一次卷积 生成64*224*224  
  7.     model.add(MaxPooling2D((2,2), strides=(2,2)))#pooling操作,相当于变成64*112*112  
  8.   
  9.     model.add(ZeroPadding2D((1,1)))  
  10.     model.add(Convolution2D(128, 3, 3, activation='relu'))  
  11.     model.add(ZeroPadding2D((1,1)))  
  12.     model.add(Convolution2D(128, 3, 3, activation='relu'))  
  13.     model.add(MaxPooling2D((2,2), strides=(2,2)))#128*56*56  
  14.   
  15.     model.add(ZeroPadding2D((1,1)))  
  16.     model.add(Convolution2D(256, 3, 3, activation='relu'))  
  17.     model.add(ZeroPadding2D((1,1)))  
  18.     model.add(Convolution2D(256, 3, 3, activation='relu'))  
  19.     model.add(ZeroPadding2D((1,1)))  
  20.     model.add(Convolution2D(256, 3, 3, activation='relu'))  
  21.     model.add(MaxPooling2D((2,2), strides=(2,2)))#256*28*28  
  22.   
  23.     model.add(ZeroPadding2D((1,1)))  
  24.     model.add(Convolution2D(512, 3, 3, activation='relu'))  
  25.     model.add(ZeroPadding2D((1,1)))  
  26.     model.add(Convolution2D(512, 3, 3, activation='relu'))  
  27.     model.add(ZeroPadding2D((1,1)))  
  28.     model.add(Convolution2D(512, 3, 3, activation='relu'))  
  29.     model.add(MaxPooling2D((2,2), strides=(2,2)))#512*14*14  
  30.   
  31.     model.add(ZeroPadding2D((1,1)))  
  32.     model.add(Convolution2D(512, 3, 3, activation='relu'))  
  33.     model.add(ZeroPadding2D((1,1)))  
  34.     model.add(Convolution2D(512, 3, 3, activation='relu'))  
  35.     model.add(ZeroPadding2D((1,1)))  
  36.     model.add(Convolution2D(512, 3, 3, activation='relu'))  
  37.     model.add(MaxPooling2D((2,2), strides=(2,2)))  #到这里已经变成了512*7*7  
  38.   
  39.     model.add(Flatten())#压平上述向量,变成一维25088  
  40.     model.add(Dense(4096, activation='relu'))#全连接层有4096个神经核,参数个数就是4096*25088  
  41.     model.add(Dropout(0.5))#0.5的概率抛弃一些连接  
  42.     model.add(Dense(4096, activation='relu'))#再来一个全连接  
  43.     model.add(Dropout(0.5))  
  44.     model.add(Dense(1000, activation='softmax'))  
  45.   
  46.     if weights_path:  
  47.         model.load_weights(weights_path)  
  48.   
  49.     return model  

vgg16详细信息

下面是详细的参数个数

[cpp]  view plain  copy
 M 代表1000*1000
  1. INPUT: [224x224x3]        memory:  224*224*3=150K   weights: 0  
  2. CONV3-64: [224x224x64]  memory:  224*224*64=3.2M   weights: (3*3*3)*64 = 1,728    3*3 代表卷积大小 *3 代表输入时3个通道 *64代表输出64个
  3. CONV3-64: [224x224x64]  memory:  224*224*64=3.2M   weights: (3*3*64)*64 = 36,864   同理3*3是卷积大小 *64代表输入64通道 *64代表输出是64通道
  4. POOL2: [112x112x64]  memory:  112*112*64=800K   weights: 0  
  5. CONV3-128: [112x112x128]  memory:  112*112*128=1.6M   weights: (3*3*64)*128 = 73,728  
  6. CONV3-128: [112x112x128]  memory:  112*112*128=1.6M   weights: (3*3*128)*128 = 147,456  
  7. POOL2: [56x56x128]  memory:  56*56*128=400K   weights: 0  
  8. CONV3-256: [56x56x256]  memory:  56*56*256=800K   weights: (3*3*128)*256 = 294,912  
  9. CONV3-256: [56x56x256]  memory:  56*56*256=800K   weights: (3*3*256)*256 = 589,824  
  10. CONV3-256: [56x56x256]  memory:  56*56*256=800K   weights: (3*3*256)*256 = 589,824  
  11. POOL2: [28x28x256]  memory:  28*28*256=200K   weights: 0  
  12. CONV3-512: [28x28x512]  memory:  28*28*512=400K   weights: (3*3*256)*512 = 1,179,648  
  13. CONV3-512: [28x28x512]  memory:  28*28*512=400K   weights: (3*3*512)*512 = 2,359,296  
  14. CONV3-512: [28x28x512]  memory:  28*28*512=400K   weights: (3*3*512)*512 = 2,359,296  
  15. POOL2: [14x14x512]  memory:  14*14*512=100K   weights: 0  
  16. CONV3-512: [14x14x512]  memory:  14*14*512=100K   weights: (3*3*512)*512 = 2,359,296  
  17. CONV3-512: [14x14x512]  memory:  14*14*512=100K   weights: (3*3*512)*512 = 2,359,296  
  18. CONV3-512: [14x14x512]  memory:  14*14*512=100K   weights: (3*3*512)*512 = 2,359,296  
  19. POOL2: [7x7x512]  memory:  7*7*512=25K  weights: 0  
  20. FC: [1x1x4096]  memory:  4096  weights: 7*7*512*4096 = 102,760,448  
  21. FC: [1x1x4096]  memory:  4096  weights: 4096*4096 = 16,777,216  
  22. FC: [1x1x1000]  memory:  1000 weights: 4096*1000 = 4,096,000  
  23.   
  24. TOTAL memory: 24M * 4 bytes ~= 93MB / image (only forward! ~*2 for bwd)  
  25. TOTAL params: 138M parameters  

猜你喜欢

转载自www.cnblogs.com/love6tao/p/9021325.html
VGG