卷积神经网络
Convolution Neural Network
- CNN将输入数据看成三维的张量 (Tensor), 之前的NN把输入数据看作向量
- 引入 Convolution (卷积) 操作, 单元变成卷积核, 部分连接共享权重. 一个卷积核处理一个三维的张量, 得到一个两维的张量.
- 引入 Pooling (采样) 操作, 降低输入张量的平面尺寸
- , 即邻近样本的非线性组合, 映射在图像领域, 就是可视化的特征; 映射在文本领域, 就是句法和词嵌入之间的关联; 映射在Speech领域, 就是语音音节的处理.
三维张量
Exmaple
img = torch.rand(3,160,320) #D=3(color=RGB),H=160,W=320
itorch.image(img)
卷积
- 卷积核尺寸: DHW, 卷积核的深度和输入图像是一致的.
- 卷积滑动参数: stride/padding
- 每个卷积核带有一个bias
Example http://cs231n.github.io/convolutional-networks/
require('nn')
img = torch.rand(3,5,5) #输入x: 深度为3, 高和宽均为5
conv = nn.SpatialConvolution(3,2,3,3,2,2,1,1)
#参数分别表示输入深度(3),卷积核个数(2),卷积核的尺寸(3*3),
h方向的stride(2),w方向的stride(2),
h方向的padding大小(1),w方向的padding大小(1)(padding:补0或补重复数)
img_out=conv:forward(img) #Forward计算
Pooling
- 改变图像尺寸的操作, 可以逐层的把图像尺寸一点点降下来, 减少维度
- max pool / average pool
Example
require('nn')
img = torch.rand(1,6,6)
pooling = nn.SpatialMaxPooling(2,2,2,2)
#Pooling的长宽均为2,上下的步长均为2
img_out=pooling:forward(img)
Batched Normalization
- Input: Values of over a mini-batch: ; Parameters to be learned:
- Output:
Example:
require('nn')
img = torch.rand(4,4)
bn = nn.BatchNormalization(4,4)
img_out = bn:forward(img)
卷积网络设计
针对图像识别:
- 尽量使用33尺寸的卷积核, 甚至更小(22或1*1); stride取1(第一层可以采用稍大尺寸的卷积核)
- 使用Pooling(2*2)对网络进行1/4下采样
- 采用多层次架构, 采用残差结构实现更深的网络
- Patter设计
- [Conv-ReLU-Pool]N + [FC-ReLU]M + Softmax
- [Conv-ReLU-Conv-ReLU-Pool]N + [FC-ReLU]M + Softmax
- 注意最后一层FC(Full connected,全连接), 不采用ReLU激活函数
卷积网络中的正则化
- 训练时, 对图像增加随机噪声
- 在257257图像中, 随机采样224224的子图
- 图像采用随机左右镜像
- 在FC层之间使用Dropout技术
- 尝试BN, 残差网络结构
残差网络结构
实战
Example: Deep Dream
反馈与建议
- 微博:@Girl_AI