初识——卷积神经网络
Posted 浪潮之中
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了初识——卷积神经网络相关的知识,希望对你有一定的参考价值。
本文章还是作者学习心得的记录,物喜勿喷,如有错误欢迎指正!感激不尽!
今天我们一起来认识一下当前图像处理中一个非常重要的神经网络结构——卷积神经网络
顾名思义,卷积神经网络最特殊的地方就是卷积,卷积是什么?有什么作用?
什么是卷积?
有知道的滤波器的同学可能注意到了,这两个概念十分相似,都是一个n*n的矩阵(其中n是奇数),但细心的同学也发现了,滤波器是咱们事先定义好的,比如高斯滤波、sobel、laplacian等等,但是卷积我们就没有听说过有固定的卷积核,其实就是随机生成的n*n的矩阵,其中卷积核最小的为1*1,最大的是Alexnet中的11*11的,卷积核越大计算量也越大
我们看一张卷积操作示意图:
卷积有什么作用?
卷积最主要的目的是进行特征提取!
卷积神经网络与全连接神经网络有什么不同?
1、卷积神经网络不是全连接的,并不是输入的图像的每个元素与下一层相连,而是局部相连,这也是卷积的作用,卷积对原图像进行卷积特征提取操作,这样得到的输出会少很多
2、因为输出少很多,也伴随着权重少了很多,我们理解权重可以将一个卷积核理解为一个权重值,一个卷积核对整张图片进行卷积操作(一个权重作用于整张图片),这也就是人们常说的权值共享
卷积神经网络与传统的神经网络的优势在哪?
1、减少了FC(全连接层)的像素点数量,不会是图片的每个像素点,减少了FC的计算量
2、更有针对性,是对通过卷积提取出的特征进行分类,不是整张图片的像素点
综合来看卷积神经网络处理的图片和分类效果要不全连接神经网络好很多!
池化层-pooling
有了卷积后必定会有池化操作,池化操作的作用就是将卷积得到的特征进一步压缩,就比如拧毛巾,将毛巾中多余的水分挤干;常见的池化操作有:均值池化,最大池化,最小池化等
max pool展示
如何构建一个卷积神经网络?
开始垒代码!!!
# 咱们以Alexnet代码为例,来学习一下卷积神经网络中卷积部分
from keras.models import Sequential
#模型
# 规定了输入参数的大小
def AlexNet(input_shape=(224,224,3),output_shape = 2):
model = Sequential()
# 这里补充一个计算知识点:
# ((h-f)/s +1,(w-f)/s + 1) 这是经过卷积后原图像会得到的尺寸,h,w为原图像的高和宽,f为卷积核的大小,s为步长
# 使用步长4*4,大小为11的卷积核对图像进行卷积,输出特征为96层,输出的shape为(55,55,96)
# padding 类型 'valid' 和 'same'
# valid 是不进行填充,(必要时删除最右边的列或最下边的行)
# same 是对原图外圈进行填充处理,填充数值为0,维度我1,因为分为左右两列,维度增大2
# 卷积操作
model.addd(
Conv2D(
filters = 96,
kernel_size = (11,11),
strides=(4,4),
padding = 'valid',
input_shape=input_shape,
activation='relu'
)
)
model.add(BatchNormalization()) # BatchNormalization就是一个归一化操作
# 池化层,使用步长为2的最大池化层进行池化,输出为(27,27,96)
model.add(
MaxPooling2D(
pool_size=(3,3),
strides=(2,2),
padding='valid'
)
)
# 继续进行卷积操作,使用步长为1x1,大小为5的卷积核对图像进行卷积,输出的特征层为256层,输出的shape为(27,27,256)
model.add(
Conv2D(
filters = 256,
kernel_size = (5,5),
strides=(1,1),
padding = 'same',
activation = 'relu'
)
)
model.add(BatchNormalization())
# 使用步长为2的最大池化层进行池化,此时输出的shape为(13,13,256);
model.add(
MaxPooling2D(
pool_size=(3,3),
strides=(2,2),
padding='valid'
)
)
# 使用步长为1x1,大小为3x3的卷积核进行卷积,输出的特征层为384层(也就是卷积核的多少位384个),输出的shape为((13+2)-3)/1+1,这里为什么是要加2,是因为用了same的padding
model.add(
Conv2D(
filters = 384,
kernel_size = (3,3),
strides = (1,1),
padding = 'same',
activation = 'relu'
)
)
# 使用步长为1x1,大小为3x3的卷积核进行卷积,输出的特征层为256层,(13,13,256)
model.add(
Conv2D(
filters = 256,
kernel_size = (3,3),
strides = (1,1),
padding = 'same',
activation = 'relu'
)
)
# 进行最大池化,得到的数据为(6,6,256)
model.add(
MaxPooling2D(
pool_size=(3,3),
strides=(2,2),
padding='valid'
)
)
# 两个全连接层
model.add(Flatten()) # 对输入数据进行压平操作,也就是将 (6,6,256) => 9216x1
# 配置神经网络中的hidden层
model.add(Dense(1024,activation='relu')) # 这里设置隐藏层,输入参数的维度为9216x1,hidden层的规格应该是1024x9216
model.add(Dropout(0.25))
# 再接一个隐藏层
model.add(Dense(1024, activation='relu')) # 这里设置隐藏层,输入参数的维度为1024x1,hidden层的权重维度应该是1024x1024
model.add(Dropout(0.25))
# 输出层
model.add(Dense(output_shape, activation='softmax')) # 输出层的初始权重的大小为 10x1024,对应隐藏层的输入为1024x1,输出为10x1
return model
今天的学习就到这里,你了解了多少?记住了多少?
生活不易,及时学习!
以上是关于初识——卷积神经网络的主要内容,如果未能解决你的问题,请参考以下文章
初识Spring源码 -- doResolveDependency | findAutowireCandidates | @Order@Priority调用排序 | @Autowired注入(代码片段