【深度学习】Pytorch实现VGG16

导入所需库,定义数据

import torch
from torch import nn

定义网络框架

class VGG16(nn.Module):
    def __init__(self):
        super().__init__()

        self.features_=nn.Sequential(
            nn.Conv2d(3,64,3,padding=1),nn.ReLU(inplace=True)
            ,nn.Conv2d(64,64,3,padding=1),nn.ReLU(inplace=True)
            ,nn.MaxPool2d(2)

            ,nn.Conv2d(64,128,3,padding=1),nn.ReLU(inplace=True)
            ,nn.Conv2d(128,128,3,padding=1),nn.ReLU(inplace=True)
            ,nn.MaxPool2d(2)

            ,nn.Conv2d(128,256,3,padding=1),nn.ReLU(inplace=True)
            ,nn.Conv2d(256,256,3,padding=1),nn.ReLU(inplace=True)
            ,nn.Conv2d(256,256,3,padding=1),nn.ReLU(inplace=True)
            ,nn.MaxPool2d(2)            
            
            ,nn.Conv2d(256,512,3,padding=1),nn.ReLU(inplace=True)
            ,nn.Conv2d(512,512,3,padding=1),nn.ReLU(inplace=True)
            ,nn.Conv2d(512,512,3,padding=1),nn.ReLU(inplace=True)
            ,nn.MaxPool2d(2)

            ,nn.Conv2d(512,512,3,padding=1),nn.ReLU(inplace=True)
            ,nn.Conv2d(512,512,3,padding=1),nn.ReLU(inplace=True)
            ,nn.Conv2d(512,512,3,padding=1),nn.ReLU(inplace=True)
            ,nn.MaxPool2d(2)
        )

        self.clf_=nn.Sequential(nn.Dropout(0.5)
            ,nn.Linear(512*7*7,4096),nn.ReLU(inplace=True)
            ,nn.Dropout(0.5)
            ,nn.Linear(4096,4096),nn.ReLU(inplace=True)
            ,nn.Linear(4096,1000),nn.Softmax(dim=1)
        )
    
    def forward(self,x):
        x=self.features_(x)
        x=x.view(-1,512*7*7)
        output=self.clf_(x)
        return output

注意第一个全连接层的输入参数的大小为前一层的特征图通道数*特征图长*特征图宽,这个值会因为输入图片的大小变化而改变,可通过如下代码计算得到

net=nn.Sequential(
            nn.Conv2d(3,64,3,padding=1),nn.ReLU(inplace=True)
            ,nn.Conv2d(64,64,3,padding=1),nn.ReLU(inplace=True)
            ,nn.MaxPool2d(2)

            ,nn.Conv2d(64,128,3,padding=1),nn.ReLU(inplace=True)
            ,nn.Conv2d(128,128,3,padding=1),nn.ReLU(inplace=True)
            ,nn.MaxPool2d(2)

            ,nn.Conv2d(128,256,3,padding=1),nn.ReLU(inplace=True)
            ,nn.Conv2d(256,256,3,padding=1),nn.ReLU(inplace=True)
            ,nn.Conv2d(256,256,3,padding=1),nn.ReLU(inplace=True)
            ,nn.MaxPool2d(2)            
            
            ,nn.Conv2d(256,512,3,padding=1),nn.ReLU(inplace=True)
            ,nn.Conv2d(512,512,3,padding=1),nn.ReLU(inplace=True)
            ,nn.Conv2d(512,512,3,padding=1),nn.ReLU(inplace=True)
            ,nn.MaxPool2d(2)

            ,nn.Conv2d(512,512,3,padding=1),nn.ReLU(inplace=True)
            ,nn.Conv2d(512,512,3,padding=1),nn.ReLU(inplace=True)
            ,nn.Conv2d(512,512,3,padding=1),nn.ReLU(inplace=True)
            ,nn.MaxPool2d(2)
        )

data=torch.ones(size=(10,3,224,224))
net(data).shape

运行结果如下,可见通道数为512,特征图大小为7*7

实例化模型并通过summary查看模型架构

from torchinfo import summary
vgg=VGG16()
summary(vgg,input_size=(10,3,224,224))

 

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值