MXNET:卷积神经网络基础
卷积神经网络(convolutional neural network)。它是近年来深度学习能在计算机视觉中取得巨大成果的基石,它也逐渐在被其他诸如自然语言处理、推荐系统和语音识别等领域广泛使用。
目前我关注的问题是:
- 输入数据的构建,尤其是多输入、多输出的情况。
- finetune的实现,如何将已训练网络的部分层拿出来作为其他网络的一部分。
二维卷积层
二维卷积:

实现如下:
def corr2d(X, K):
h, w = K.shape
Y = nd.zeros((X.shape[0] - h + 1, X.shape[1] - w + 1))
for i in range(Y.shape[0]):
for j in range(Y.shape[1]):
Y[i, j] = (X[i : i + h, j : j + w] * K).sum()
return Y
X = nd.array([[0, 1, 2], [3, 4, 5], [6, 7, 8]])
K = nd.array([[0, 1], [2, 3]])
corr2d(X, K)
# output
[[ 19. 25.]
[ 37. 43.]]
<NDArray 2x2 @cpu(0)>
二维卷积层就是将输入和卷积核做相关运算,然后加上一个标量偏差来得到输出。
class Conv2D(nn.Block):
def __init__(self, kernel_size, **kwargs):
super(Conv2D, self).__init__(**kwargs)
self.weight = self.params.get('weight', shape=kernel_size)
self.bias = self.params.get('bias', shape=(1,))
def forward(self, x):
return corr2d(x, self.weight.data()) + self.bias.data()
卷积运算的计算与二维相关运算类似,唯一的区别是反向的将核数组跟输入做乘法,即 Y[0, 0] = (X[0:2, 0:2] * K[::-1, ::-1]).sum()。
但是因为在卷积层里 K 是学习而来的,所以不论是正向还是反向访问都可以。
通过数据学习核数组
虽然我们之前构造了 Conv2D 类,但由于 corr2d 使用了对单个元素赋值([i, j]=)的操作会导致无法自动求导,下面我们使用 Gluon 提供的 Conv2D 类来实现这个例子。
# 构造一个输出通道是 1(将在后面小节介绍通道),核数组形状是 (1,2) 的二维卷积层。
conv2d = nn.Conv2D(1, kernel_size=(1, 2))
conv2d.initialize()
# 二维卷积层使用 4 维输入输出,格式为(批量大小,通道数,高,宽),这里批量和通道均为 1。
X = X.reshape((1, 1, 6, 8))
Y = Y.reshape((1, 1, 6, 7))
for i in range(10):
with autograd.record():
Y_hat = conv2d(X)
l = (Y_hat-Y) ** 2
if i % 2 == 1:
print('batch %d, loss %.3f' % (i, l.sum().asscalar()))
l.backward()
# 为了简单起见这里忽略了偏差。
conv2d.weight.data()[:] -= 3e-2 * conv2d.weight.grad()
填充和步幅
一般来说,假设输入形状是 \(n_h×n_w\),卷积核形状是 \(k_h×k_w\),那么输出形状将会是
\]
所以卷积层的输出形状由输入形状和卷积核形状决定。下面我们将介绍卷积层的两个超参数,填充和步幅,它们可以在给定形状的输入和卷积核下来改变输出形状。
填充是指在输入高和宽的两端填充元素。如果在高两侧一共填充 \(p_h\) 行,在宽两侧一共填充 \(p_w\) 列,那么输出形状将会是
\]
通常我们会设置 \(p_h=k_h−1\) 和 \(p_w=k_w−1\) 使得输入和输出有相同的高宽,这样方便在构造网络时容易推测每个层的输出形状。假设这里 \(k_h\) 是奇数,我们会在高的两侧分别填充 \(p_h/2\) 行。如果其是偶数,一种可能是上面填充 \(\lceil p_h/2\rceil\) 行,而下面填充 \(\lfloor p_h/2\rfloor\) 行。在宽上行为类似。
卷积神经网络经常使用奇数高宽的卷积核,例如 1、3、5、和 7,所以填充在两端上是对称的。
# 注意这里是两侧分别填充 1,所以 p_w = p_h = 2。
conv2d = nn.Conv2D(1, kernel_size=3, padding=1)
conv2d.initialize()
X = nd.random.uniform(shape=(8, 8))
X = X.reshape((1, 1,) + X.shape)
Y = conv2d(X)
print Y.shape[2:]
# output
(8, 8)
当然我们可以使用非方形卷积核,使用对应的填充同样可得相同高宽的输出。
conv2d = nn.Conv2D(1, kernel_size=(5, 3), padding=(2, 1))
前面的例子中,在高和宽两个方向上步幅均为 1。自然我们可以使用更大步幅。
一般来说,如果在高上使用步幅 \(s_h\),在宽上使用步幅 \(s_w\),那么输出大小将是
\]
如果我们设置\(p_h=k_h−1\) 和 \(p_w=k_w−1\),那么输出大小为\(\lfloor(n_h+s_h-1)/s_h\rfloor \times \lfloor(n_w+s_w-1)/s_w\rfloor\).更进一步,如果输出高宽能分别被高宽上的步幅整除,那么输出将是 \(n_h/s_h \times n_w/s_w\)。也就是说我们成倍的减小了输入的高宽。
conv2d = nn.Conv2D(1, kernel_size=3, padding=1, strides=2)
conv2d = nn.Conv2D(1, kernel_size=(3, 5), padding=(0, 1), strides=(3, 4))
# output
(4, 4)
(2, 2)
通道
下图展示了输入通道是 2 的一个例子

输入是\(c_i\)通道时,需要一个\(c_i \times k_h \times k_w\)的卷积核。在每个通道里对相应的输入矩阵和核矩阵做相关计算,然后再将通道之间的结果相加得到最终结果。
上面是\(c_o=1\)的情况,如果是多通道输出,那么卷积核的形状变为:\(c_o \times c_i \times k_h \times k_w\).
1x1卷积层
因为使用了最小窗口,它失去了卷积层可以识别高宽维上相邻元素构成的模式的功能,它的主要计算则是在通道维上。

在之后的模型里我们将会看到 1×1 卷积层是如何当做保持高宽维形状的全连接层使用,其作用是通过调整网络层之间的通道数来控制模型复杂度。
池化层
池化层提出可以缓解卷积层对位置的过度敏感性,也为了降低显存。
同卷积层一样,池化层也可以填充输入高宽两侧的数据和调整窗口的移动步幅来改变输出大小。
我们先构造一个 (1, 1, 4, 4) 形状的输入数据,前两个维度分别是批量和通道。
X = nd.arange(16).reshape((1, 1, 4, 4))
MaxPool2D 类里默认步幅设置成跟池化窗大小一样。下面使用 (3, 3) 窗口,默认获得 (3, 3) 步幅。
pool2d = nn.MaxPool2D(3)
# 因为池化层没有模型参数,所以不需要调用参数初始化函数。
pool2d(X)
# output
[[[[ 10.]]]]
<NDArray 1x1x1x1 @cpu(0)>
我们可以手动指定步幅和填充。
pool2d = nn.MaxPool2D(3, padding=1, strides=2)
pool2d = nn.MaxPool2D((2, 3), padding=(1, 2), strides=(2, 3))
MXNET:卷积神经网络基础的更多相关文章
- 【原创 深度学习与TensorFlow 动手实践系列 - 3】第三课:卷积神经网络 - 基础篇
[原创 深度学习与TensorFlow 动手实践系列 - 3]第三课:卷积神经网络 - 基础篇 提纲: 1. 链式反向梯度传到 2. 卷积神经网络 - 卷积层 3. 卷积神经网络 - 功能层 4. 实 ...
- 动手学习Pytorch(6)--卷积神经网络基础
卷积神经网络基础 本节我们介绍卷积神经网络的基础概念,主要是卷积层和池化层,并解释填充.步幅.输入通道和输出通道的含义. 二维卷积层 本节介绍的是最常见的二维卷积层,常用于处理图像数据. 二维 ...
- L15卷积神经网络基础
卷积神经网络基础 本节我们介绍卷积神经网络的基础概念,主要是卷积层和池化层,并解释填充.步幅.输入通道和输出通道的含义. 二维卷积层 本节介绍的是最常见的二维卷积层,常用于处理图像数据. 二维互相关运 ...
- DeepLearning.ai学习笔记(四)卷积神经网络 -- week1 卷积神经网络基础知识介绍
一.计算机视觉 如图示,之前课程中介绍的都是64* 64 3的图像,而一旦图像质量增加,例如变成1000 1000 * 3的时候那么此时的神经网络的计算量会巨大,显然这不现实.所以需要引入其他的方法来 ...
- 深度学习笔记 (一) 卷积神经网络基础 (Foundation of Convolutional Neural Networks)
一.卷积 卷积神经网络(Convolutional Neural Networks)是一种在空间上共享参数的神经网络.使用数层卷积,而不是数层的矩阵相乘.在图像的处理过程中,每一张图片都可以看成一张“ ...
- 卷积神经网络基础(CNN)【转载】
作者: Sanjay Chan [ http://blog.csdn.net/chenzomi ] 背景 之前在网上搜索了好多好多关于CNN的文章,由于网络上的文章很多断章取义或者描述不清晰,看了很多 ...
- Coursera Deep Learning笔记 卷积神经网络基础
参考1 参考2 1. 计算机视觉 使用传统神经网络处理机器视觉的一个主要问题是输入层维度很大.例如一张64x64x3的图片,神经网络输入层的维度为12288. 如果图片尺寸较大,例如一张1000x10 ...
- mxnet卷积神经网络训练MNIST数据集测试
mxnet框架下超全手写字体识别—从数据预处理到网络的训练—模型及日志的保存 import numpy as np import mxnet as mx import logging logging. ...
- Deep Learning.ai学习笔记_第四门课_卷积神经网络
目录 第一周 卷积神经网络基础 第二周 深度卷积网络:实例探究 第三周 目标检测 第四周 特殊应用:人脸识别和神经风格转换 第一周 卷积神经网络基础 垂直边缘检测器,通过卷积计算,可以把多维矩阵进行降 ...
随机推荐
- iOS企业版应用发布(部分低版本系统)无法安装到最新版app的问题-缓存导致
通过自己网站发布企业版app时,经过测试发现在部分已安装过旧版app的低版本ios手机存在这样的问题 :扫码覆盖安装新版app,安装到的仍然是就版本的app.这样就导致部分用户一直无法更新到最新版本. ...
- LVN与其在Linux上的实现
参考资料: LVM详解-骏马金龙-博客园 How to reduce the size of an LVM partition formatted with xfs filesystem on Cen ...
- 每日踩坑 2018-01-09 WebAPI会如何面对 枚举 参数?
这一块确实有些疑问, 众所周知 枚举参数我们传送枚举值所对应的数字就行了, 以前 Leader 跟我讲过,枚举参数会将字符串值也能够成功转化,而且枚举值定义之外的数字也可以被转为枚举值. 主要的问题在 ...
- Python图形编程探索系列-03-标签组件(Label)
跳转到自己的博客 tkinter.Label介绍 什么是标签? 通俗的将就相当于word的功能,能够进行显示不可修改的文字.图片或者图文混排. 直观体会一下 图1 背景图构成:内容区(黑色),填充区( ...
- Java并发程序设计(七)乐天派:无锁
无锁 一.概述 无锁是处理并发的一种乐观策略,它会假设对资源的访问是没有冲突的.既然没有冲突自然不需要等待,所以所有的线程都可以在不停顿的状态下执行.那遇到冲突怎么办?接下来请看,无锁绝招“CAS”即 ...
- 潭州课堂25班:Ph201805201 爬虫基础 第十五课 js破解 二 (课堂笔记)
PyExecJs使用 PyExecJS是Ruby的ExecJS移植到Python的一个执行JS代码的库. 安装 pip install PyExecJS 例子 >>> import ...
- Mysql 登录及用户切换、用户权限查询
启动mysql: 方法一:net start mysql(或者是其他服务名) 方法二:在windows下启动MySQL服务 MySql安装目录:"d:\MySql\" 进入命令行输 ...
- scrollview滑动到某区域执行某种方法
在这里通过 offset.y 检测滑动到的区域 通过if 语句执行需要的方法 -(void)scrollViewDidScroll:(UIScrollView *)scrollView { ...
- VirtualBox 扩展包卸载或安装失败(VERR_ALREADY_EXISTS)(转)
文章出处:http://blog.csdn.net/leshami/article/details/9232229 最近在卸载VirtualBox出现了无法卸载的错误.提示为Failed to ins ...
- reac-native环境搭建
转载链接:http://www.ncloud.hk/%E6%8A%80%E6%9C%AF%E5%88%86%E4%BA%AB/react-native%E7%8E%AF%E5%A2%83%E6%90% ...