从零开始搭建神经网络(五)卷积神经网络(CNN)
目录
1.基础介绍
2.网络结构
2.1卷积层
2.1.1 Padding
2.1.2 Stride
2.1.3 多通道计算
2.2池化层
2.2.1 最大池化
2.2.2 平均池化
2.3全连接层
3.代码实例
1.基础介绍
卷积神经网络的基础内容可以参考:机器学习算法之卷积神经网络
2.网络结构
卷积神经网络一般包括卷积层,池化层和全连接层,下面分别介绍一下
2.1卷积层
卷积神经网络里面的这个卷积和信号里面的卷积是有些差别的,信号中的卷积计算分为镜像相乘相加,卷积层中的卷积没有镜像这一操作,直接是相乘和相加,如下图所示
最左边的是卷积的输入,中间的为卷积核,最右边的为卷积的输出。可以发现卷积计算很简单,就是卷积核与输入对应位置相乘然后求和。除了图中绿颜色的例子,我们可以计算一下图中红色圈对应的卷积结果:(-1)*2+(-1)*9+(-1)*2+1*4+1*4=-5。以上就是卷积计算的过程,对于整个输入来说,计算结果还取决于两个参数:padding 和 stride,下面分别介绍下这两个参数
2.1.1 Padding
padding是很多地方都会用到的一种操作比如在加密过程中明文不够长就需要加padding来使得明文与密钥长度相同,其意思就是在原有的基础之上增加一些东西是其规模符合后续操作。如下图所示:
.
在Tensorflow中padding有两种属性,一种是valid,这种表示不需要padding操作,假设输入大小为n*n,卷积核大小为f*f,此时输出大小为(n-f+1);另一种是same,表示输入和输出的大小相同,假设padding的大小为p,此时为了保持输出和输入消息相同p = (f-1)/2,但是此时卷积核要是奇数大小。
2.1.2 Stride
stride是指卷积核在输入上移动时每次移动的距离,直接上图来说明。其中按红框来移动的话stride = 1;按蓝色框来移动的话stride = 2。加入stride后,输出的计算有一些变化,假设输入大小为n*n,卷积核大小为f*f,padding大小为p,stride大小为 s,那么最后的输出大小为:
举个代码的例子,下面两行代码是Tensorflow进行卷积计算的代码,x为输入,W为权重,stride的原型为strides =[b, h, w, c],其中b表示在样本上的步长,默认为1表示每个样本都会进行计算;h,w表示高度和宽度,即横向和纵向步长;c表示通道数,默认为1,表示每个通道都会参与计算。
tf.nn.conv2d(x, W, stride=[1, 1, 1, 1], padding='SAME')
tf.nn.conv2d(x, W, stride=[1, 2, 2, 1], padding='VALID')
2.1.3 多通道计算
卷积核除了长宽这两个参数之外还有通道数这个参数,首先需要明确的是单个卷积核的通道数要等于图像的通道数,一般图像是RGB模式的话,卷积核的大小为h*w*3。用吴恩达的视频内容讲解一下,只有一个卷积核的时候,图像经过卷积计算后的结果通道数是一维的,计算方法也简单粗暴每个通道的对应位置相乘然后,不同通道数之间相加。
一般卷积核不止一个,对于多个卷积核的情况也不复杂,直接对每个卷积核进行单个卷积核的操作,然后把它们拼在一起就行了,如图所示:
2.2池化层
池化层(pooling)的作用主要是降低维度,通过对卷积后的结果进行降采样来降低维度,分为最大池化和平均池化两类。
2.2.1 最大池化
最大池化顾名思义,降采样的时候采用最大值的方式采样,如图所示,其中池化核的大小为2*2,步长也为2*2
2.2.2 平均池化
平均池化就是用局部的平均值作为采样的值,还是上面的数据,平均池化后的结果为:
同样上个代码,其中的ksize的参数和stride差不多,就不赘述了。
tf.nn.max_pool(x, ksize=[1, 2, 2, 1], stride=[1, 2, 2, 1], padding='SAME')
tf.nn.avg_pool(x, ksize=[1, 2, 2, 1], stride=[1, 2, 2, 1], padding='SAME')
2.3全连接层
全连接层就是把卷积层和池化层的输出展开成一维形式,在后面接上与普通网络结构相同的回归网络或者分类网络,一般接在池化层后面,如图所示;
用代码会更好理解一些,其中dims为池化层展开成一维数组的维度,第二行采用relu作为全连接层的激活函数。
fc = tf.reshape(pool_out,[-1, dims])
fc_out = tf.nn.relu(tf.matmul(fc, W_fc) + b_fc)
3.代码实例
下面以AlexNet为例子,给出一个详细的卷积神经网络架构,首先AlexNet架构以及每部分学习到的特征如下图所示
代码如下:
import tensorflow as tf
import numpy as np
# 定义各层功能
# 最大池化层
def maxPoolLayer(x, kHeight, kWidth, strideX, strideY, name, padding = "SAME"):"""max-pooling"""return tf.nn.max_pool(x, ksize = [1, kHeight, kWidth, 1],strides = [1, strideX, strideY, 1], padding = padding, name = name)# dropout
def dropout(x, keepPro, name = None):"""dropout"""return tf.nn.dropout(x, keepPro, name)# 归一化层
def LRN(x, R, alpha, beta, name = None, bias = 1.0):"""LRN"""return tf.nn.local_response_normalization(x, depth_radius = R, alpha = alpha,beta = beta, bias = bias, name = name)# 全连接层
def fcLayer(x, inputD, outputD, reluFlag, name):"""fully-connect"""with tf.variable_scope(name) as scope:w = tf.get_variable("w", shape = [inputD, outputD], dtype = "float")b = tf.get_variable("b", [outputD], dtype = "float")out = tf.nn.xw_plus_b(x, w, b, name = scope.name)if reluFlag:return tf.nn.relu(out)else:return out# 卷积层
def convLayer(x, kHeight, kWidth, strideX, strideY,featureNum, name, padding = "SAME", groups = 1):"""convolution"""channel = int(x.get_shape()[-1])conv = lambda a, b: tf.nn.conv2d(a, b, strides = [1, strideY, strideX, 1], padding = padding)with tf.variable_scope(name) as scope:w = tf.get_variable("w", shape = [kHeight, kWidth, channel/groups, featureNum])b = tf.get_variable("b", shape = [featureNum])xNew = tf.split(value = x, num_or_size_splits = groups, axis = 3)wNew = tf.split(value = w, num_or_size_splits = groups, axis = 3)featureMap = [conv(t1, t2) for t1, t2 in zip(xNew, wNew)]mergeFeatureMap = tf.concat(axis = 3, values = featureMap)# print mergeFeatureMap.shapeout = tf.nn.bias_add(mergeFeatureMap, b)return tf.nn.relu(tf.reshape(out, mergeFeatureMap.get_shape().as_list()), name = scope.name)class alexNet(object):"""alexNet model"""def __init__(self, x, keepPro, classNum, skip, modelPath = "bvlc_alexnet.npy"):self.X = xself.KEEPPRO = keepProself.CLASSNUM = classNumself.SKIP = skipself.MODELPATH = modelPath#build CNNself.buildCNN()# 构建AlexNetdef buildCNN(self):"""build model"""conv1 = convLayer(self.X, 11, 11, 4, 4, 96, "conv1", "VALID")lrn1 = LRN(conv1, 2, 2e-05, 0.75, "norm1")pool1 = maxPoolLayer(lrn1, 3, 3, 2, 2, "pool1", "VALID")conv2 = convLayer(pool1, 5, 5, 1, 1, 256, "conv2", groups = 2)lrn2 = LRN(conv2, 2, 2e-05, 0.75, "lrn2")pool2 = maxPoolLayer(lrn2, 3, 3, 2, 2, "pool2", "VALID")conv3 = convLayer(pool2, 3, 3, 1, 1, 384, "conv3")conv4 = convLayer(conv3, 3, 3, 1, 1, 384, "conv4", groups = 2)conv5 = convLayer(conv4, 3, 3, 1, 1, 256, "conv5", groups = 2)pool5 = maxPoolLayer(conv5, 3, 3, 2, 2, "pool5", "VALID")fcIn = tf.reshape(pool5, [-1, 256 * 6 * 6])fc1 = fcLayer(fcIn, 256 * 6 * 6, 4096, True, "fc6")dropout1 = dropout(fc1, self.KEEPPRO)fc2 = fcLayer(dropout1, 4096, 4096, True, "fc7")dropout2 = dropout(fc2, self.KEEPPRO)self.fc3 = fcLayer(dropout2, 4096, self.CLASSNUM, True, "fc8")def loadModel(self, sess):"""load model"""wDict = np.load(self.MODELPATH, encoding = "bytes").item()#for layers in modelfor name in wDict:if name not in self.SKIP:with tf.variable_scope(name, reuse = True):for p in wDict[name]:if len(p.shape) == 1:#biassess.run(tf.get_variable('b', trainable = False).assign(p))else:#weightssess.run(tf.get_variable('w', trainable = False).assign(p))
从零开始搭建神经网络(五)卷积神经网络(CNN)相关推荐
- Pytorch:手把手教你搭建简单的卷积神经网络(CNN),实现MNIST数据集分类任务
关于一些代码里的解释,可以看我上一篇发布的文章,里面有很详细的介绍!!! 可以依次把下面的代码段合在一起运行,也可以通过jupyter notebook分次运行 第一步:基本库的导入 import n ...
- BP神经网络与卷积神经网络(CNN)
BP神经网络与卷积神经网络(CNN) 1.BP神经网络 1.1 神经网络基础 神经网络的基本组成单元是神经元.神经元的通用模型如图 1所示,其中常用的激活函数有阈值函数.sigmoid函数和双曲正 ...
- 【数据挖掘】卷积神经网络 ( 视觉原理 | CNN 模仿视觉 | 卷积神经网络简介 | 卷积神经网络组成 | 整体工作流程 | 卷积计算图示 | 卷积计算简介 | 卷积计算示例 | 卷积计算参数 )
文章目录 I . 人类的视觉原理 II . 卷积神经网络 模仿 视觉原理 III . 卷积神经网络简介 IV . 卷积神经网络 组成 V . 卷积神经网络 工作流程 VI . 降低样本参数数量级 VI ...
- 【卷积神经网络】卷积神经网络(Convolutional Neural Networks, CNN)基础
卷积神经网络(Convolutional Neural Networks, CNN),是一种 针对图像 的特殊的 神经网络. 卷积神经网络概述 Why not DNN? 图像数据的维数很高,比如 1, ...
- Tensorflow入门到实战五(卷积神经网络)
方法定义 tf.nn.conv2d (input, filter, strides, padding, use_cudnn_on_gpu=None, data_format=None, name=No ...
- 卷积神经网络 图像识别,卷积神经网络 图像处理
基于深度卷积神经网络进行人脸识别的原理是什么? 本质上是模式识别,把现实的东西抽象成计算机能够理解的数字.如果一个图片是256色的,那么图像的每一个像素点,都是0到255中间的一个值,这样你可以把一个 ...
- 神经网络与卷积神经网络,什么是卷积神经网络
前馈神经网络.BP神经网络.卷积神经网络的区别与联系 一.计算方法不同1.前馈神经网络:一种最简单的神经网络,各神经元分层排列.每个神经元只与前一层的神经元相连.接收前一层的输出,并输出给下一层.各层 ...
- 全连接神经网络、卷积神经网络
全连接神经网络.卷积神经网络 前言 全连接神经网络 介绍 结构 损失函数 梯度下降 链式法则 反向传播 总结 卷积神经网络 背景 结构 卷积(Convolution) 池化(Max Pooling) ...
- 神经网络与卷积神经网络,卷积神经网络运用
1.有哪些深度神经网络模型? 目前经常使用的深度神经网络模型主要有卷积神经网络(CNN) .递归神经网络(RNN).深信度网络(DBN) .深度自动编码器(AutoEncoder) 和生成对抗网络(G ...
- 卷积神经网络 图像处理,卷积神经网络基本原理
基于深度卷积神经网络进行人脸识别的原理是什么? 本质上是模式识别,把现实的东西抽象成计算机能够理解的数字.如果一个图片是256色的,那么图像的每一个像素点,都是0到255中间的一个值,这样你可以把一个 ...
最新文章
- linux学习之VNC远程控制(一)
- 微型计算机48MHz辐射超,2012职称计算机考试题理论题库
- 企业内网中的WSUS更新服务 服务器连接到Microsoft Update来获取更新程序
- python控制画笔尺寸,Python画笔的属性及用法详解
- 微信开发同步微信服务器图片到本地,逻辑处理。
- 13.Excel业务建模——RFM模型
- 给窗口设置系统级或窗口级的热键
- mysql不能存字母,使用不常見的字母/符號時,MySql數據庫不能正確存儲數據
- POJ2931不平等博弈
- 跨语言之间的socket通信(C--Java的握手)(基础篇转)
- OpenCV-Python实战(番外篇)——利用 K-Means 聚类进行色彩量化
- StackExchange.Redis实现Redis发布订阅
- 电脑怎么找到tomcat端口_更换内存条的时候我怎么找到自己电脑配置的详细信息...
- 几个学习git的地方
- VLFeat在matlab和vs中安装
- 详解linux下的串口通讯开发
- HTC Vive Unity 教程
- matlab 解决列联表问题,列联表那点事,别再傻傻分不清楚了
- AI绘图第二弹!绘制专属动漫头像
- MYSQL选修课的心得体会_选修课心得体会【优秀篇】
热门文章
- # 互动媒体期末作业——P5.js“画板”
- 脂肪率——最忠实的胖瘦指标
- python怎么判断真假_Python不超过10行代码就可实现人脸识别,教你辨别真假
- vue生成pdf文件
- BIOS设置通电开机?请问高手怎么设置?
- Linux系统操作(21):物理cpu数、cpu核数、逻辑cpu数、几路几核几线程、CPU信息详细查询方法
- JSON字符串与protobuf互转
- 培养逻辑思维的app_逻辑思维学生端下载-逻辑思维学生端app下载1.1.22安卓版-西西软件下载...
- 人类活动识别---数据集UCI-HAR简介
- 成人学习国画可能产生哪些错误的思想?