一、神经网络 Neural networks
- 在之前我们讨论的classifier都是一维的,我们只有一个参数矩阵W,将输入x与W计算之后直接就得到了输出结果。但是这种模型会遇到一个问题,就是无法很好的处理多模态的输入,因为W的每一行只能为每一个类别提供一种模板template,即它需要把有很强variation的输入数据全部融合到一个template中。
- 现在我们将以上模型拓展为两层模型,也就是两层神经网络。在这里有一个W1和一个W2,W1和之前的一样,是一个combination of various templates,W2是一个weighting matrix,它将赋给W1中各个templates一个权重,将输入数据在每个template上的得分h做一个加权求和操作,得到最终相对于每个类别的得分s。
- 双层神经网络的作用具体来讲,就比如W1给我的horse的template是一个双头马,就像之前说的那样,有一个冲左的脑袋和一个冲右的脑袋。
1、假设我现在输入了一个冲左的马,那么这个输入将会对左脑袋马的template有一个较高的得分h1,对右脑袋马dtemplate有一个较低的得分h2,现在对h1和h2做加权求和,由于h1较高,那么最终求和的结果可能也是马的得分比较高,那么预测结果即为马。
2、那么再假设我现在输入了一个正着的马,那么这个马既不是冲左的,又不是冲右的,它可能在两个template上的得分h1和h2都很一般,但由于我最后要做加权求和,那么可能最终对应马这一类的得分s还是会比较高。
- 下面是一个两层神经网络的实现代码:
其中,N表示输入数据个数,D_in为输入数据维度,H为中间结果的维度,D_out为输出结果的维度。由此可推出x,y,w1,w2的维度分别是多少。之后进行2000轮的迭代,计算出中间结果h和输出结果y_pred,然后算出loss(这里的loss不是classifier里的loss函数,是神经网络的loss)。随后用反向传播算梯度grad,最后更新w1和w2。
二、神经网络
内容基本同人工智能基础课,以下仅进行一些补充。
- 神经网络基本结构
一般以全连接层的层数命名神经网络:
以下是一个神经网络前向传播的过程,反向传播类似,用back propagation就行:
三、卷积神经网络——卷积和池化
1、全连接层 Fully Connected Layer
在一个全连接层中,两层中的所有节点都会相连。在下面这个例子,输入input本来是32 * 32 *3的图片,但却被伸展成了3072 * 1的向量来保证它能和输出层全连接。input层和output层之间通过一个10 * 3072的参数矩阵W作为边权连接起来。
2、卷积层 Convolution Layer
卷积层和全连接层最大的区别在于:卷积层可以保留空间结构。卷积层不会把输入图片拉伸成一维向量,而是会保留其原有的空间结构信息。
- 卷积核 filter,也叫感受野(receptive field)
卷积核的深度会和输入图片的深度一致,如输入图片为32 by 32 by 3,则卷积核的大小可以选取5 by 5 by 3。
卷积核会滑动过整个image,并计算与相应部分image的点积。
- 卷积神经网络的大体架构
输入图片 ——> 一个包含若干卷积层Conv、非线性层(以ReLu为代表)和池化层Pooling layer的网络 ——> 一个全连接层 ——> 输出结果。
如下:
- 卷积神经网络的工作过程
已然学过。
1、步长stride:卷积核每次滑动的pixel数。步长的选择要适应input和filter的大小,不然会产生不对称的output,we don’t want that;
2、output的尺寸:output的尺寸受到input的尺寸、卷积核的尺寸和步长三者的影响。
output_size = (N - F) / stride + 1
其中N为input的尺寸(N by N),F为卷积核的尺寸(F by F),stride为步长。当output_size为整数时,说明它们四个是可以配套的;当输出不为整数时,则需要调整stride或filter_size的取值;
3、零填充边界 zero padding:在输入矩阵的周围一圈/几圈填充上额外的零。这样做的目的在于,如果不进行零填充,那么在边界的那些元素只会和filter进行一次计算,而中间的元素会和卷积核进行三次计算,而在填充了零之后,那些角落里的元素就不再是角落里的元素了,这又所有元素都会和filter进行三次计算;并且在零填充之后,输入和输出的尺寸会保持一致。
一般而言,若 stride = 1:
F = 3 ——> zero pad with 1
F = 5 ——> zero pad with 2
F = 7 ——> zero pad with 3 - 问题&补充
1、一个小问题:
题面里只说了filter的大小是5 by 5,但输入input的大小可是32 by 32 by 3啊!!!说明filter实际大小应该是5 by 5 by 3,它把深度3给省略了,但是你在算的时候不能省略!!!因而单纯的filter总共右5 times 5 times 3 times 10个参数,即750个参数。
但实际上每个filter还会配套有一个bias的!!!因而会有10个额外的bias参数。故总共参数数量为760。
2、1 by 1尺寸的filter有什么用???
1 by 1 的filter就相当于与输入图像某一个位置关于其深度做了一次点积。一个56 by 56 by 64的input和一个1 by 1的filter操作后会变成一个56 by 56 by 1的结果,下图中共有32个卷积核,故计算结果为56 by 56 by 32。
注意!!!卷积层的输出结果的尺寸是 output_size by output_size by filter_num!!!
最后是一个关于卷积层的总结,注意卷积核的数量通常选为2的幂次形式:
3、池化层 pooling layer
- 定义
池化层又叫降采样层 down sampling,是为了让表示representation更小,这样之后会有更少的参数。但池化层的池化处理只会坐在平面上,不会再深度上降采样。因而池化前输入数据的深度和池化后输出数据的深度是一模一样的。
- 最大池化法Max Pooling —— 一种常见的池化方法
和卷积层一样,在最大池化层中,也会有一个filter,它也会按照一定的stride滑动,但不同的是,这里的filter不会和输入数据进行点积操作,而是取输入数据滑动后对应区域中的最大值,将其作为输出结果。如下图,一个2 by 2的卷积核,以步长为2滑动,在红、绿、蓝、黄四个区域中分别取最大值,最终得到右侧的输出。
tips1:通常stride和filter的边长是相近的,以确保区域间无重叠或重叠较少,以达到降采样效果。一般:F = 2或3时 ——> S = 2。
tips2:同时,因为神经网络的每一层都相当于一个激活函数(我们把每一层的输出叫激活图,activated map),因而通常更关注最大值,即用最显著的信号来激活,故最大池化更常用。
tips3:池化时通常不用零填充。
卷积神经网络的典型结构
[(Conv - RELU) * N - POOL?] * M - (FC - RELU) * K, SOFTMAX
通常N最大取到5,M可以很大,K在0到2之间。