卷积神经网络的整体结构、卷积层、池化、python实现
卷积神经网络的整体结构、卷积层、池化、python实现
- 一、整体结构
- 二、卷积层
- 三、池化层
- 四、python实现卷积层、池化层
一、整体结构
神经网络相邻层所有神经元之间都有连接,称为全连接。前面用Affine层实现了全连接。
举个例子
全连接神经网络结构:
卷积神经网络CNN的结构:
新增了Conv卷积层和Pooling池化层,之前的Affine-ReLU连接替换成了Conv-ReLU-Pooling连接。
CNN中,靠近输出的层中使用之前Affine-ReLU组合,最后输出层使用之前Affine-softmax组合,这是一种常见的CNN结构。
二、卷积层
全连接神经网络存在的问题就是数据的形状被忽视了,输入三维图像,但是向全连接层输入时,需将三维拉成一维,这导致忽视了形状中含有的空间信息,也就是说全连接,无法利用与形状相关的信息。
卷积神经网络为了解决这一问题,向各层中传递的数据是有形状的数据,比如三维数据。
卷积层进行卷积运算,就像是图像处理的滤波。
对于输入数据,卷积运算以一定间隔滑动滤波器的窗口并将各个位置上滤波器的元素和输入的对应元素相乘再求和,进行所谓乘积累加运算。
全连接神经网络中,参数有权重和偏置等。
CNN中滤波器里面的数就是参数,滤波器里面数据的偏置也是参数。要通过cnn网络对数据的学习,把这些参数给找到,从而达到优异的学习效果。
有时候进行卷积处理前要进行填充,也就是向输入数据周围填入固定的数据,填充主要是为了调整输出的大小。(4,4)的输入数据应用(3,3)滤波器时,输出为(2,2),输出比输入缩小两个元素就导致一个问题,如果每次进行卷积运算都缩小输出,那么某时刻就无法再对输出进行卷积运算,网络就传不下去了。如果说这个例子填充幅度是1,那么卷积运算输出也是(4,4),卷积运算就可以在保持空间大小不变的情况下传递数据给下一层。
增大步幅,输出大小会变小,增大填充输出大小会变大。
假设输入大小为(H,W),滤波器大小为(FH,FW),输出大小为(OH,OW),填充为P,步幅为S。
有下面这个公式。
多维数据的卷积运算:
通道数为C、高度为H、长度为W的数据形状,(C,H,W)
滤波器通道数为C、高度为FH、长度为FW,(C,FH,FW)
卷积后输出的是一张特征图。可以这样理解,一个小方块在大方块里面移动,由于大方块的C和小方块一样,所以卷积后是二维的。
如果想在通道上也有多个卷积运算,就需要用到多个滤波器如下图。输出将以方块的形式传给下一层。
如果增加偏置,如下图:小长方体,也就是FN个偏置值。
如果增加批处理,也就是一次性处理N个数据,那么各层传递数据保存维度将增加一维,如下图。
三、池化层
池化是缩小高、长方向上的空间运算。Max池化层是获取目标区域最大值,然后把最大值放到输出数据的其中一个元素里。池化层没有要学习的参数,通道数不发生变化。池化对输入数据微小偏差具有鲁棒性,也就是说,输入数据发生微小偏差时,池化层返回(与输入数据没发生微小偏差时)相同的输出结果。
四、python实现卷积层、池化层
对于卷积来说,im2col这个函数能够把大方块的小方块展开一行,这样的话能和滤波器的小方块 进行矩阵乘积运算,如下图所示。
对于池化来说,im2col依然可以这么展开,就是把大正方形里面的小正方形展成一行,这里就不放图了。
im2col实现代码:
def im2col(input_data, filter_h, filter_w, stride=1, pad=0):"""Parameters----------input_data : 由(数据量, 通道, 高, 长)的4维数组构成的输入数据filter_h : 滤波器的高filter_w : 滤波器的长stride : 步幅pad : 填充Returns-------col : 2维数组"""N, C, H, W = input_data.shapeout_h = (H + 2*pad - filter_h)//stride + 1out_w = (W + 2*pad - filter_w)//stride + 1img = np.pad(input_data, [(0,0), (0,0), (pad, pad), (pad, pad)], 'constant')col = np.zeros((N, C, filter_h, filter_w, out_h, out_w))for y in range(filter_h):y_max = y + stride*out_hfor x in range(filter_w):x_max = x + stride*out_wcol[:, :, y, x, :, :] = img[:, :, y:y_max:stride, x:x_max:stride]col = col.transpose(0, 4, 5, 1, 2, 3).reshape(N*out_h*out_w, -1)return col
反向传播时候,要进行im2col逆处理,用的是col2im函数。
def col2im(col, input_shape, filter_h, filter_w, stride=1, pad=0):"""Parameters----------col :input_shape : 输入数据的形状(例:(10, 1, 28, 28))filter_h :filter_wstridepadReturns-------"""N, C, H, W = input_shapeout_h = (H + 2*pad - filter_h)//stride + 1out_w = (W + 2*pad - filter_w)//stride + 1col = col.reshape(N, out_h, out_w, C, filter_h, filter_w).transpose(0, 3, 4, 5, 1, 2)img = np.zeros((N, C, H + 2*pad + stride - 1, W + 2*pad + stride - 1))for y in range(filter_h):y_max = y + stride*out_hfor x in range(filter_w):x_max = x + stride*out_wimg[:, :, y:y_max:stride, x:x_max:stride] += col[:, :, y, x, :, :]return img[:, :, pad:H + pad, pad:W + pad]
卷积层、池化层实现代码:
class Convolution:def __init__(self, W, b, stride=1, pad=0):self.W = Wself.b = bself.stride = strideself.pad = pad# 中间数据(backward时使用)self.x = None self.col = Noneself.col_W = None# 权重和偏置参数的梯度self.dW = Noneself.db = Nonedef forward(self, x):FN, C, FH, FW = self.W.shapeN, C, H, W = x.shapeout_h = 1 + int((H + 2*self.pad - FH) / self.stride)out_w = 1 + int((W + 2*self.pad - FW) / self.stride)col = im2col(x, FH, FW, self.stride, self.pad)col_W = self.W.reshape(FN, -1).Tout = np.dot(col, col_W) + self.bout = out.reshape(N, out_h, out_w, -1).transpose(0, 3, 1, 2)self.x = xself.col = colself.col_W = col_Wreturn outdef backward(self, dout):FN, C, FH, FW = self.W.shapedout = dout.transpose(0,2,3,1).reshape(-1, FN)self.db = np.sum(dout, axis=0)self.dW = np.dot(self.col.T, dout)self.dW = self.dW.transpose(1, 0).reshape(FN, C, FH, FW)dcol = np.dot(dout, self.col_W.T)dx = col2im(dcol, self.x.shape, FH, FW, self.stride, self.pad)return dxclass Pooling:def __init__(self, pool_h, pool_w, stride=1, pad=0):self.pool_h = pool_hself.pool_w = pool_wself.stride = strideself.pad = padself.x = Noneself.arg_max = Nonedef forward(self, x):N, C, H, W = x.shapeout_h = int(1 + (H - self.pool_h) / self.stride)out_w = int(1 + (W - self.pool_w) / self.stride)col = im2col(x, self.pool_h, self.pool_w, self.stride, self.pad)col = col.reshape(-1, self.pool_h*self.pool_w)arg_max = np.argmax(col, axis=1)out = np.max(col, axis=1)out = out.reshape(N, out_h, out_w, C).transpose(0, 3, 1, 2)self.x = xself.arg_max = arg_maxreturn outdef backward(self, dout):dout = dout.transpose(0, 2, 3, 1)pool_size = self.pool_h * self.pool_wdmax = np.zeros((dout.size, pool_size))dmax[np.arange(self.arg_max.size), self.arg_max.flatten()] = dout.flatten()dmax = dmax.reshape(dout.shape + (pool_size,)) dcol = dmax.reshape(dmax.shape[0] * dmax.shape[1] * dmax.shape[2], -1)dx = col2im(dcol, self.x.shape, self.pool_h, self.pool_w, self.stride, self.pad)return dx
卷积神经网络的整体结构、卷积层、池化、python实现相关推荐
- 卷积神经网络(CNN)之池化层的实现
池化层的实现和卷积层的实现差不多,都是使用im2col来展开输入数据,只不过在池化的应用区域是按照通道单独展开.看图更直观. 图中我们可以看出,对输入数据进行展开之后,再对展开的矩阵求各行的最大值,这 ...
- 吴恩达深度学习课程-Course 4 卷积神经网络 第一周 卷积神经网络编程作业(第一部分)
时隔三个月终于有时间更新了-在ppt的夹缝中练习. 期待圣诞节!!! 卷积神经网络:Step by Step 1 - 导入相关包 2 - 作业大纲 3 - 卷积神经网络 3.1 - 零填充 3.2 - ...
- 花书+吴恩达深度学习(十)卷积神经网络 CNN 之卷积层
目录 0. 前言 1. 2D 图像卷积 2. 3D 图像卷积 3. 过滤器(核函数) 4. 过滤器应用于边缘检测 5. padding 填充 6. stride 步长 7. 使用卷积的动机 8. 1乘 ...
- 卷积层和全连接层的区别_卷积神经网络中全连接层作用理解总结
前言 一般来说,卷积神经网络会有三种类型的隐藏层--卷积层.池化层.全连接层.卷积层和池化层比较好理解,主要很多教程也会解释. • 卷积层(Convolutional layer)主要是用一个采样器 ...
- 卷积神经网络中各个卷积层的设置及输出大小计算的详细讲解
我将从以下几个方面来进行解说: 1.卷积神经网络的结构 2.卷积神经网络的计算 3.以AlexNet为例进行详细讲解 4.常见的两个卷积层设置的问题 1.卷积神经网络的结构 卷积神经网络(CNN)由输 ...
- 卷积神经网络详解 - 卷积层逻辑篇
本系列文章为深度学习笔记,方便自己回看. 卷积计算概述 对于图像识别来说,卷积神经网络的效果要好于全连接神经网络.我在首次接触卷积时,隐约记得在大一高数课程中曾经提及,但具体已经无法名状.何谓卷积,知 ...
- xml文件 卷积神经网络_理解卷积神经网络中的输入与输出形状(Keras实现)
即使我们从理论上理解了卷积神经网络,在实际进行将数据拟合到网络时,很多人仍然对其网络的输入和输出形状(shape)感到困惑.本文章将帮助你理解卷积神经网络的输入和输出形状. 让我们看看一个例子.CNN ...
- 04.卷积神经网络 W2.深度卷积网络:实例探究
文章目录 1. 为什么要进行实例探究 2. 经典网络 3. 残差网络 ResNets 4. 残差网络为什么有用 5. 网络中的网络 以及 1×1 卷积 6. 谷歌 Inception 网络简介 7. ...
- 神经网络与卷积神经网络,什么是卷积神经网络
前馈神经网络.BP神经网络.卷积神经网络的区别与联系 一.计算方法不同1.前馈神经网络:一种最简单的神经网络,各神经元分层排列.每个神经元只与前一层的神经元相连.接收前一层的输出,并输出给下一层.各层 ...
最新文章
- linux shell显示下载进度,shell脚本测试下载速度
- 用记事本解决js中文乱码问题
- python第一个解释器是哪一年_Python简介以及解释器介绍
- 活学活用,CSS清除浮动的4种方法
- 全链路监控方案概述与比较
- 深入浅出extjs第2版_LINGO实例教程第2版第2期上线
- 第一章课后习题及答案
- js实现网页图片上传本地预览
- C++-Qt【1】-退出程序静态调试
- Linux下安装vmWare tools工具(详细讲解)
- 解决iPhone模拟器无法启动的方法
- 华硕主板实现Wake on lan 网络唤醒的种种细节
- 个人安卓学习笔记---搭建Androd开发环境
- 含泪讲述拿到美团offer的心酸历程......
- 支持iframe的div分隔线插件
- 省市县地址联动插件distpicker 代码及示例
- [Android]-SDK QQ微信登入
- sa结构组网方式_5g组网SA和NSA的区别是啥?
- 快手616购物节报告:品牌商家GMV同比增长超5倍
- 制作圆形图片,你会以下几种?
热门文章
- 基于双线性插值的图像旋转原理及MATLAB实现(非自带函数)
- 全网最全的Numpy开发入门教程(详细案例版)
- LeetCode题库整理【Java】—— 7整数反转
- mysql自带的卸数工具_数据库卸数必备工具下载-数据库数据导出工具(DBexport)下载v1.3官方版-西西软件下载...
- win10去除快捷小箭头_win10操作系统小技巧之键盘快捷键使用
- 源码里没有configure_深入源码理解.NET Core中Startup的注册及运行
- 工业计算机远程控制,基于SOCKET技术的计算机远程控制实现
- android极光推送声音,android 极光推送 声音与振动 的关闭和开启
- Chrome浏览器新功能 剪贴板多平台共享
- Java枚举类型(enum)详解