卷积神经网络中的参数共享/权重复制
参数共享或权重复制是深度学习中经常被忽略的领域。但是了解这个简单的概念有助于更广泛地理解卷积神经网络的内部。卷积神经网络(cnn)能够使那些通过网络馈送的图像在进行仿射变换时具有不变性。这个特点提供了识别偏移图案、识别倾斜或轻微扭曲的图像的能力。
仿射不变性的这些特征是由于CNN架构的三个主要属性而引入的。
- 局部感受领域
- 权值共享(参数共享)
- 空间子采样
在本文中,我们将探索权值共享,并了解它们的用途以及它们在CNN架构中的优势。本文针对从事机器学习或更具体地说是深度学习的各个层次的人。
介绍
让我们首先在脑海中演示CNN中的一个卷积层。。
CNN中的卷积层(conv层)包含一组单元,这些单元也可以称为神经元。
conv层还包括层内的几个过滤器,这是一个预定义的超参数。
一个层内过滤器的数量表示激活/特征映射的输出量的深度维度,该映射由conv层创建,作为下一层的输入。
每一个滤波器都有一个设定的宽度和高度,对应于层内单个单元的局部接收场。作用于输入数据的滤波器产生一个卷积层的输出,即特征映射。
在CNN的训练阶段,可以学习过滤器中的权重值。卷卷积层的输出维数有一个深度分量,如果我们对输出的每一段进行分割,我们将得到一个二维平面的特征映射。在单个二维平面上使用的过滤器包含一个权重,该权重在同一平面上使用的所有过滤器之间共享。
这样做的好处是,我们在输入数据的另一部分与输入数据的另一部分保持相同的特征检测器。
卷积层的输出是一组特征图,其中每个特征图是单元内固定权重参数与输入数据之间的卷积运算结果。
卷积神经网络层的一个基本特征是它的特征映射能够反映对输入图像所做的任何仿射变换,而这些仿射变换是通过输入层输入的。
因此,对输入数据进行任何偏移、倾斜或定向,特征映射都将提供一个输出,该输出将根据输入数据所受的量进行偏移、倾斜或定向。
将理论付诸实践
本节的目的是揭示卷积神经网络中发生的权值共享的好处。
我们将在两种流行的CNN架构(LeNet和AlexNet)的第一个卷积层中得出不带权值共享和权值共享的可训练权重的数量。
以下是要采取的步骤:·
- 获取conv 层的输出宽度 (输入大小的宽度-过滤器大小+(2 * Padding)/步幅)+1 =卷积层的输出宽度
- 计算conv层中神经元/单位的数量
- 计算没有使用权值共享的训练参数的数量(包括偏差)
- 计算使用权值共享的训练参数(包括偏差)的数量
下表描述了来自AlexNet和LeNet CNN架构的信息,这些信息将用于得出卷积层内训练参数/权重的数量。
AlexNet
- conv层的输出宽度:=((227-11)/ 4)+1= 55(conv层输出宽度)
- conv层中神经元/单位的数量=输出高度
*
输出宽度*
特征图的数量= 55*
55*
96(转换输出量)= 290,400单位 - conv层内的训练参数或权重数(不使用权值共享)= 290400
*
((11*
11*
3)+ 1偏差)=105,415,600 - 使用权值共享的训练参数或权重的数量= 96
*
((11*
11*
3)+1个偏差)= 34944
LeNet
- conv层的输出宽度:=(((28–5)/ 1)+1= 24(conv层输出宽度)
- conv层中神经元/单位的数量=输出高度
*
输出宽度*
特征图的数量= 24*
24*
6(转换输出量)= 3,456单位 - conv层内的训练参数或权重数(不使用权值共享)= 3456
*
((5*
5*
1)+ 1偏差)=89,856 - 使用权值共享的训练参数或权重的数量= 6
*
((5*
5*
1)+1偏差)= 156
总结
显然,通过参数共享,我们可以减少conv层中的权重数量。
参数共享用于网络中的所有conv层。
参数共享减少了训练时间;这是减少反向传播过程中必须进行的权重更新次数的直接好处。
重申一下,当根据过滤器与卷积层中某个平面内某个单元的输入数据之间的卷积结果生成特征图时就会产生参数共享。此层平面内的所有单元共享相同的权重;因此称为权重/参数共享。
作者:Richmond Alake
deephub翻译组:钱三一
DeepHub
微信号 : deephub-imba
每日大数据和人工智能的重磅干货
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- PHP crypt()函数的用法讲解
- Python如何自动获取目标网站最新通知
- PHP+mysql实现的三级联动菜单功能示例
- Python调用shell cmd方法代码示例解析
- 实例讲解PHP表单处理
- 用python实现名片管理系统
- keras 简单 lstm实例(基于one-hot编码)
- keras用auc做metrics以及早停实例
- Laravel中错误与异常处理的用法示例
- Laravel用户授权系统的使用方法示例
- Yii2结合Workerman的websocket示例详解
- Python使用文件操作实现一个XX信息管理系统的示例
- PHP htmlspecialchars() 函数实例代码及用法大全
- 浅谈keras2 predict和fit_generator的坑
- 使用python实现名片管理系统