复现VGG(keras and pytorch)

本文介绍了VGG16模型,包括其网络结构和在深度学习中的作用。通过Keras和PyTorch分别复现VGG16的代码,强调了Keras中ImageDataGenerator在数据读取和增强中的应用。
摘要由CSDN通过智能技术生成


前言

VGG 系列模型是十分优秀的模型,现在很多网络中都还能看见它的身影。本文重新整理了一下VGG16 Keras 版本的复现代码。用迁移学习的方式去加载权重,然后训练模型。

一、VGGNet

1.简介

随着深度学习的不断发展,加深的网络开始不断的出现了,VGGNet 验证了卷积网络的加深,的确能够提升网络的性能,但计算量也随之增大了。VGGNet 在2014年ILSVRC得到挑战赛中赢得了定位任务的冠军和分类任务的亚军。VGGNet的思想就是采用2个3x3的卷积核代替了5x5的卷积核,网络的结构也从传统的卷积池化相连,变成了多层卷积后再跟池化相连。有两种基本类型的VGGNet 就是我们常用的VGG16 和VGG19.

2. 网络结构

神经网络,通常都是上图比较直接。
在这里插入图片描述

  • A模型: 拥有八个卷积层(卷积核核大小均为3×3),5个最大池化和3个全连接层。
  • A-LRN模型:卷积核核大小均为3×3,与A模型几乎完全相同,唯一的区别就是第一个卷积后加入了LRN(局部响应归一化层,在前面的文章AlexNet中提出)。但是通过实验证明LRN不仅会增加计算时候和内存消耗,对网络性能,并没有很大的提升。所以在后续的网络中都取消了。
  • B模型:拥有10个卷积层(核大小均为3×3)、 5个最大池化层和3个全连接层。
  • C模型:拥有13个卷积层(10个核大小为3×3, 3个核大小为1×1)、 5个最大池 化层和 3 个全连接层。
  • D模型:拥有13个卷积层(核大小均为3×3)、 5个最大池化层和3个全连接层。
  • E模型:拥有16个卷积层(核大小均为3×3)、 5个最大池化层和3个全连接层。
    D,E模型就是我们常说的VGG16和VGG19啦!!!!

2.Keras复现

Keras的复现就相对比较简单了,卷积池化的不断堆叠。但再这里我重点去介绍的是Keras中的ImageDataGenerator,它可以批量读取数据,并进行数据增强,不用一次把数据读入内存中。也是防止内存溢出的方法。参数含义再代码里都有注解,这里不再赘述。
先看一下VGG16的详细结构。
在这里插入图片描述
keras 中自带VGG16的结构 我们可以通过下面的操作方式来下载预训练权重:

from keras.applications.vgg16 import VGG16
moded2 = VGG16(weights='imagenet',include_top=True)
提示下载后的权重默认存放在 C:\Users\username\.keras\models目录下

首先先来定义VGG16的具体结构,并且加载与训练权重:

from keras import layers
from keras.layers import (Activation, AveragePooling2D,
                                     BatchNormalization, Conv2D, Dense,
                                     Flatten, Input, MaxPooling2D,
                                     ZeroPadding2D)
from keras.models import Model


def vgg16(conv_arch,input_shape=(224,224,3),classes=1000):
    #------------------------------------------------------------
    # conv_arch = ((2, 64), (2, 128), (3, 256), (3, 512), (3, 512)) 
    # 第一个数字表示重复次数,第二个数字表示卷积核的个数
    # input_shape # 输入图片的大小
    #  classes   # 分类数
    # ----------------------------------------------------------
    inputs = Input(shape=input_shape)

    x = inputs

    for (num_convs,num_filter) in conv_arch:
        for _ in range(num_convs):
            x = Conv2D(num_filter,kernel_size=3,padding='same',activation='relu')(x)
        
        x=MaxPooling2D(pool_size=(2, 2), strides=2)(x)

    x = Flatten(name='flatten')(x)
    x = Dense(4096, activation='relu', name='fc1'
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

__不想写代码__

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值