PaddlePaddle 飞桨复现 VGG16

Posted 龙火火的博客

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PaddlePaddle 飞桨复现 VGG16相关的知识,希望对你有一定的参考价值。

import paddle.nn as nn
class VGG16(nn.Layer):
    def __init__(self, num_classes=1000):
        super(VGG16, self).__init__()
        self.layer1 = nn.Sequential(
            nn.Conv2D(3, 64, kernel_size=3, stride=1, padding=1),
            nn.BatchNorm2D(64),
            nn.ReLU(),
        )
        self.layer2 = nn.Sequential(
            nn.Conv2D(64, 64, kernel_size=3, stride=1, padding=1),
            nn.BatchNorm2D(64),
            nn.ReLU(),
            nn.MaxPool2D(kernel_size=2, stride=2)
        )

        self.layer3 = nn.Sequential(
            nn.Conv2D(64, 128, kernel_size=3, stride=1, padding=1),
            nn.BatchNorm2D(128),
            nn.ReLU(),
        )
        self.layer4 = nn.Sequential(
            nn.Conv2D(128, 128, kernel_size=3, stride=1, padding=1),
            nn.BatchNorm2D(128),
            nn.ReLU(),
            nn.MaxPool2D(kernel_size=2, stride=2)
        )

        self.layer5 = nn.Sequential(
            nn.Conv2D(128, 256, kernel_size=3, stride=1, padding=1),
            nn.BatchNorm2D(256),
            nn.ReLU(),
        )
        self.layer6 = nn.Sequential(
            nn.Conv2D(256, 256, kernel_size=3, stride=1, padding=1),
            nn.BatchNorm2D(256),
            nn.ReLU(),
            nn.MaxPool2D(kernel_size=2, stride=2)
        )
        self.layer7 = nn.Sequential(
            nn.Conv2D(256, 512, kernel_size=3, stride=1, padding=1),
            nn.BatchNorm2D(512),
            nn.ReLU(),
        )
        self.layer8 = nn.Sequential(
            nn.Conv2D(512, 512, kernel_size=3, stride=1, padding=1),
            nn.BatchNorm2D(512),
            nn.ReLU(),
            nn.MaxPool2D(kernel_size=2, stride=2)
        )

        self.layer9 = nn.Sequential(
            nn.Conv2D(512, 512, kernel_size=3, stride=1, padding=1),
            nn.BatchNorm2D(512),
            nn.ReLU(),
        )
        self.layer10 = nn.Sequential(
            nn.Conv2D(512, 512, kernel_size=3, stride=1, padding=1),
            nn.BatchNorm2D(512),
            nn.ReLU(),
            nn.MaxPool2D(kernel_size=2, stride=2)
        )

        self.layer11 = nn.Sequential(
            nn.Conv2D(512, 512, kernel_size=3, stride=1, padding=1),
            nn.BatchNorm2D(512),
            nn.ReLU(),
        )
        self.layer12 = nn.Sequential(
            nn.Conv2D(512, 512, kernel_size=3, stride=1, padding=1),
            nn.BatchNorm2D(512),
            nn.ReLU(),
        )
        self.layer13 = nn.Sequential(
            nn.Conv2D(512, 512, kernel_size=3, stride=1, padding=1),
            nn.BatchNorm2D(512),
            nn.ReLU(),
            nn.MaxPool2D(kernel_size=2, stride=2)
        )

        self.fc = nn.Sequential(
            nn.Dropout(0.5),
            nn.Linear(4*4*512, 4096),
            nn.ReLU())
        self.fc1 = nn.Sequential(
            nn.Dropout(0.5),
            nn.Linear(4096, 512),
            nn.ReLU())
        self.fc2= nn.Sequential(
            nn.Linear(512, num_classes))
      
    def forward(self, x):
        out = self.layer1(x)
        out = self.layer2(out)
        out = self.layer3(out)
        out = self.layer4(out)
        out = self.layer5(out)
        out = self.layer6(out)
        out = self.layer7(out)
        out = self.layer8(out)
        out = self.layer9(out)
        out = self.layer10(out)
        out = self.layer11(out)
        out = self.layer12(out)
        out = self.layer13(out)
        out = paddle.reshape(out, [out.shape[0],-1])
        out = self.fc(out)
        out = self.fc1(out)
        out = self.fc2(out)
        return out

paddle.Model(VGG16(num_classes=2)).summary((-1,3,256,256))
W0505 00:38:12.705672 18379 device_context.cc:447] Please NOTE: device: 0, GPU Compute Capability: 7.0, Driver API Version: 11.2, Runtime API Version: 10.1
W0505 00:38:12.711607 18379 device_context.cc:465] device: 0, cuDNN Version: 7.6.
---------------------------------------------------------------------------
 Layer (type)       Input Shape          Output Shape         Param #  
===========================================================================
   Conv2D-1      [[1, 3, 256, 256]]   [1, 64, 256, 256]        1,792   
 BatchNorm2D-1  [[1, 64, 256, 256]]   [1, 64, 256, 256]         256    
    ReLU-1      [[1, 64, 256, 256]]   [1, 64, 256, 256]          0     
   Conv2D-2     [[1, 64, 256, 256]]   [1, 64, 256, 256]       36,928   
 BatchNorm2D-2  [[1, 64, 256, 256]]   [1, 64, 256, 256]         256    
    ReLU-2      [[1, 64, 256, 256]]   [1, 64, 256, 256]          0     
  MaxPool2D-1   [[1, 64, 256, 256]]   [1, 64, 128, 128]          0     
   Conv2D-3     [[1, 64, 128, 128]]   [1, 128, 128, 128]      73,856   
 BatchNorm2D-3  [[1, 128, 128, 128]]  [1, 128, 128, 128]        512    
    ReLU-3      [[1, 128, 128, 128]]  [1, 128, 128, 128]         0     
   Conv2D-4     [[1, 128, 128, 128]]  [1, 128, 128, 128]      147,584  
 BatchNorm2D-4  [[1, 128, 128, 128]]  [1, 128, 128, 128]        512    
    ReLU-4      [[1, 128, 128, 128]]  [1, 128, 128, 128]         0     
  MaxPool2D-2   [[1, 128, 128, 128]]   [1, 128, 64, 64]          0     
   Conv2D-5      [[1, 128, 64, 64]]    [1, 256, 64, 64]       295,168  
 BatchNorm2D-5   [[1, 256, 64, 64]]    [1, 256, 64, 64]        1,024   
    ReLU-5       [[1, 256, 64, 64]]    [1, 256, 64, 64]          0     
   Conv2D-6      [[1, 256, 64, 64]]    [1, 256, 64, 64]       590,080  
 BatchNorm2D-6   [[1, 256, 64, 64]]    [1, 256, 64, 64]        1,024   
    ReLU-6       [[1, 256, 64, 64]]    [1, 256, 64, 64]          0     
  MaxPool2D-3    [[1, 256, 64, 64]]    [1, 256, 32, 32]          0     
   Conv2D-7      [[1, 256, 32, 32]]    [1, 512, 32, 32]      1,180,160   
 BatchNorm2D-7   [[1, 512, 32, 32]]    [1, 512, 32, 32]        2,048   
    ReLU-7       [[1, 512, 32, 32]]    [1, 512, 32, 32]          0     
   Conv2D-8      [[1, 512, 32, 32]]    [1, 512, 32, 32]      2,359,808   
 BatchNorm2D-8   [[1, 512, 32, 32]]    [1, 512, 32, 32]        2,048   
    ReLU-8       [[1, 512, 32, 32]]    [1, 512, 32, 32]          0     
  MaxPool2D-4    [[1, 512, 32, 32]]    [1, 512, 16, 16]          0     
   Conv2D-9      [[1, 512, 16, 16]]    [1, 512, 16, 16]      2,359,808   
 BatchNorm2D-9   [[1, 512, 16, 16]]    [1, 512, 16, 16]        2,048   
    ReLU-9       [[1, 512, 16, 16]]    [1, 512, 16, 16]          0     
   Conv2D-10     [[1, 512, 16, 16]]    [1, 512, 16, 16]      2,359,808   
BatchNorm2D-10   [[1, 512, 16, 16]]    [1, 512, 16, 16]        2,048   
    ReLU-10      [[1, 512, 16, 16]]    [1, 512, 16, 16]          0     
  MaxPool2D-5    [[1, 512, 16, 16]]     [1, 512, 8, 8]           0     
   Conv2D-11      [[1, 512, 8, 8]]      [1, 512, 8, 8]       2,359,808   
BatchNorm2D-11    [[1, 512, 8, 8]]      [1, 512, 8, 8]         2,048   
    ReLU-11       [[1, 512, 8, 8]]      [1, 512, 8, 8]           0     
   Conv2D-12      [[1, 512, 8, 8]]      [1, 512, 8, 8]       2,359,808   
BatchNorm2D-12    [[1, 512, 8, 8]]      [1, 512, 8, 8]         2,048   
    ReLU-12       [[1, 512, 8, 8]]      [1, 512, 8, 8]           0     
   Conv2D-13      [[1, 512, 8, 8]]      [1, 512, 8, 8]       2,359,808   
BatchNorm2D-13    [[1, 512, 8, 8]]      [1, 512, 8, 8]         2,048   
    ReLU-13       [[1, 512, 8, 8]]      [1, 512, 8, 8]           0     
  MaxPool2D-6     [[1, 512, 8, 8]]      [1, 512, 4, 4]           0     
   Dropout-1        [[1, 8192]]           [1, 8192]              0     
   Linear-1         [[1, 8192]]           [1, 4096]         33,558,528   
    ReLU-14         [[1, 4096]]           [1, 4096]              0     
   Dropout-2        [[1, 4096]]           [1, 4096]              0     
   Linear-2         [[1, 4096]]            [1, 512]          2,097,664   
    ReLU-15          [[1, 512]]            [1, 512]              0     
   Linear-3          [[1, 512]]             [1, 2]             1,026   
===========================================================================
Total params: 52,159,554
Trainable params: 52,141,634
Non-trainable params: 17,920
---------------------------------------------------------------------------
Input size (MB): 0.75
Forward/backward pass size (MB): 383.73
Params size (MB): 198.97
Estimated Total Size (MB): 583.45
---------------------------------------------------------------------------

\'total_params\': 52159554, \'trainable_params\': 52141634

学习PaddlePaddle(飞桨)是正确的选择

学习PaddlePaddle(飞桨)是正确的选择

深耕PaddlePaddle,非常高兴和大家一起学习PaddlePaddle。

为什么要学习飞桨?

在开始分享之前,我想先简单聊聊——为什么要学习飞桨。之所以说简单聊聊,是我准备在学习飞桨满一周年的时候再详细分享一下(这里算是做一个预告)。

我们学习什么总要有点目的。比如今年三十岁的我就想做一件让自己觉得很酷的事,所以我学习了滑板,学习了滑板相关的知识,看了相关的影片等等。让我得瑟一下。

学习技术也是如此。比如:

为什么学习Python?

  • 人生苦短,我学Python。
  • 小学生都开始学Python了。

为什么学PHP?

  • PHP是世界上最好的语言。

等等……

为什么学飞桨?

  • 使用过小度在家,震惊到了我
  • 中文文档
  • 国产开源,值得信赖

最重要的一点,学会了可以显得我非常厉害(真相了)。

怎么开始学飞桨?

官方文档

学习飞桨最好的资料就是飞桨官方文档。官方文档有新手入门、使用指南、进阶使用、API Reference、环境变量FLAGS、FAQ,你可以根据自己的学习情况有选择的学习。在新手入门——深度学习基础教程中提供了九个案例,通过案例可以让你更深入的理解文档中讲到的知识点。同时文档还提供了中文和英文两个版本。

共同学习

对于初学者来说,看官方文档的直接感受就是“文档写的好,就是看不懂”。有这样的感受也纯属正常,毕竟官方文档用语比较严(hui)谨(se)。学习过程中遇到问题(绝对不是什么问题都要问),最好的办法就是得到“高人”指点。但是不是每个人身边都有这样一位“高人”,主动加入一些相关的学习群也是非常有必要的。这里强调一下,非常高兴可以和大家一起学习飞桨。

理论知识

飞桨说白了也是一个深度学习框架工具,如果没有飞桨,也可以去学习Tensorflow、PyTorch、Caffe等众多优秀的框架。但是想要随心所欲的使用这些框架,就需要有一定的机器学习理论知识。在2018年我刚转向人工智能方向的时候,还没有系统的学习机器学习理论知识,比如测试机、训练集、学习率、优化器、评价等内容(统计学专业,多少有点基础)。意气风发的我就一上来就想要把tensorflow学好,结果就是可以学会框架怎么用,但是永远不知道为什么要这样用。迷途知返的我又花了一年的时间学习理论知识。

写在最后

学习飞桨是我给我自己的一个五年计划——深耕PaddlePaddle。从理论开始,再到现在调试案例的渐入佳境,期待接下来可以将飞桨在应用到工作中去,解决更多的实际问题。

关注公众号,加群:


以上是关于PaddlePaddle 飞桨复现 VGG16的主要内容,如果未能解决你的问题,请参考以下文章

PaddlePaddle 飞桨复现 ResNet34

ResNet

VGG-16复现

视频分类最新高效算法,PaddlePaddle-NeXtVLAD初体验

利用PaddlePaddle预测波士顿房价

学习PaddlePaddle(飞桨)是正确的选择