CNN-VGG16

article/2025/8/30 4:02:56

一张图片如何作为输入?

如下图,彩色图像有RGB三个色值通道,分别表示红、绿、蓝,每个通道内的像素可以用一个二维数组表示,数值代表0-255之间的像素值。假设一张900*600的彩色的图片,计算机里面可以用  (900*600*3)的数组表示。

什么是卷积

卷积过程是基于一个小矩阵,也就是卷积核,在上面所说的每层像素矩阵上不断按步长扫过去的,扫到数与卷积核对应位置的数相乘,然后求总和,每扫一次,得到一个值,全部扫完则生成一个新的矩阵。如下图

一般取(3,3)的小矩阵,卷积核里面每个值就是我们需要寻找(训练)的神经元参数(权重),开始会随机有个初始值,当训练网络时,网络会通过后向传播不断更新这些参数值,直到寻找到最佳的参数值。如何知道是“最佳”?是通过损失函数去评估。

卷积核的步长是指卷积核每次移动几个格子,有横行和纵向两个方向。

卷积操作相当于特征提取,卷积核相当于一个过滤器,提取我们需要的特征。

如下图,左边小红色框是卷积核,从左上角扫到右下角,最终得到右边的特征图谱。

 

什么是Padding(填充)

卷积操作之后维度变少,得到的矩阵比原来矩阵小,这样不好计算,而我们只是希望作卷积,所以我们需要Padding,在每次卷积操作之前,在原矩阵外边补包一层0,可以只在横向补,或只在纵向补,或者四周都补0,从而使得卷积后输出的图像跟输入图像在尺寸上一致。

比如:我们需要做一个300*300的原始矩阵的卷积,用一个3*3卷积核来扫,扫出来结果的矩阵应该是:298*298的矩阵,变小了。

卷积前加Padding 操作补一圈0,即300*300矩阵外面周围加一圈“0”,这样的300*300就变成了302*302的矩阵,再进行卷积出来就是300*300 ,尺寸和原图一样。

什么是池化(pooling)

 

卷积操作后我们提取了很多特征信息,相邻区域有相似特征信息,可以相互替代的,如果全部保留这些特征信息就会有信息冗余,增加了计算难度,这时候池化就相当于降维操作。池化是在一个小矩阵区域内,取该区域的最大值或平均值来代替该区域,该小矩阵的大小可以在搭建网络的时候自己设置。小矩阵也是从左上角扫到右下角。如下图

 

什么是Flatten

Flatten 是指将多维的矩阵拉开,变成一维向量来表示。

什么是全连接层

对n-1层和n层而言,n-1层的任意一个节点,都和第n层所有节点有连接。即第n层的每个节点在进行计算的时候,激活函数的输入是n-1层所有节点的加权。

 

什么是Dropout

dropout是指在网络的训练过程中,按照一定的概率将网络中的神经元丢弃,这样有效防止过拟合。

 

 

从左至右,一张彩色图片输入到网络,白色框是卷积层,红色是池化,蓝色是全连接层,棕色框是预测层。预测层的作用是将全连接层输出的信息转化为相应的类别概率,而起到分类作用。

可以看到 VGG16 是13个卷积层+3个全连接层叠加而成。

from keras.models import Sequential
from keras.layers.core import Flatten, Dense, Dropout
from keras.layers.convolutional import Convolution2D, MaxPooling2D, ZeroPadding2D
from keras.optimizers import SGD
import cv2, numpy as np#使用keras建立vgg16模型
def VGG_16(weights_path=None):model = Sequential()model.add(ZeroPadding2D((1,1),input_shape=(3,224,224)))model.add(Convolution2D(64, 3, 3, activation='relu'))model.add(ZeroPadding2D((1,1)))model.add(Convolution2D(64, 3, 3, activation='relu'))model.add(MaxPooling2D((2,2), strides=(2,2)))model.add(ZeroPadding2D((1,1)))model.add(Convolution2D(128, 3, 3, activation='relu'))model.add(ZeroPadding2D((1,1)))model.add(Convolution2D(128, 3, 3, activation='relu'))model.add(MaxPooling2D((2,2), strides=(2,2)))model.add(ZeroPadding2D((1,1)))model.add(Convolution2D(256, 3, 3, activation='relu'))model.add(ZeroPadding2D((1,1)))model.add(Convolution2D(256, 3, 3, activation='relu'))model.add(ZeroPadding2D((1,1)))model.add(Convolution2D(256, 3, 3, activation='relu'))model.add(MaxPooling2D((2,2), strides=(2,2)))model.add(ZeroPadding2D((1,1)))model.add(Convolution2D(512, 3, 3, activation='relu'))model.add(ZeroPadding2D((1,1)))model.add(Convolution2D(512, 3, 3, activation='relu'))model.add(ZeroPadding2D((1,1)))model.add(Convolution2D(512, 3, 3, activation='relu'))model.add(MaxPooling2D((2,2), strides=(2,2)))model.add(ZeroPadding2D((1,1)))model.add(Convolution2D(512, 3, 3, activation='relu'))model.add(ZeroPadding2D((1,1)))model.add(Convolution2D(512, 3, 3, activation='relu'))model.add(ZeroPadding2D((1,1)))model.add(Convolution2D(512, 3, 3, activation='relu'))model.add(MaxPooling2D((2,2), strides=(2,2)))model.add(Flatten())model.add(Dense(4096, activation='relu'))model.add(Dropout(0.5))model.add(Dense(4096, activation='relu'))model.add(Dropout(0.5))model.add(Dense(1000, activation='softmax'))if weights_path:model.load_weights(weights_path)return modelmodel = VGG_16('vgg16_weights.h5')sgd = SGD(lr=0.1, decay=1e-6, momentum=0.9, nesterov=True)
model.compile(optimizer=sgd, loss='categorical_crossentropy')#开始来预测
def load_image(imageurl):im = cv2.resize(cv2.imread(imageurl),(224,224)).astype(np.float32)im[:,:,0] -= 103.939im[:,:,1] -= 116.779im[:,:,2] -= 123.68im = im.transpose((2,0,1))im = np.expand_dims(im,axis=0)return im#读取vgg16的类别文件
f = open('synset_words.txt','r')
lines = f.readlines()
f.close()def predict(url):im = load_image(url)pre = np.argmax(model.predict(im))print lines[pre]

 

 

详细解释一下代码

网络开始输入(3,224,224)的图像数据,即一张宽224,高244的彩色RGB图片,同时补了一圈0 

ZeroPadding2D((1,1)

这个函数是指在横向和纵向,即四周都补0

接着是卷积层。有64个(3,3)的卷积核,激活函数是relu ,

model.add(Convolution2D(64, 3, 3, activation='relu'))

一个卷积核扫完图片,生成一个新的矩阵,64个就生成64 层。

接着是补0,接着再来一次卷积。此时图像数据是64*224*224

model.add(ZeroPadding2D((1,1)))

model.add(Convolution2D(64, 3, 3, activation='relu'))

接着是池化,小矩阵是(2,2)  ,步长(2,2),指的是横向每次移动2格,纵向每次移动2格。

model.add(MaxPooling2D((2,2), strides=(2,2)))

按照这样池化之后,数据变成了64*112*112,矩阵的宽高由原来的224减半,变成了112

再往下,同理,只不过是卷积核个数依次变成128,256,512,而每次按照这样池化之后,矩阵都要缩小一半。

13层卷积和池化之后,数据变成了 512*7*7 

然后Flatten(),将数据拉平成向量,变成一维512*7*7=25088

接着是3个全连接层

这里很少有人解释为什么全连接层里有4096 个神经元,其他数行不行?

其实这里4096只是个经验值,其他数当然可以,试试效果,只要不要小于要预测的类别数,这里要预测的类别有1000种,所以最后预测的全连接有1000个神经元。如果你想用VGG16 给自己的数据作分类任务,这里就需要改成你预测的类别数。

至此VGG16整个网络架构以及数据变化都清楚了。

如果要设计其他类型的CNN网络,就是将这些基本单元比如卷积层个数、全连接个数按自己需要搭配变换,是不是很简单?

下面我们再来解释一下VGG16里面参数个数如何变化


 

这里主要看两列数据,一个是memory ,  表示的是数据流变化。

一个是weights 表示的是参数变化。作卷积的时候才有参数,即卷积核内的值。全连接的神经元也有参数,一个神经元包含一个权重值。

刚开始是彩色图像3层色值通道,每层64个 (3,3)  的卷积核,所以参数个数是3*64*3*3

第一次卷积之后,数据变成64* 224*224,即有64层宽224,高224的矩阵数据,再次卷积时,还是每层64个 (3,3) 的卷积核,参数个数变成64*64*3*3,往下都是以此类推。

我们看到参数个数最多时达到1600万个,要是更大的图片参数会更多,普通计算机要训练这么庞大的参数会很卡,所以很多人做深度学习的就要求配置GPU 来提高训练速度。

完整代码地址:

关注微信公众号datayx 然后回复“VGG”即可获取。

VGG16 是基于大量真实图像的 ImageNet 图像库预训练的网络

vgg16对应的供keras使用的模型人家已经帮我们训练好,我们将学习好的 VGG16 的权重迁移(transfer)到自己的卷积神经网络上作为网络的初始权重,这样我们自己的网络不用从头开始从大量的数据里面训练,从而提高训练速度。这里的迁移就是平时所说的迁移学习。

对应的模型已经下载好来,可以通过上面的方式获取。




参考链接:https://www.jianshu.com/p/1fdf986dfc21
来源:简书
 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


http://chatgpt.dhexx.cn/article/6THlaqV7.shtml

相关文章

基于VGG16的猫狗分类实战

1 使用卷积神经网络识别猫和狗数据集 1.1 理论基础 1.1.1 VGG架构 VGG16是由Karen Simonyan和Andrew Zisserman于2014年在论文“VERY DEEP CONVOLUTIONAL NETWORKS FOR LARGE SCALE IMAGE RECOGNITION”中提出的一种处理多分类、大范围图像识别问题的卷积神经网络架构&…

VGG16代码注释

原版代码在这:神经网络学习小记录52——Pytorch搭建孪生神经网络(Siamese network)比较图片相似性 VGG注释: import torch import torch.nn as nn from torchvision.models.utils import load_state_dict_from_urlclass VGG(nn…

VGG16网络结构

VGGNet模型有A-E五种结构网络,深度分别为11,11,13,16,19,其中VGG16和VGG19较为典型。VGG网络结构如下图所示。 VGG16介绍: 在卷积层1(conv3_64),卷积层2(con…

分类网络 VGG16

经典网络VGG16 结构 VGG中根据卷积核大小和卷积层数目的不同,可分为A,A-LRN,B,C,D,E共6个配置(ConvNet Configuration),其中以D,E两种配置较为常用,分别称为VGG16和VGG19。 下图给出了VGG的六种结构配置: 上图中&am…

分类网络:VGG16

VGG16网络的优点: 1.通过堆叠两层3x3的卷积核替代5x5的卷积核, 通过堆叠三层3x3的卷积核替代7x7的卷积核, 原因是拥有相同的感受野,且需要更少的参数:假设输入通道数为C, 则所需要的参数为: 三个3x3的卷积…

VGG16模型

VGG16模型很好的适用于分类和定位任务 其名称来源于作者所在的牛津大学视觉几何组(Visual Geometry Group)的缩写。 1、结构简洁 VGG由5层卷积层、3层全连接层、softmax输出层构成,层与层之间使用max-pooling(最大化池)分开,所有…

VGG16网络结构与代码

VGG16总共有16层(不包括池化层),13个卷积层和3个全连接层,第一次经过64个卷积核的两次卷积后,采用一次pooling,第二次经过两次128个卷积核卷积后,采用pooling;再经过3次256个卷积核卷…

VGG16模型PyTorch实现

1.VGG16 网络简介 VGG16网络模型在2014年ImageNet比赛上脱颖而出,取得了在分类任务上排名第二,在定位任务上排名第一的好成绩。VGG16网络相比于之前的LexNet以及LeNet网络,在当时的网络层数上达到了空前的程度。 2.网络结构 3.创新点 ① 使…

CNN系列学习之VGG16

前言: CNN系列总结自己学习主流模型的笔记,从手写体的LeNet-5到VGG16再到历年的ImageNet大赛的冠军ResNet50,Inception V3,DenseNet等。重点总结每个网络的设计思想(为了解决什么问题),改进点(是怎么解决这…

vgg16猫狗识别

🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍦 参考文章:365天深度学习训练营-第8周:猫狗识别(训练营内部成员可读)🍖 原作者:K同学啊|接辅导、项目定制 我的环境&…

VGG16-keras 优化

VGG16-keras 优化 优化结果对比VGG16网络结构VGG16网络结构优化自定义loss训练预测 优化结果对比 原始VGG16 普通调优 使用预训练权重 VGG16网络结构 VGG16网络结构优化 1.增加正则化 2.使用BN/GN层(中间层数据的标准化) 3.使用dropout Net.py i…

VGG16论文解读

VGGNET VGG16相比AlexNet的一个改进是采用连续的几个3x3的卷积核代替AlexNet中的较大卷积核(11x11,7x7,5x5)。对于给定的感受野(与输出有关的输入图片的局部大小),采用堆积的小卷积核是优于采用…

VGG16模型详解 and 代码搭建

目录 一. VGG 网络模型 二. 代码复现 1. 网络搭建 2.数据集制作(pkl) 3.源码地址 一. VGG 网络模型 Alexnet是卷积神经网络的开山之作,但是由于卷积核太大,移动步长大,无填充,所以14年提出的VGG网络解决了这一问题。而且VGG网…

动手学习VGG16

VGG 论文 《Very Deep Convolutional Networks for Large-Scale Image Recognition》 论文地址:https://arxiv.org/abs/1409.1556 使用重复元素的网络(VGG) 以学习VGG的收获、VGG16的复现二大部分,简述VGG16网络。 一. 学习VGG的收获 VGG网络明确指…

VGG16

VGG16模型的学习以及源码分析 part one 主要学习参考 pytorch 英文文档VGG16学习笔记VGG16网络原理分析与pytorch实现【深度学习】全面理解VGG16模型VGG模型的pytorch代码实现VGG16源代码详解【论文】 VERY DEEP CONVOLUTIONAL NETWORKS FOR LARGE-SCALE IMAGE RECOGNITION p…

VGG16 - 用于分类和检测的卷积网络

VGG16是由牛津大学的K. Simonyan和A. Zisserman在“用于大规模图像识别的非常深卷积网络”的论文中提出的卷积神经网络模型。 该模型在ImageNet中实现了92.7%的前5个测试精度,这是属于1000个类的超过1400万张图像的数据集。它是ILSVRC-2014提交的着名模型…

VGG-16网络结构详解

VGG,又叫VGG-16,顾名思义就是有16层,包括13个卷积层和3个全连接层,是由Visual Geometry Group组的Simonyan和Zisserman在文献《Very Deep Convolutional Networks for Large Scale Image Recognition》中提出卷积神经网络模型&…

经典卷积神经网络——VGG16

VGG16 前言一、VGG发展历程二、VGG网络模型三、VGG16代码详解1.VGG网络架构2.VGG16网络验证2.读取数据,进行数据增强3.训练模型,测试准确率 四、VGG缺点 前言 我们都知道Alexnet是卷积神经网络的开山之作,但是由于卷积核太大,移动…

VGG16网络模型的原理与实现

VGG 最大的特点就是通过比较彻底地采用 3x3 尺寸的卷积核来堆叠神经网络,这样也加深整个神经网络的深度。这两个重要的改变对于人们重新定义卷积神经网络模型架构也有不小的帮助,至少证明使用更小的卷积核并且增加卷积神经网络的深度,可以更有…

深度学习——VGG16模型详解

1、网络结构 VGG16模型很好的适用于分类和定位任务,其名称来自牛津大学几何组(Visual Geometry Group)的缩写。 根据卷积核的大小核卷积层数,VGG共有6种配置,分别为A、A-LRN、B、C、D、E,其中D和E两种是最…