深度学习- 卷积神经网络Convolution Nerual Network(CNN)算法
2018-01-28 15:50
781 查看
学习彭亮《深度学习进阶:算法与应用》课程
MNIST结果达到接近人肉眼识别水平:
9,967 / 10,000 识别正确,下是误识别的图片
右上角为真实数字,右下角为识别出来的
之前的神经网络
相邻层之前所有的神经元都两两相连
输入层: 图像像素值
输出层: 0-9
CNN结构很不一样, 输入是一个二维的神经元 (28x28):
Local receptive fields:
假设选取的为5*5:
整体玩右移动一格:
28x28的神经网络, 5x5的小方格 => 第一个隐藏层的神经网络:24x24
stride: 每次移动多少(这里=5)
共享权重和偏向(shared weights and biases):
l:第几行 0-4共5行
m:第几列 0-4共5列
w:5*5
Feature map: 从输入层转化到输出层
假设有3个Feature map
以上3个feature maps, 每个是5x5
通过feature maps可进行Convolution运算,运算后得出一些训练好的特征值。
通常一些表现较好的方法都使用更多的feature map:
以上是根据5x5的feature map学习出的特征值。
浅色代表更小的权重(负数),表明CNN在学习
优势:共享的权重和偏向(weights, bias)大大减少了参数的数量:
对于每一个feature map, 需要 5x5=25个权重参数, 加上1个偏向b, 26个
如果有20个feature maps, 总共26x20=520个参数就可以定义CNN
如果像之前的神经网络, 两两相连, 需要 28x28 = 784 输入层, 加上第一个隐藏层30个神经元, 则需要784x30再加上30个b, 总共23,550个参数! 多了40倍的参数.
也可以写成:
Pooling layers:浓缩神经网聚的代表性, 减小尺寸:
即2*2的方框中的最大值。
24x24 , 2x2 pooling => 12x12
多个feature maps:
重要特征点找到之后, 绝对位置并不重要, 相对位置更加重要
其他pooling: L2 pooling, 平方和开方
以上所有步骤结合在一起:
训练神经网络时还是用Backpropagation, gradient descent解决
3层
隐藏层: 100个神经元
训练60个epochs
学习率 = 0.1
mini-batch size: 10
结果: 97.8 accuracy (之前98.04%)
这次: 没有regularization, 之前有
这次: softmax 之前: sigmoid + cross-entropy
结果: 98.78 accuracy 比上次有显著提高
结果: 99.06 accuracy (再一次刷新)
结果: 99.23 accuracy 比之前用sigmoid函数的99.06%稍有提高
结果: 99.37 accuracy 比之前用sigmoid函数的99.06%稍有提高
结果: 99.43 accuracy , 并没有大的提高,因为有可能overfit
结果: 99.60 accuracy 显著提高
用dropout减少了overfitting
用Rectified Linear Units代替了sigmoid, 避免了overfitting, 不同层学习率差别大的问题
用GPU计算更快, 每次更新较少, 但是可以训练很多次
Convolution Nerual Network介绍
目前总体来讲最流行, 表现最好的算法,尤其是对于图像处理方面:Convolution Neural Network (CNN)MNIST结果达到接近人肉眼识别水平:
9,967 / 10,000 识别正确,下是误识别的图片
右上角为真实数字,右下角为识别出来的
之前的神经网络
相邻层之前所有的神经元都两两相连
输入层: 图像像素值
输出层: 0-9
CNN结构很不一样, 输入是一个二维的神经元 (28x28):
Local receptive fields:
假设选取的为5*5:
整体玩右移动一格:
28x28的神经网络, 5x5的小方格 => 第一个隐藏层的神经网络:24x24
stride: 每次移动多少(这里=5)
共享权重和偏向(shared weights and biases):
l:第几行 0-4共5行
m:第几列 0-4共5列
w:5*5
Feature map: 从输入层转化到输出层
假设有3个Feature map
以上3个feature maps, 每个是5x5
通过feature maps可进行Convolution运算,运算后得出一些训练好的特征值。
通常一些表现较好的方法都使用更多的feature map:
以上是根据5x5的feature map学习出的特征值。
浅色代表更小的权重(负数),表明CNN在学习
优势:共享的权重和偏向(weights, bias)大大减少了参数的数量:
对于每一个feature map, 需要 5x5=25个权重参数, 加上1个偏向b, 26个
如果有20个feature maps, 总共26x20=520个参数就可以定义CNN
如果像之前的神经网络, 两两相连, 需要 28x28 = 784 输入层, 加上第一个隐藏层30个神经元, 则需要784x30再加上30个b, 总共23,550个参数! 多了40倍的参数.
也可以写成:
Pooling layers:浓缩神经网聚的代表性, 减小尺寸:
即2*2的方框中的最大值。
24x24 , 2x2 pooling => 12x12
多个feature maps:
重要特征点找到之后, 绝对位置并不重要, 相对位置更加重要
其他pooling: L2 pooling, 平方和开方
以上所有步骤结合在一起:
训练神经网络时还是用Backpropagation, gradient descent解决
Convolution Nerual Network结果
20个feature maps(1)不加convolution层:
基准:3层
隐藏层: 100个神经元
训练60个epochs
学习率 = 0.1
mini-batch size: 10
import network3 from network3 import Network from network3 import ConvPoolLayer, FullyConnectedLayer, SoftmaxLayer training_data, validation_data, test_data = network3.load_data_shared() mini_batch_size = 10 net = Network([ FullyConnectedLayer(n_in=784, n_out=100), SoftmaxLayer(n_in=100, n_out=10)], mini_batch_size) net.SGD(training_data, 60, mini_batch_size, 0.1, validation_data, test_data)
结果: 97.8 accuracy (之前98.04%)
这次: 没有regularization, 之前有
这次: softmax 之前: sigmoid + cross-entropy
(2)加入convolution层:
net = Network([ # ConvPoolLayer即加上convolution和pooling ConvPoolLayer( image_shape=(mini_batch_size, 1, 28, 28),# 28*28的形状 之前是784*1 filter_shape=(20, 1, 5, 5),# 小方框 20个 5*5的 poolsize=(2, 2)),# pooling的大小2*2 FullyConnectedLayer(n_in=20*12*12, n_out=100), SoftmaxLayer(n_in=100, n_out=10)], mini_batch_size) net.SGD(training_data, 60, mini_batch_size, 0.1, validation_data, test_data)
结果: 98.78 accuracy 比上次有显著提高
(3)再加一层convolution层:
net = Network([ ConvPoolLayer(image_shape=(mini_batch_size, 1, 28, 28), filter_shape=(20, 1, 5, 5), poolsize=(2, 2)), # ConvPoolLayer即加上convolution和pooling ConvPoolLayer( image_shape=(mini_batch_size, 1, 28, 28),# 28*28的形状 之前是784*1 filter_shape=(20, 1, 5, 5),# 小方框 20个 5*5的 poolsize=(2, 2)),# pooling的大小2*2 FullyConnectedLayer(n_in=20*12*12, n_out=100), SoftmaxLayer(n_in=100, n_out=10)], mini_batch_size) net.SGD(training_data, 60, mini_batch_size, 0.1, validation_data, test_data)
结果: 99.06 accuracy (再一次刷新)
(4)用Rectified Linear Units代替
之前说过不同层学习率差别较大,用Rectified Linear Units代替sigmoid:f(z) = max(0, z)可以避免net = Network([ ConvPoolLayer(image_shape=(mini_batch_size, 1, 28, 28), filter_shape=(20, 1, 5, 5), poolsize=(2, 2), activation_fn=ReLU), # ConvPoolLayer即加上convolution和pooling ConvPoolLayer( image_shape=(mini_batch_size, 1, 28, 28),# 28*28的形状 之前是784*1 filter_shape=(20, 1, 5, 5),# 小方框 20个 5*5的 poolsize=(2, 2), activation_fn=ReLU),# pooling的大小2*2 FullyConnectedLayer(n_in=20*12*12, n_out=100), SoftmaxLayer(n_in=100, n_out=10)], mini_batch_size) net.SGD(training_data, 60, mini_batch_size, 0.1, validation_data, test_data)
结果: 99.23 accuracy 比之前用sigmoid函数的99.06%稍有提高
(5)扩大训练集(DATA AUGMENTATION): 每个图像向上,下,左,右移动一个像素
总训练集: 50,000 * 5 = 250,000expanded_training_data, _, _ = network3.load_data_shared( "../data/mnist_expanded.pkl.gz") net = Network([ ConvPoolLayer(image_shape=(mini_batch_size, 1, 28, 28), filter_shape=(20, 1, 5, 5), poolsize=(2, 2), activation_fn=ReLU), ConvPoolLayer(image_shape=(mini_batch_size, 20, 12, 12), filter_shape=(40, 20, 5, 5), poolsize=(2, 2), activation_fn=ReLU), FullyConnectedLayer(n_in=40*4*4, n_out=100, activation_fn=ReLU), SoftmaxLayer(n_in=100, n_out=10)], mini_batch_size) net.SGD(expanded_training_data, 60, mini_batch_size, 0.03, validation_data, test_data, lmbda=0.1)
结果: 99.37 accuracy 比之前用sigmoid函数的99.06%稍有提高
(6)再加入一个100个神经元的隐藏层在fully-connected层:
net = Network([ ConvPoolLayer(image_shape=(mini_batch_size, 1, 28, 28), filter_shape=(20, 1, 5, 5), poolsize=(2, 2), activation_fn=ReLU), ConvPoolLayer(image_shape=(mini_batch_size, 20, 12, 12), filter_shape=(40, 20, 5, 5), poolsize=(2, 2), activation_fn=ReLU), FullyConnectedLayer(n_in=40*4*4, n_out=100, activation_fn=ReLU), FullyConnectedLayer(n_in=100, n_out=100, activation_fn=ReLU), SoftmaxLayer(n_in=100, n_out=10)], mini_batch_size) net.SGD(expanded_training_data, 60, mini_batch_size, 0.03, validation_data, test_data, lmbda=0.1)
结果: 99.43 accuracy , 并没有大的提高,因为有可能overfit
(7)加上dropout到最后一个fully-connected层:
expanded_training_data, _, _ = network3.load_data_shared( "../data/mnist_expanded.pkl.gz") net = Network([ ConvPoolLayer(image_shape=(mini_batch_size, 1, 28, 28), filter_shape=(20, 1, 5, 5), poolsize=(2, 2), activation_fn=ReLU), ConvPoolLayer(image_shape=(mini_batch_size, 20, 12, 12), filter_shape=(40, 20, 5, 5), poolsize=(2, 2), activation_fn=ReLU), FullyConnectedLayer( #使用dropout p_dropout=0.5即一半的数据 n_in=40*4*4, n_out=1000, activation_fn=ReLU, p_dropout=0.5), FullyConnectedLayer( n_in=1000, n_out=1000, activation_fn=ReLU, p_dropout=0.5), SoftmaxLayer(n_in=1000, n_out=10, p_dropout=0.5)], mini_batch_size) net.SGD(expanded_training_data, 40, mini_batch_size, 0.03, validation_data, test_data)
结果: 99.60 accuracy 显著提高
(8)Ensemble of network
训练多个神经网络, 投票决定结果, 有时会提高结束
为何只对最后一层用dropout,不对Convolution用dropout?
CNN本身的convolution层对于overfitting有防止作用: 共享的权重造成convolution filter强迫对于整个图像进行学习为什么可以克服深度学习里面的一些困难?
用CNN大大减少了参数数量用dropout减少了overfitting
用Rectified Linear Units代替了sigmoid, 避免了overfitting, 不同层学习率差别大的问题
用GPU计算更快, 每次更新较少, 但是可以训练很多次
目前的深度神经网络有多深? (多少层)?
最多有20多层代码实现Convolution Nerual Network
官方源码:https://github.com/mnielsen/neural-networks-and-deep-learning相关文章推荐
- 深度学习算法实践10---卷积神经网络(CNN)原理
- 深度学习算法实践11---卷积神经网络(CNN)之卷积操作
- 深度学习算法实践11---卷积神经网络(CNN)之卷积操作
- 深度学习算法实践12---卷积神经网络(CNN)实现
- 深度学习算法实践12---卷积神经网络(CNN)实现
- 干货 | 深度学习之卷积神经网络(CNN)的前向传播算法详解
- 深度学习算法实践11---卷积神经网络(CNN)之卷积操作
- 深度学习算法实践10---卷积神经网络(CNN)原理
- 深度学习:应用于机器视觉领域的卷积神经网络(CNN)简介
- 深度学习算法之CNN、RNN、LSTM公式推导
- 深度学习|卷积神经网络(CNN)介绍(前篇)
- 深度学习(DL)与卷积神经网络(CNN)学习-01-CNN基础知识点
- 卷积神经网络CNN与深度学习常用框架的介绍与使用
- 深度学习_卷积神经网络CNN
- 从软件工程的角度写机器学习6——深度学习之卷积神经网络(CNN)实现
- 深度学习算法之CNN、RNN、LSTM公式推导
- 深度学习之卷积神经网络CNN及tensorflow代码实现示例
- 七月算法深度学习笔记5--CNN训练注意事项与框架使用
- 深度学习(DL)与卷积神经网络(CNN)学习笔记随笔-02-基于Python的卷积运算
- 深度学习:卷积神经网络CNN