Convolution Neural Network (CNN)

这篇博客探讨了使用卷积神经网络(CNN)进行图像分类时如何通过调整网络结构和使用ReLU激活函数、Dropout正则化以及Ensembles方法来提高准确率。实验表明,增加网络深度、使用ReLU和Dropout能有效防止过拟合,扩大训练数据并应用Ensembles策略进一步提升了模型的性能,最终达到99.60%的测试准确率。
摘要由CSDN通过智能技术生成

CNN, gpu, deep network, dropout, ensembles

输入层: 图像像素值

输出层: 0-9

CNN结构很不一样, 输入是一个二维的神经元 (28x28):

保持二维输入(并不像从前转为一维向量)28*28

定义一个n*n(5*5)小部分成为local recepetive fields

小方块连接起来25神经元与下一个神经元相连接

 

local receptives

构建另外一个神经元, 向右移动一个单元,构建下一层,第一个隐藏层比第一个输入小。

stride:每次移动多少。(每次移动想读多少)

共享权重与偏向;每个activation*w

加权求和共享二十五个权重 

从输入到输出,映射方法转化,第一个隐藏层得到三个层。 

 pooling运算

featrue map是一个模子

减少尺寸24*24,2*2最大值向右移动,长和宽缩小一倍

信息浓缩

 

 

取5*5(25个权重)取b,用不同的feature24*24*24 

 通过某一个初始化权重b,对输入层更新并且得到新的mix。有20个24*24

pooling进一步浓缩图像信息,对于24*24变为2*2的map中每四个像素求最大值,映射到一个新的矩阵中。对于图像来讲图像的相对位置比较重要。

加一百个神经元,和十个神经元两两相连。

 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

net = Network([
        ConvPoolLayer(image_shape=(mini_batch_size, 1, 28, 28), 
                      filter_shape=(20, 1, 5, 5), 
                      poolsize=(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 比上次有显著提高

 

再加入一层convolution (共两层):
>>> net = Network([
        ConvPoolLayer(image_shape=(mini_batch_size, 1, 28, 28), 
                      filter_shape=(20, 1, 5, 5), 
                      poolsize=(2, 2)),
        ConvPoolLayer(image_shape=(mini_batch_size, 20, 12, 12), 
                      filter_shape=(40, 20, 5, 5), 
                      poolsize=(2, 2)),
        FullyConnectedLayer(n_in=40*4*4, 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% (再一次刷新)

用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(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(training_data, 60, mini_batch_size, 0.03, 
            validation_data, test_data, lmbda=0.1)

准确率: 99.23 比之前用sigmoid函数的99.06%稍有提高

库大训练集: 每个图像向上,下,左,右移动一个像素
总训练集: 50,000 * 5 = 250,000

$ python expand_mnist.py

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(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)

加入一个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%, 并没有大的提高

有可能overfit

加上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(
            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% 显著提高

epochs: 减少到了40
隐藏层有 1000 个神经元

Ensemble of network: 训练多个神经网络, 投票决定结果, 有时会提高

为何只对最后一层用dropout?

CNN本身的convolution层对于overfitting有防止作用: 共享的权重造成convolution filter强迫对于整个图像进行学习

为什么可以克服深度学习里面的一些困难?

用CNN大大减少了参数数量

用dropout减少了overfitting

用Rectified Linear Units代替了sigmoid, 避免了overfitting, 不同层学习率差别大的问题

用GPU计算更快, 每次更新较少, 但是可以训练很多次

目前的深度神经网络有多深? (多少层)?

最多有20多层

如何实现cnn

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值