前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >【干货】卷积神经网络中的四种基本组件

【干货】卷积神经网络中的四种基本组件

作者头像
WZEARW
发布于 2018-04-16 06:27:16
发布于 2018-04-16 06:27:16
2.1K00
代码可运行
举报
文章被收录于专栏:专知专知
运行总次数:0
代码可运行

【导读】当今,卷积神经网络图像识别等领域取得巨大的成功,那么是什么使其高效而快速呢?本文整理John Olafenwa的一篇博文,主要介绍了卷积神经网络采用的四种基本组件:Pooling、Dropouts、Batch Normalization、Data Augmentation ,分别解释了这些组件在现代CNN中所起的作用。另外,作者使用keras实现这几种组件,构建一个完整的CNN系统,更有助于读者理解这几种组件的作用和实现方法。

Components of convolutional neural networks

最近最先进的网络结构采用了许多附加组件来补充卷积操作。在这篇文章中,我将解释一些能够提高现代卷积神经网络速度和精度的最重要的组件。 我将从解释每个组件的理论开始,并在keras中实现。

▌Pooling



使CNN非常有效的第一个秘诀就是Pooling。Pooling是一种矢量,对图像的每个局部区域进行标量变换,就像卷积操作一样,然而,与卷积不同的是它们没有过滤器,也不用局部区域计算点积,而是计算区域中像素的平均值(average pooling),或者简单地选取最大像素并丢弃其余部分(Max Pooling)。

以上是2 x 2 pooling,它可以有效地将特征映射的大小减小2倍。

Pooling的想法看起来可能适得其反,因为它会导致信息的丢失,但它在实践中证明是非常有效的,因为它使得covnets(卷积网络)对于图像表示的变化是不变的,并且还减少了背景噪声的影响。 Max Pooling近年来效果最好,其思想是,用某个局部区域的最大像素代表该地区最重要的特征。通常我们想分类的物体的图像可能包含许多其他物体,例如,出现在汽车图像中某处的猫可能会误导分类器。pooling有助于缓解这一现象,使covnets更好地推广。

它也大大降低了covnet的计算成本。通常,网络中每层的图像大小与每层的计算成本(flops)成正比。随着图层变得更深,pooling会减少图像的尺寸,因此,它有助于防止网络需要的flops数量激增。 分段卷积有时用作pooling的替代物。

▌Dropouts



过度拟合是网络在训练集上运行良好但在测试集上表现不佳的一种现象。这通常是由于过度依赖于训练集中出现的特定的特征。Dropouts是一种抑制过度拟合的技巧。 它可以随机地将一些激活值设置为0,从而避免过度拟合。 通过这样做,网络不得不探索更多分类图像的路径而不是过度依赖于某些特征。 Dropouts是AlexNet中的关键元素之一。

▌Batch Normalization(批量标准化)



神经网络的一个主要问题是梯度消失,造成训练非常糟糕。 来自Google Brain的Ioie和Szegedy发现,这主要是因为内部协变量的变化,这种情况是由于信息通过网络传播而造成的数据分布变化引起的。他们提出批量标准化(Batch Normalization)的技术。它的工作原理是将每一批图像都标准化,从而得到零均值和单位方差。

它通常放在cnns的非线性(relu)之前。 它极大地提高了准确性,同时极大地加快了训练过程。

▌Data Augmentation(数据增强)



现代covnets所需要的最后一种组件是Data Augmentation。人类视觉系统在适应图像平移,旋转和其他形式的扭曲方面非常出色。拍摄图像并且不管如何翻转它,大多数人仍然可以识别它。 然而,covnets不善于处理这种扭曲,它们可能会由于小的改变而失败。 它们解决这个问题的关键是随机扭曲训练图像,使用水平切除,垂直切除,旋转,增白,移位和其他扭曲的手段。这将使covnets学会如何处理这种扭曲,因此,他们将能够在现实世界中很好地工作。

另一种常用技术是从每幅图像中减去平均图像,并除以标准偏差。

对这些基本组件的理论解释让人感到枯燥乏味,现在我将解释如何在keras中实现它们。

在这篇文章中,所有的实验都将在CIFAR10上进行,这是一个包含60,000个32×32RGB图像的数据集。 它分为50,000个训练图像和10,000个测试图像。

为了让工程更加模块化,我们为每层创建一个简单的函数

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def Unit(x,filters):
    out = BatchNormalization()(x)
    out = Activation("relu")(out)
    out = Conv2D(filters=filters, kernel_size=[3, 3], strides=[1, 1], padding="same")(out)

    return out

这里是我们代码中最重要的部分,Unit函数定义了一个简单的层,它包含三个层,第一个是我先前解释的Batch Normalization,接下来我们添加RELU activation(激活),最后添加convolution(卷积),注意为何RELU在convolution之前,这是一种最近的做法,称为“预激活”

现在我们将许多unit层合并成一个模型

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def MiniModel(input_shape):
    images = Input(input_shape)


    net = Unit(images,64)
    net = Unit(net,64)
    net = Unit(net,64)
    net = MaxPooling2D(pool_size=(2,2))(net)

    net = Unit(net,128)
    net = Unit(net,128)
    net = Unit(net,128)
    net = MaxPooling2D(pool_size=(2, 2))(net)

    net = Unit(net,256)
    net = Unit(net,256)
    net = Unit(net,256)

    net = Dropout(0.5)(net)
    net = AveragePooling2D(pool_size=(8,8))(net)
    net = Flatten()(net)
    net = Dense(units=10,activation="softmax")(net)

    model = Model(inputs=images,outputs=net)

    return model 

在这里,我们使用API来定义我们的模型,我们从三个单元格开始,每个单元格64个过滤器,然后是Max Pooling层,将我们的32 x 32图像减少到16 x 16。接下来是pooling层的3,128个过滤单元,这使我们的图像变成8 x 8,最后,我们有另外3个256通道的单元。请注意,每次我们将图像尺寸缩小2倍时,我们会将通道数加倍。

我们按照0.5比例设置dropout ,这将随机取消50%的参数,正如我之前解释的那样,它会抑制过度拟合。

接下来,我们需要加载cifar10数据集并执行data augmentation(数据增强)。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#load the cifar10 dataset
(train_x, train_y) , (test_x, test_y) = cifar10.load_data()

#normalize the data
train_x = train_x.astype('float32') / 255
test_x = test_x.astype('float32') / 255

#Subtract the mean image from both train and test set
train_x = train_x - train_x.mean()
test_x = test_x - test_x.mean()

#Divide by the standard deviation
train_x = train_x / train_x.std(axis=0)
test_x = test_x / test_x.std(axis=0)

在上面的代码中,加载训练数据和测试数据后,我们从每幅图像中减去平均图像并除以标准偏差,这是一种基本的(data augmentation)数据增加技术,有时,我们可能只减去平均值并跳过标准偏差部分,哪一种更合适就使用哪种。

对于更先进的数据增强,我们的图像加载过程会稍微改变,keras有一个非常有用的数据增强实用程序,它简化了整个过程。

下面的代码可以做到这一点

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
datagen = ImageDataGenerator(rotation_range=10,
                             width_shift_range=5. / 32,
                             height_shift_range=5. / 32,
                             horizontal_flip=True)

# Compute quantities required for featurewise normalization
# (std, mean, and principal components if ZCA whitening is applied).
datagen.fit(train_x)

在上面,首先我们指定一个10度的旋转角度,高度和宽度都是5/32的偏移以及水平翻移,所有这些变换都会随机应用于训练集中的图像。 请注意,还有更多转换存在,您可以查看可以为该类别指定的所有参数。 请记住,过度使用数据增强可能是有害的。

接下来,我们必须将标签转换为one-hot编码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#Encode the labels to vectors
train_y = keras.utils.to_categorical(train_y,10)
test_y = keras.utils.to_categorical(test_y,10)

我在之前的教程中已经解释过了,所以我不会在这里再次解释它们。 事实上,构建训练过程的几乎所有其他内容都与我之前的教程完全相同,因此,这里是完整的代码。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#import needed classes
import keras
from keras.datasets import cifar10
from keras.layers import Dense,Conv2D,MaxPooling2D,Flatten,AveragePooling2D,Dropout,
BatchNormalization,Activation
from keras.models import Model,Input
from keras.optimizers import Adam
from keras.callbacks import LearningRateScheduler
from keras.callbacks import ModelCheckpoint
from math import ceil
import os
from keras.preprocessing.image import ImageDataGenerator


def Unit(x,filters):
    out = BatchNormalization()(x)
    out = Activation("relu")(out)
    out = Conv2D(filters=filters, kernel_size=[3, 3], strides=[1, 1], padding="same")(out)

    return out

#Define the model


def MiniModel(input_shape):
    images = Input(input_shape)

    net = Unit(images,64)
    net = Unit(net,64)
    net = Unit(net,64)
    net = MaxPooling2D(pool_size=(2,2))(net)

    net = Unit(net,128)
    net = Unit(net,128)
    net = Unit(net,128)
    net = MaxPooling2D(pool_size=(2, 2))(net)

    net = Unit(net,256)
    net = Unit(net,256)
    net = Unit(net,256)

    net = Dropout(0.25)(net)
    net = AveragePooling2D(pool_size=(8,8))(net)
    net = Flatten()(net)
    net = Dense(units=10,activation="softmax")(net)

    model = Model(inputs=images,outputs=net)

    return model

#load the cifar10 dataset
(train_x, train_y) , (test_x, test_y) = cifar10.load_data()

#normalize the data
train_x = train_x.astype('float32') / 255
test_x = test_x.astype('float32') / 255

#Subtract the mean image from both train and test set
train_x = train_x - train_x.mean()
test_x = test_x - test_x.mean()

#Divide by the standard deviation
train_x = train_x / train_x.std(axis=0)
test_x = test_x / test_x.std(axis=0)


datagen = ImageDataGenerator(rotation_range=10,
                             width_shift_range=5. / 32,
                             height_shift_range=5. / 32,
                             horizontal_flip=True)

# Compute quantities required for featurewise normalization
# (std, mean, and principal components if ZCA whitening is applied).
datagen.fit(train_x)



#Encode the labels to vectors
train_y = keras.utils.to_categorical(train_y,10)
test_y = keras.utils.to_categorical(test_y,10)

#define a common unit


input_shape = (32,32,3)
model = MiniModel(input_shape)

#Print a Summary of the model

model.summary()
#Specify the training components
model.compile(optimizer=Adam(0.001),loss="categorical_crossentropy",metrics=["accuracy"])



epochs = 20
steps_per_epoch = ceil(50000/128)

# Fit the model on the batches generated by datagen.flow().
model.fit_generator(datagen.flow(train_x, train_y, batch_size=128),
                    validation_data=[test_x,test_y],
                    epochs=epochs,steps_per_epoch=steps_per_epoch, verbose=1, 
workers=4)


#Evaluate the accuracy of the test dataset
accuracy = model.evaluate(x=test_x,y=test_y,batch_size=128)
model.save("cifar10model.h5") 

首先,这里有一些不同之处

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
input_shape = (32,32,3)
model = MiniModel(input_shape)

#Print a Summary of the model

model.summary()

正如我先前所解释的,cifar 10由32 x 32的RGB图像组成,因此输入形状有3个通道。 这是不言而喻的。

下一行创建一个我们已经删除的模型的实例,并传入输入形状。

最后,最后一行将打印出我们网络的完整摘要,包括参数的数量。

需要解释的最后一部分是

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
epochs = 20
steps_per_epoch = ceil(50000/128)

# Fit the model on the batches generated by datagen.flow().
model.fit_generator(datagen.flow(train_x, train_y, batch_size=128),
                    validation_data=[test_x,test_y],
                    epochs=epochs,steps_per_epoch=steps_per_epoch, verbose=1, 
workers=4)


#Evaluate the accuracy of the test dataset
accuracy = model.evaluate(x=test_x,y=test_y,batch_size=128)
model.save("cifar10model.h5")

首先我们定义要运行的epochs的数量,注意不要与steps_per_epoch混淆。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
steps_per_epoch = ceil(50000/128)

50000是总共训练图像的数量,这里我们使用128的批处理大小,这意味着,总共20次epochs,对于个epoch,网络将处理50000/128批次的图像。

接下来是fit函数,这与我在前面的教程中解释的fit函数明显不同。

再看看下面的代码可能会有所帮助。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Fit the model on the batches generated by datagen.flow().
model.fit_generator(datagen.flow(train_x, train_y, batch_size=128),
                    validation_data=[test_x,test_y],
                    epochs=epochs,steps_per_epoch=steps_per_epoch, verbose=1,
 workers=4)

由于我们使用数据生成器类来实现数据增强,我们必须使用fit_generator函数,不要直接传入train_x和train_y,而是通过数据生成器中的流函数传递它们,同时我们也指定batch大小,接下来我们规定在这种情况下的验证数据(validation data)是测试数据(test data)。 所有其他事情保持不变。

这种设置在20个epochs后产生82%的准确率。

您可以尝试调整参数和网络,来观察您可以将准确度提高多少。在接下来的教程中,我将解释一些能真正高效地构建cnn体系结构所需的其他技巧。 本教程的目的是向您介绍基本组件。

如果你想深入了解计算机视觉。 从https://john.specpal.science下载我的免费电子书“Introduction to Deep Computer Vision”。

如果您有任何问题,请在下面评论或通过@ johnolafenwa在twitter上与我联系。

参考文献:

https://towardsdatascience.com/components-of-convolutional-neural-networks-6ff66296b456

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-03-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 专知 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
手把手教你构建ResNet残差网络
【导读】ResNet在2015年名声大噪,影响了2016年DL在学术界和工业界的发展方向。它对每一层的输入做一个reference,形成残差函数。残差用来设计解决深度网络退化问题,同时也解决了梯度消失
WZEARW
2018/06/05
3.7K0
Python从0到100(八十四):神经网络-卷积神经网络训练CIFAR-10数据集
CIFAR-10 数据集由 10 个类的 60000 张 32x32 彩色图像组成,每类 6000 张图像。有 50000 张训练图像和 10000 张测试图像。
是Dream呀
2025/03/05
1230
Python从0到100(八十四):神经网络-卷积神经网络训练CIFAR-10数据集
深度学习 —— TensorFlow与卷积神经网络(识别船舶)
友友们,早上好呀。今天我们来继续充电,本次我们来了解下卷积神经网络。然后用使用TensorFlow实现神经网络构建,并且应用到识别船舶图片上。ok话不多说,直接开始吧。
china马斯克
2025/03/19
570
卷积神经网络复习
卷积神经网络主要包括3层,即:卷积层、池化层以及全连接层。本文讲分别细致介绍这三层的作用和计算来复习一下卷积神经网络。本文采用简单的LeNet来讨论这些问题,模型的结构如下。
故事尾音
2019/12/18
7080
卷积神经网络复习
毕业设计So Easy:卷积神经网络实现中药材识别系统APP
针对这些问题,决定分享一些软、硬件项目的设计思路和实施方法,希望可以帮助大家,也祝愿各位学子,顺利毕业!
不脱发的程序猿
2023/03/16
6280
毕业设计So Easy:卷积神经网络实现中药材识别系统APP
探究肺癌患者的CT图像的图像特征并构建一个诊断模型
准备工作: 1.准备肺癌或非肺癌每个各10张图,在本地创建一个名为“data”的文件夹,用于存放数据集。在“data”文件夹下创建两个子文件夹,分别命名为“cancer”和“non_cancer”,用于存放肺癌和非肺癌图像。将10张肺癌图像命名为“cancer_1.jpg”到“cancer_10.jpg”,并将它们放入“cancer”文件夹中。将10张非肺癌图像命名为“non_cancer_1.jpg”到“non_cancer_10.jpg”,并将它们放入“non_cancer”文件夹中。
未名编程
2024/10/12
1130
探究肺癌患者的CT图像的图像特征并构建一个诊断模型
keras知识点
所有的函数都在keras.preprocessing 分别有text ,sequence, image
润森
2019/08/29
4520
深度学习要点:可视化卷积神经网络
AiTechYun 编辑:yuxiangyu 深度学习中最深入讨论的话题之一是如何解释和理解一个训练完成的模型,尤其是在医疗保健等高风险行业的背景下。“黑盒”这个词经常与深度学习算法联系在一起。如果我们不能解释它是如何工作的,我们如何相信模型的结果呢? 以一个为了检测癌症肿瘤而训练的深度学习模型为例。该模型告诉你它99%确定它检测到了癌症,但它并没有告诉你为什么或怎么确定的。 它是在MRI扫描(磁共振)中找到了一条重要线索,还是仅仅是扫描中的一个污点被错误地检测为肿瘤?这对患者来说是生死攸关的问题,医生经不
AiTechYun
2018/04/19
2.3K0
深度学习要点:可视化卷积神经网络
Lenet神经网络解读及其代码实现
  手写字体识别模型LeNet5诞生于1994年,是最早的卷积神经网络之一。LeNet5通过巧妙的设计,利用卷积、参数共享、池化等操作提取特征,避免了大量的计算成本,最后再使用全连接神经网络进行分类识别,这个网络也是最近大量神经网络架构的起点。虽然现在看来Lenet基本实际用处不大,而且架构现在基本也没人用了,但是可以作为神经网络架构的一个很好的入门基础。
墨明棋妙27
2022/08/24
3710
Lenet神经网络解读及其代码实现
TensorFlow深度学习!构建神经网络预测股票价格!⛵
股票价格数据是一个时间序列形态的数据,诚然,股市的涨落和各种利好利空消息更相关,更多体现的是人们的信心状况,但是它的形态下,时序前后是有一定的相关性的,我们可以使用一种特殊类型的神经网络『循环神经网络(RNN)』来对这种时序相关的数据进行建模和学习。
ShowMeAI
2022/11/12
9620
TensorFlow深度学习!构建神经网络预测股票价格!⛵
LSTM时间序列预测及网络层搭建[通俗易懂]
最近看到一篇博客,是时间预测问题,数据和代码的原地址在这里, https://www.jianshu.com/p/5d6d5aac4dbd
全栈程序员站长
2022/07/23
1K0
LSTM时间序列预测及网络层搭建[通俗易懂]
机器学习(二)深度学习实战-使用Kera预测人物年龄问题描述引入所需要模块加载数据集创建模型编译模型优化optimize1 使用卷积神经网络optimize2 增加神经网络的层数输出结果结果
问题描述 我们的任务是从一个人的面部特征来预测他的年龄(用“Young”“Middle ”“Old”表示),我们训练的数据集大约有19906多张照片及其每张图片对应的年龄(全是阿三的头像。。。),测试集有6636张图片,首先我们加载数据集,然后我们通过深度学习框架Keras建立、编译、训练模型,预测出6636张人物头像对应的年龄 引入所需要模块 import os import random import pandas as pd import numpy as np from PIL import Ima
致Great
2018/04/11
1.1K0
机器学习(二)深度学习实战-使用Kera预测人物年龄问题描述引入所需要模块加载数据集创建模型编译模型优化optimize1 使用卷积神经网络optimize2 增加神经网络的层数输出结果结果
keras系列︱图像多分类训练与利用bottleneck features进行微调(三)
该文摘要总结:利用卷积神经网络来对图像进行特征提取和分类,使用预训练的VGG16网络作为基础网络,通过修改网络结构以适应自己的数据集,并使用合成数据集进行训练。在训练过程中,使用了数据增强技术,包括旋转、翻转和水平翻转等,以提高模型的性能。最终,该模型在测试集上获得了85.43%的准确率,表现良好。
悟乙己
2018/01/02
4.4K0
keras系列︱图像多分类训练与利用bottleneck features进行微调(三)
深度学习实战 | 使用Kera预测人物年龄
01 问题描述 我们的任务是从一个人的面部特征来预测他的年龄(用“Young”“Middle ”“Old”表示),我们训练的数据集大约有19906多张照片及其每张图片对应的年龄(全是阿三的头像。。。),测试集有6636张图片,首先我们加载数据集,然后我们通过深度学习框架Keras建立、编译、训练模型,预测出6636张人物头像对应的年龄。 02 引入所需要的模块 import os import random import pandas as pd import numpy as np from PIL im
用户1332428
2018/03/09
1.6K0
深度学习实战 | 使用Kera预测人物年龄
使用Keras进行时间序列预测回归问题的LSTM实现
数据 数据来自互联网,这些数据用于预测航空公司的人数,我们使用LSTM网络来解决这个问题 关于此处模型构建,只对keras部分代码做重点的介绍
学到老
2019/01/25
6.7K0
使用Keras进行时间序列预测回归问题的LSTM实现
深度学习精要之CapsuleNets理论与实践(附Python代码)
神经网络于上世纪50年代提出,直到最近十年里才得以发展迅速,正改变着我们世界的方方面面。从图像分类到自然语言处理,研究人员正在对不同领域建立深层神经网络模型并取得相关的突破性成果。但是随着深度学习的进一步发展,又面临着新的瓶颈——只对成熟网络模型进行加深加宽操作。直到最近,Hinton老爷子提出了新的概念——胶囊网络(Capsule Networks),它提高了传统方法的有效性和可理解性。
用户3578099
2019/08/16
7430
基于Keras+CNN的MNIST数据集手写数字分类
Keras官方github链接:https://github.com/keras-team/keras 官方的口号是Keras: Deep Learning for humans,中文叫做Keras是给人使用的深度学习开发框架,其意义是Keras是一个高度集成的开发框架,其中的API调用很简单。 Keras用python语言编写,在tensorflow、cntk、theano这3种框架的基础上运行。 本文是学习github源码的笔记,源码链接:https://github.com/keras-team/keras/blob/master/examples/cifar10_cnn.py
潇洒坤
2018/10/09
2.4K0
基于Keras+CNN的MNIST数据集手写数字分类
基于卷积神经网络CNN的图像分类
运行结果:Found 1600 validated image filenames belonging to 2 classes.
皮大大
2023/05/05
1.4K0
基于深度学习模型的空气污染时序预测
Blog: http://yishuihancheng.blog.csdn.net
郭好奇同学
2022/06/07
2.1K0
基于深度学习模型的空气污染时序预测
深入LSTM神经网络的时间序列预测
RNN(循环神经网络)是一种节点定向连接成环的人工神经网络。不同于前馈神经网络,RNN 可以利用内部的记忆来处理任意时序的输入序列,即不仅学习当前时刻的信息,也会依赖之前的序列信息,所以在做语音识别、语言翻译等等有很大的优势。RNN 现在变种很多,常用的如 LSTM、Seq2SeqLSTM,还有其他变种如含有 Attention 机制的 Transformer 模型等等。这些变种原理结构看似很复杂,但其实只要有一定的数学和计算机功底,在学习的时候认认真真搞懂一个,后面的都迎刃而解。
算法进阶
2023/08/28
7860
深入LSTM神经网络的时间序列预测
推荐阅读
相关推荐
手把手教你构建ResNet残差网络
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文