本月累计签到次数:

今天获取 积分

卷积神经网络

卷积神经网络

385 浏览

TensorFlow(三)——卷积神经网络用于手写字识别

机械自动化类 机械设计 2016-12-09 09:43 发表了文章 来自相关话题

往期TensorFlow教程系列延伸阅读:

TensorFlow(一)——基础图模型
TensorFlow(二)——逻辑回归




1. 导入基本库

这期讲解如何运用TensorFlow来建立一个卷积神经网络用于手写字识别。首先导入一些必备的库。

import tensorflow as tf


import tensorflow.examples.tutorials.mnist.input_data as input_data

from libs.utils import *

import matplotlib.pyplot as plt




2.新建权重函数和偏置函数

首先我们写两个通用函数,权重变量和偏置向量,传入的参数都是维度信息,并且都是使用高斯随机分布来产生初始值。

def weight_variable(shape):

    initial = tf.random_normal(shape, mean=0.0, stddev=0.01)

    return tf.Variable(initial)



def bias_variable(shape):

    initial = tf.random_normal(shape, mean=0.0, stddev=0.01)

    return tf.Variable(initial)




3.新建输入输出有关的占位符

这里我们使用的训练数据是MNIST手写字识别数据库,手写字识别数据库中的每张图片是28*28大小,然后手写字一共是十种类别,即1234567890,所以这里我们首先新建两个占位符,分别是输入数据x和标签数据y,其中None代表batch那个维度大小目前还无法确定。

mnist = input_data.read_data_sets('MNIST_data/', one_hot=True)

x = tf.placeholder(tf.float32, [None, 784])

y = tf.placeholder(tf.float32, [None, 10])




4.构造两层卷积神经网络

由于这里我们想运用卷积神经网络,因此首先需要把数据数据的维度变成4-D形式,即(batch_size,width,height,channel),所以这里width和height我们设置为28,channel为1,而batch_size设置为-1的意思是这个维度只用把总维度去除以width*height*channel即可得到。

x_tensor = tf.reshape(x, [-1, 28, 28, 1])



接下来我们需要设置卷积感知区域的大小以及卷积核的个数,这里我们设置感知区域的大小为3*3,卷积核的个数为16,这样就构建了权重矩阵。而偏置对于每个卷积核都是共享的,因此偏置是一个长度为n_filters_1的向量。

filter_size = 3

n_filters_1 = 16


W_conv1 = weight_variable([filter_size, filter_size, 1, n_filters_1])

b_conv1 = bias_variable([n_filters_1])



接下来我们可以构建第一个卷积层,我们知道,卷积层出了感知区域大小、卷积核个数两个属性以外,它还包括滑动步长、是否铺平等。所以,这里我们调用tf.nn.conv2d函数,输入数据是x_tensor,而卷积核就是权重矩阵,我们同时设置strides为2*2,即每次在height维度以及width维度滑动步长均为2,而padding设置为'same',即满足了卷积前与卷积后的数据维度一致。除此之外,我们还在卷积后加了偏置向量,并且最终通过了elu激活函数。

h_conv1 = tf.nn.elu(

    tf.nn.conv2d(input=x_tensor,

                 filter=W_conv1,

                 strides=[1, 2, 2, 1],

                 padding='SAME') +

    b_conv1)



为了使得识别准确率较高,我们在第一层卷积输出的基础上,再添一层卷积神经网络,同理,添加方法与第一层基本类似,只不过这里的输入由x_tensor改变为了h_conv1,并且卷积核和偏置向量都是不同的。

n_filters_2 = 16

W_conv2 = weight_variable([filter_size, filter_size, n_filters_1, n_filters_2])

b_conv2 = bias_variable([n_filters_2])

h_conv2 = tf.nn.elu(

    tf.nn.conv2d(input=h_conv1,

                 filter=W_conv2,

                 strides=[1, 2, 2, 1],

                 padding='SAME') +

    b_conv2)




5.添加全连接隐含层

接下来,我们将添加几个全连接层,第一个全连接层充当一种特征变换的作用,或者可以称为隐含层。在由卷积层过渡到隐含层之间,需要对卷积层的输出做一个维度变换,这里我们把维度变换成(batch_size,num_units)的形式。

h_conv2_flat = tf.reshape(h_conv2, [-1, 7 * 7 * n_filters_2])



创造一个全连接层,隐含层神经元个数为1024,然后通过一个非线性函数elu。

n_fc = 1024

W_fc1 = weight_variable([7 * 7 * n_filters_2, n_fc])

b_fc1 = bias_variable([n_fc])

h_fc1 = tf.nn.elu(tf.matmul(h_conv2_flat, W_fc1) + b_fc1)




6.添加Dropout防止过拟合

为了防止出现过拟合,我们设置一个神经元保留概率keep_prob,然后对输出层进行dropout操作。

keep_prob = tf.placeholder(tf.float32)

h_fc1_drop = tf.nn.dropout(h_fc1, keep_prob)




7.添加Softmax层

最后一层我们加上softmax操作,得到关于10个数字的分类概率。

W_fc2 = weight_variable([n_fc, 10])

b_fc2 = bias_variable([10])

y_pred = tf.nn.softmax(tf.matmul(h_fc1_drop, W_fc2) + b_fc2)




8.获取目标函数

根据交叉熵公式得到误差函数,并且建立Adam优化器。

cross_entropy = -tf.reduce_sum(y * tf.log(y_pred))

optimizer = tf.train.AdamOptimizer().minimize(cross_entropy)




计算分类正确率。

correct_prediction = tf.equal(tf.argmax(y_pred, 1), tf.argmax(y, 1))

accuracy = tf.reduce_mean(tf.cast(correct_prediction, 'float'))




9.新建会话并进行mini-batch训练

新建一个会话,并且初始化所有变量。

sess = tf.Session()

sess.run(tf.initialize_all_variables())




这里使用mini-batch来训练,设置mini-batch大小为100,设置迭代周期为5,注意这里每次run的是优化器。

batch_size = 100

n_epochs = 5

for epoch_i in range(n_epochs):

    for batch_i in range(mnist.train.num_examples // batch_size):

        batch_xs, batch_ys = mnist.train.next_batch(batch_size)

        sess.run(optimizer, feed_dict={

            x: batch_xs, y: batch_ys, keep_prob: 0.5})

    print(sess.run(accuracy,

                   feed_dict={

                       x: mnist.validation.images,

                       y: mnist.validation.labels,

                       keep_prob: 1.0

                   }))

(程序结果运行需要下载mnist手写字识别数据库)

 
 
 
 
来源:张泽旺 深度学习每日摘要
智造家 查看全部
往期TensorFlow教程系列延伸阅读:

TensorFlow(一)——基础图模型
TensorFlow(二)——逻辑回归





1. 导入基本库

这期讲解如何运用TensorFlow来建立一个卷积神经网络用于手写字识别。首先导入一些必备的库。

import tensorflow as tf


import tensorflow.examples.tutorials.mnist.input_data as input_data

from libs.utils import *

import matplotlib.pyplot as plt




2.新建权重函数和偏置函数

首先我们写两个通用函数,权重变量和偏置向量,传入的参数都是维度信息,并且都是使用高斯随机分布来产生初始值。

def weight_variable(shape):

    initial = tf.random_normal(shape, mean=0.0, stddev=0.01)

    return tf.Variable(initial)



def bias_variable(shape):

    initial = tf.random_normal(shape, mean=0.0, stddev=0.01)

    return tf.Variable(initial)




3.新建输入输出有关的占位符

这里我们使用的训练数据是MNIST手写字识别数据库,手写字识别数据库中的每张图片是28*28大小,然后手写字一共是十种类别,即1234567890,所以这里我们首先新建两个占位符,分别是输入数据x和标签数据y,其中None代表batch那个维度大小目前还无法确定。

mnist = input_data.read_data_sets('MNIST_data/', one_hot=True)

x = tf.placeholder(tf.float32, [None, 784])

y = tf.placeholder(tf.float32, [None, 10])




4.构造两层卷积神经网络

由于这里我们想运用卷积神经网络,因此首先需要把数据数据的维度变成4-D形式,即(batch_size,width,height,channel),所以这里width和height我们设置为28,channel为1,而batch_size设置为-1的意思是这个维度只用把总维度去除以width*height*channel即可得到。

x_tensor = tf.reshape(x, [-1, 28, 28, 1])



接下来我们需要设置卷积感知区域的大小以及卷积核的个数,这里我们设置感知区域的大小为3*3,卷积核的个数为16,这样就构建了权重矩阵。而偏置对于每个卷积核都是共享的,因此偏置是一个长度为n_filters_1的向量。

filter_size = 3

n_filters_1 = 16


W_conv1 = weight_variable([filter_size, filter_size, 1, n_filters_1])

b_conv1 = bias_variable([n_filters_1])



接下来我们可以构建第一个卷积层,我们知道,卷积层出了感知区域大小、卷积核个数两个属性以外,它还包括滑动步长、是否铺平等。所以,这里我们调用tf.nn.conv2d函数,输入数据是x_tensor,而卷积核就是权重矩阵,我们同时设置strides为2*2,即每次在height维度以及width维度滑动步长均为2,而padding设置为'same',即满足了卷积前与卷积后的数据维度一致。除此之外,我们还在卷积后加了偏置向量,并且最终通过了elu激活函数。

h_conv1 = tf.nn.elu(

    tf.nn.conv2d(input=x_tensor,

                 filter=W_conv1,

                 strides=[1, 2, 2, 1],

                 padding='SAME') +

    b_conv1)



为了使得识别准确率较高,我们在第一层卷积输出的基础上,再添一层卷积神经网络,同理,添加方法与第一层基本类似,只不过这里的输入由x_tensor改变为了h_conv1,并且卷积核和偏置向量都是不同的。

n_filters_2 = 16

W_conv2 = weight_variable([filter_size, filter_size, n_filters_1, n_filters_2])

b_conv2 = bias_variable([n_filters_2])

h_conv2 = tf.nn.elu(

    tf.nn.conv2d(input=h_conv1,

                 filter=W_conv2,

                 strides=[1, 2, 2, 1],

                 padding='SAME') +

    b_conv2)




5.添加全连接隐含层

接下来,我们将添加几个全连接层,第一个全连接层充当一种特征变换的作用,或者可以称为隐含层。在由卷积层过渡到隐含层之间,需要对卷积层的输出做一个维度变换,这里我们把维度变换成(batch_size,num_units)的形式。

h_conv2_flat = tf.reshape(h_conv2, [-1, 7 * 7 * n_filters_2])



创造一个全连接层,隐含层神经元个数为1024,然后通过一个非线性函数elu。

n_fc = 1024

W_fc1 = weight_variable([7 * 7 * n_filters_2, n_fc])

b_fc1 = bias_variable([n_fc])

h_fc1 = tf.nn.elu(tf.matmul(h_conv2_flat, W_fc1) + b_fc1)




6.添加Dropout防止过拟合

为了防止出现过拟合,我们设置一个神经元保留概率keep_prob,然后对输出层进行dropout操作。

keep_prob = tf.placeholder(tf.float32)

h_fc1_drop = tf.nn.dropout(h_fc1, keep_prob)




7.添加Softmax层

最后一层我们加上softmax操作,得到关于10个数字的分类概率。

W_fc2 = weight_variable([n_fc, 10])

b_fc2 = bias_variable([10])

y_pred = tf.nn.softmax(tf.matmul(h_fc1_drop, W_fc2) + b_fc2)




8.获取目标函数

根据交叉熵公式得到误差函数,并且建立Adam优化器。

cross_entropy = -tf.reduce_sum(y * tf.log(y_pred))

optimizer = tf.train.AdamOptimizer().minimize(cross_entropy)




计算分类正确率。

correct_prediction = tf.equal(tf.argmax(y_pred, 1), tf.argmax(y, 1))

accuracy = tf.reduce_mean(tf.cast(correct_prediction, 'float'))




9.新建会话并进行mini-batch训练

新建一个会话,并且初始化所有变量。

sess = tf.Session()

sess.run(tf.initialize_all_variables())




这里使用mini-batch来训练,设置mini-batch大小为100,设置迭代周期为5,注意这里每次run的是优化器。

batch_size = 100

n_epochs = 5

for epoch_i in range(n_epochs):

    for batch_i in range(mnist.train.num_examples // batch_size):

        batch_xs, batch_ys = mnist.train.next_batch(batch_size)

        sess.run(optimizer, feed_dict={

            x: batch_xs, y: batch_ys, keep_prob: 0.5})

    print(sess.run(accuracy,

                   feed_dict={

                       x: mnist.validation.images,

                       y: mnist.validation.labels,

                       keep_prob: 1.0

                   }))

(程序结果运行需要下载mnist手写字识别数据库)

 
 
 
 
来源:张泽旺 深度学习每日摘要
智造家
282 浏览

我所理解的深度学习(四)

机械自动化类 喷漆李 2016-12-05 16:01 发表了文章 来自相关话题

 
非常深度的卷积神经网络应用于图像识别


    卷积神经网络在图像识别中的应用非常多,因为卷积神经网络善于应对图像的空间变化。


    对于一张像素为224*224的三通道RGB图片,我们可以首先对其进行一定程度地预处理。预处理的方式一般比较简单,即对每个通道进行归一化(每个通道上的每个像素值减去所有像素的平均值)。


    这里与第一篇应用所不同的是,为了持续提高图像识别的准确度和减少内存的消耗,一种非常深度的卷积神经网络被提出来了。之所以说减少内存,是因为这里没有使用局部响应归一化层,并且与以前所使用的卷积神经网络所不同的是,以前的卷积神经网络在较浅层往往会使用较大的感知区域,例如11*11或9*9,平移大小一般设为2,这样所提取的局部区域特征信息有可能会有损失,而这里使用的是3*3较小的局部感知区域,并且平移大小设置为1,这样就可以充分挖掘更多更精细的局部特征信息。


    其实使用两个3*3的感知区域叠加起来看起来跟一个5*5的感知区域的效果一样,那为什么还要使用两个3*3的感知区域堆叠起来而不使用一个5*5的感知区域呢呢?原因很简单有以下。



    第一,仅仅使用一层5*5的感知区域卷积层,这样只有一层非线性的ReLU函数,而使用两层3*3堆叠起来则包含两层非线性的ReLU函数,这样使得非线性的决策性更充分,换句话说可以对特征进行了很多可能的探索;


    第二,使用两个3*3的感知区域卷积层堆叠起来要比使用一个5*5的感知区域卷积层所含参数少,因为如果假设两个3*3的感知区域堆叠层的通道数为C,那么它所包含的参数个数为2*(3^2*C^2)=18C^2;而对于一个5*5的感知区域卷积层,它所包含的参数个数为1*(5^2*C^2)=25C^2。


    因此,使用这样一种较小的感知区和较深的卷积层,可以看成对原来较大感知区域进行再次分解,并且在其中还添加了更多的非线性决策能力,因此可以使得特征提取更为健壮。
        





    在上表中,可以注意到还有一个明显不同的特殊卷积层,那就是1*1的感知区的卷积层(如表中conv1字样所示),这种感知区大小为1*1,即卷积前后维度仍然保持不变,可以看做对单个神经元进行一个非线性操作,大家可能觉得这不就是一种全连接的前馈式神经网络吗?其实不是的,注意卷积神经网络有一个重要的特点,那就是权重共享,也就是说这里每一个神经元都会乘以同一个权重标量,即所有神经元进行统一的线性映射,然后再通过一个非线性ReLU函数。这样做的好处是什么呢?最明显的一点是它既具有特征变换的性质,又在一定程度上避免了全连接神经网络过拟合的可能。以后我会在讲解Network in Network概念的时候中去详细说明这个微结构。


    这样一种使用较小的感知区域以及非常深的网络结构,在图像识别取得了比以往结构都要好的准确率,并且,实验证明,网络结构越深,准确度越高。在具体的训练过程上,即训练一个多分类器,方案基本和上一篇一样,因此这里就不再详细展开了。(后面我会就训练深度神经网络写一篇)




今日名句:

人们宁愿自我欺骗,也不愿意相信自己是被欺骗的。因为他活在自己的“思维之墙”当中。
 
 
 
 
 来源:张泽旺 深度学习每日摘要
智造家 查看全部

15.1_.jpg

 
非常深度的卷积神经网络应用于图像识别


    卷积神经网络在图像识别中的应用非常多,因为卷积神经网络善于应对图像的空间变化。


    对于一张像素为224*224的三通道RGB图片,我们可以首先对其进行一定程度地预处理。预处理的方式一般比较简单,即对每个通道进行归一化(每个通道上的每个像素值减去所有像素的平均值)。


    这里与第一篇应用所不同的是,为了持续提高图像识别的准确度和减少内存的消耗,一种非常深度的卷积神经网络被提出来了。之所以说减少内存,是因为这里没有使用局部响应归一化层,并且与以前所使用的卷积神经网络所不同的是,以前的卷积神经网络在较浅层往往会使用较大的感知区域,例如11*11或9*9,平移大小一般设为2,这样所提取的局部区域特征信息有可能会有损失,而这里使用的是3*3较小的局部感知区域,并且平移大小设置为1,这样就可以充分挖掘更多更精细的局部特征信息。


    其实使用两个3*3的感知区域叠加起来看起来跟一个5*5的感知区域的效果一样,那为什么还要使用两个3*3的感知区域堆叠起来而不使用一个5*5的感知区域呢呢?原因很简单有以下。



    第一,仅仅使用一层5*5的感知区域卷积层,这样只有一层非线性的ReLU函数,而使用两层3*3堆叠起来则包含两层非线性的ReLU函数,这样使得非线性的决策性更充分,换句话说可以对特征进行了很多可能的探索;


    第二,使用两个3*3的感知区域卷积层堆叠起来要比使用一个5*5的感知区域卷积层所含参数少,因为如果假设两个3*3的感知区域堆叠层的通道数为C,那么它所包含的参数个数为2*(3^2*C^2)=18C^2;而对于一个5*5的感知区域卷积层,它所包含的参数个数为1*(5^2*C^2)=25C^2。


    因此,使用这样一种较小的感知区和较深的卷积层,可以看成对原来较大感知区域进行再次分解,并且在其中还添加了更多的非线性决策能力,因此可以使得特征提取更为健壮。
        
15.2_.JPG


    在上表中,可以注意到还有一个明显不同的特殊卷积层,那就是1*1的感知区的卷积层(如表中conv1字样所示),这种感知区大小为1*1,即卷积前后维度仍然保持不变,可以看做对单个神经元进行一个非线性操作,大家可能觉得这不就是一种全连接的前馈式神经网络吗?其实不是的,注意卷积神经网络有一个重要的特点,那就是权重共享,也就是说这里每一个神经元都会乘以同一个权重标量,即所有神经元进行统一的线性映射,然后再通过一个非线性ReLU函数。这样做的好处是什么呢?最明显的一点是它既具有特征变换的性质,又在一定程度上避免了全连接神经网络过拟合的可能。以后我会在讲解Network in Network概念的时候中去详细说明这个微结构。


    这样一种使用较小的感知区域以及非常深的网络结构,在图像识别取得了比以往结构都要好的准确率,并且,实验证明,网络结构越深,准确度越高。在具体的训练过程上,即训练一个多分类器,方案基本和上一篇一样,因此这里就不再详细展开了。(后面我会就训练深度神经网络写一篇)




今日名句:

人们宁愿自我欺骗,也不愿意相信自己是被欺骗的。因为他活在自己的“思维之墙”当中。
 
 
 
 
 来源:张泽旺 深度学习每日摘要
智造家
304 浏览

我所理解的深度学习(三)

机械自动化类 喷漆李 2016-12-05 14:40 发表了文章 来自相关话题

前言:从本期开始,我将连续讲解卷积神经网络在图像识别、语音识别等领域的应用。在正文中,卷积神经网络使用缩写CNN来代替。



    CNN最早被应用于图像识别领域,鉴于它具有可以适应空间变化的优势。在2012年的ILSVRC(ImageNet Large Scale Visual Recognition Competition)比赛中,一个由Hinton小组提出来的包含6000万个参数和65万个神经元的五层Deep CNN(以下统称为DCNN)成功地取得了该比赛即图像识别的第一名。
 
ImageNet数据库包含150万张图片,它们被分类成22000个不同类别的物体。ILSVRC使用了其中的120万张图片作为训练集,5万张图片作为验证集,15万张图片作为测试集,图片的类别一共选取了1000种。每张图片被预处理成维度为256*256大小,并且使用RGB三个通道的像素值作为训练的输入数据。



    此DCNN结构包括五个卷积层和三个全连接层,在最后一层全连接层的基础上,紧接着一个Softmax层,它的作用是映射到1000个类别的概率分布。
 
DCNN使用256*256*3的图片像素矩阵作为输入层,第一个卷积层包含了96个卷积核,并且每个核的大小为11*11*3;第二个卷积层包含了256个卷积核,并且每个核的大小为5*5*96;第三个卷积层包含了384个卷积核,并且每个核的大小为3*3*256;第四个卷积层包含了384个卷积核,并且每个核的大小为3*3*384;第五个卷积层包含了256个卷积核,并且每个核的大小为3*3*284。其中第一层和第二层之间、第二层和第三层之间均含有一个最大池化层,这里池化的方式是采取了有交叠的池化,即池化大小为3*3,平移量大小为2*2,实验表明采取这种有交叠的池化方式可以有效减少过拟合。最后有三个全连接层,它们的神经元个数分别是4092、4092、1000。因此,总体的网络结构如下所示:


      输入层:256*256*3


              ↓ (卷积大小11*11*3)
            96核卷积层
               ↓
              最大池化层(3*3,2*2)
            ↓ (卷积大小5*5*96)
           256核卷积层
                ↓
           最大池化层(3*3,2*2)
            ↓ (卷积大小3*3*256)
            384核卷积层
           ↓ (卷积大小3*3*384)
            384核卷积层
           ↓ (卷积大小3*3*384)
         256核卷积层
            ↓ (卷积大小3*3*384)    
         全连接层(4092个神经元)
           ↓
            全连接层 (4092个神经元)
               ↓
             全连接层 (1000个神经元)
           ↓
         1000个类别的概率分布

    

    以上就是此DCNN的详细结构,除此之外,还有一些重要的特征需要说明一下。第一,该结构中使用的激活函数均为ReLU函数,此函数在一定程度上具有可以避免梯度消失问题的优势,尽管现在已经有更好的激活函数可以代替ReLU了(后面我会专门讲一期深度学习中的激活函数);此训练是在多GPU上进行的;另外,网络中还加入了局部响应归一化这一技巧(后面我会专门讲这个)。


    为了防止过拟合,在此DCNN结构的前两个全连接层中引入了比例为0.5的dropout,即在训练时让一半的神经元不起作用(数学上即激活值设为0),在测试的时候使用所有的神经元并且将它们的激活值乘以0.5,实验表明,采取此Dropout有效地避免了过拟合,但是收敛所需要的迭代次数比不引入Dropout的迭代次数多一倍。


    此DCNN训练所使用的算法是具有动量的批量随机梯度下降算法,每一个批的大小为128个样本,动量因子为0.9,权重削弱比例为0.0005。所有权重的初始化为均值为0,标准差为0.01的高斯分布。并且卷积层中,第二层、第三层、第五层的偏置初始化为1,其余的偏置初始化为0。


最后分享摘自《成熟比成功更重要》一书中关于工作重要性的一段话:

• 如果你对幸福的看法是无止境的悠闲,如果你期望退休后躺在摇椅上,那么你是活在一个愚人的天堂。因为懒惰是人类最大的敌人,它只会制造悲哀、早衰和死亡。适量的工作而不是过度紧张的工作,不会对人造成伤害,但过分的安逸却会。 
 
 
 
 
来源: 张泽旺 深度学习每日摘要
智造家 查看全部
3.1_.jpg

前言:从本期开始,我将连续讲解卷积神经网络在图像识别、语音识别等领域的应用。在正文中,卷积神经网络使用缩写CNN来代替。



    CNN最早被应用于图像识别领域,鉴于它具有可以适应空间变化的优势。在2012年的ILSVRC(ImageNet Large Scale Visual Recognition Competition)比赛中,一个由Hinton小组提出来的包含6000万个参数和65万个神经元的五层Deep CNN(以下统称为DCNN)成功地取得了该比赛即图像识别的第一名。
 
ImageNet数据库包含150万张图片,它们被分类成22000个不同类别的物体。ILSVRC使用了其中的120万张图片作为训练集,5万张图片作为验证集,15万张图片作为测试集,图片的类别一共选取了1000种。每张图片被预处理成维度为256*256大小,并且使用RGB三个通道的像素值作为训练的输入数据。



    此DCNN结构包括五个卷积层和三个全连接层,在最后一层全连接层的基础上,紧接着一个Softmax层,它的作用是映射到1000个类别的概率分布。
 
DCNN使用256*256*3的图片像素矩阵作为输入层,第一个卷积层包含了96个卷积核,并且每个核的大小为11*11*3;第二个卷积层包含了256个卷积核,并且每个核的大小为5*5*96;第三个卷积层包含了384个卷积核,并且每个核的大小为3*3*256;第四个卷积层包含了384个卷积核,并且每个核的大小为3*3*384;第五个卷积层包含了256个卷积核,并且每个核的大小为3*3*284。其中第一层和第二层之间、第二层和第三层之间均含有一个最大池化层,这里池化的方式是采取了有交叠的池化,即池化大小为3*3,平移量大小为2*2,实验表明采取这种有交叠的池化方式可以有效减少过拟合。最后有三个全连接层,它们的神经元个数分别是4092、4092、1000。因此,总体的网络结构如下所示:


      输入层:256*256*3


              ↓ (卷积大小11*11*3)
            96核卷积层
               ↓
              最大池化层(3*3,2*2)
            ↓ (卷积大小5*5*96)
           256核卷积层
                ↓
           最大池化层(3*3,2*2)
            ↓ (卷积大小3*3*256)
            384核卷积层
           ↓ (卷积大小3*3*384)
            384核卷积层
           ↓ (卷积大小3*3*384)
         256核卷积层
            ↓ (卷积大小3*3*384)    
         全连接层(4092个神经元)
           ↓
            全连接层 (4092个神经元)
               ↓
             全连接层 (1000个神经元)
           ↓
         1000个类别的概率分布

    

    以上就是此DCNN的详细结构,除此之外,还有一些重要的特征需要说明一下。第一,该结构中使用的激活函数均为ReLU函数,此函数在一定程度上具有可以避免梯度消失问题的优势,尽管现在已经有更好的激活函数可以代替ReLU了(后面我会专门讲一期深度学习中的激活函数);此训练是在多GPU上进行的;另外,网络中还加入了局部响应归一化这一技巧(后面我会专门讲这个)。


    为了防止过拟合,在此DCNN结构的前两个全连接层中引入了比例为0.5的dropout,即在训练时让一半的神经元不起作用(数学上即激活值设为0),在测试的时候使用所有的神经元并且将它们的激活值乘以0.5,实验表明,采取此Dropout有效地避免了过拟合,但是收敛所需要的迭代次数比不引入Dropout的迭代次数多一倍。


    此DCNN训练所使用的算法是具有动量的批量随机梯度下降算法,每一个批的大小为128个样本,动量因子为0.9,权重削弱比例为0.0005。所有权重的初始化为均值为0,标准差为0.01的高斯分布。并且卷积层中,第二层、第三层、第五层的偏置初始化为1,其余的偏置初始化为0。


最后分享摘自《成熟比成功更重要》一书中关于工作重要性的一段话:

• 如果你对幸福的看法是无止境的悠闲,如果你期望退休后躺在摇椅上,那么你是活在一个愚人的天堂。因为懒惰是人类最大的敌人,它只会制造悲哀、早衰和死亡。适量的工作而不是过度紧张的工作,不会对人造成伤害,但过分的安逸却会。 
 
 
 
 
来源: 张泽旺 深度学习每日摘要
智造家
295 浏览

我所理解的深度学习(二)

机械自动化类 喷漆李 2016-12-05 14:30 发表了文章 来自相关话题

 
前言:上一期推送了一篇文采洋溢的散文,发现阅读量明显下降,看来技术宅男大概是不需要文学来熏陶的吧。这一期聊一下卷积神经网络的基础原理。
 
 

    前面提到了后向传播(BP)算法的基础图模型,这是在计算机自动求导中使用的最基本模型,它为深度学习模型的梯度下降算法训练提供了必要条件。有了BP算法的基础,现在来总体看一下深度学习的流程。
 

    深度学习一般包括三大块,即数据采集、模型构建、训练优化。其中,模型构建是起着至关重要的作用。从是否具有时间关联性的角度来看,深度学习分为非时序模型和时序模型。简单来说,非时序模型的应用场景是数据不具有时间维度上的展宽,例如一张图片;而时序模型的应用场景是数据需要具有时间维度上的展宽,例如一个音频文件或者视频文件。
 

    非时序模型的搭建一般相对容易,常见的有前馈式神经网络,它由输入层、隐含层和输出层构成,并且最显著的特征是它的隐含层上各神经元之间不存在连接,这就导致前馈式神经网络是不具有时序记忆性的。
 

    时序模型的处理要麻烦很多,最常见的时序模型时循环神经网络,它的总体结构和前馈式神经网络相似,最大的不同之处就是其隐含层上各神经元之间是存在连接的,即前一时刻的特征会对下一时刻产生一定的影响。
 

    无论是时序问题还是非时序问题,卷积神经网络都可以应用到其中。原因是卷积神经网络既可以对空间信息进行卷积,也可以对时间信息进行卷积。例如,在图像识别中,卷积神经网络的应用是在空间维度上的;在语音识别中,卷积神经网络的应用是在时间维度上的。接下来,我们来具体看一下卷积神经网络的原理。
 

    卷积神经网络通常由卷积层(Convolutional Layer)和池化层(Pooling Layer)构成,卷积神经网络可以用于一维数据,也可以用于二维数据,下面以二维数据来分析讲解。
 

    卷积层的操作通常是一定个数的滤波器构成的,滤波器负责依次对上一层的输入特征进行局部卷积操作,因此,这里一般需要设定一个卷积核的大小,在ImageNet比赛中,二维卷积核的大小为3*3,这也被认为是最佳的卷积核,滤波器的个数一般因数据量的大小而定义。值得注意的是,对于标准的卷积神经网络,在每个滤波器中,所有的局部卷积的权重是共享的,至于为什么需要共享权重,我想这个灵感是源自于图片的对称性,即你可以在一幅图片中识别出一只猫,而不管这个猫的姿势是水平的还是倾斜的,有点类似于编程中,写了一个函数,在多处被使用。
 

    对于每一个卷积层,除了滤波器的数量和卷积核的大小需要确定之外,还有铺平(padding)的大小需要确定,铺平即意味着在两端用0去补充;并且平移(stride)的大小也需要确定,在二维中,一般是指水平方向和垂直方向的每次局部卷积所移动的步长。
 

    这样,卷积层的操作就很易懂了,例如若一个原始特征矩阵为

    1    2    3
    4    5    6
 

设定只包含一个滤波器,卷积核的大小为2*2,并且padding为None,stride为(1,1),如果初始权重矩阵为

    0.1    0.2
    0.3    0.4
 

那么,局部卷积过后的矩阵为

    3.7    3.7
 
 

    上面就是卷积层的操作,下面来提一下另外一个结构——池化层。池化层简而言之就是局部降维。一方面池化是为了减少网络的参数,另一方面池化也是一种平滑处理的手段,即可以更大程度地减少噪音的负面影响。局部池化的维度(Pooling size)需要去设定,同时,池化也具有stride属性,含义同上。池化的方式一般有两种,最大池化和平均池化。最大池化的意思是对一个局部只取最大的那个元素保留下来;而平均池化的意思是对一个局部取所有元素的平均值保留下来。例如如果一个池化前的矩阵为

    1    2    9    4
    5    6    8    8
    7    8    6    9
    1    3    5    7
 

那么,若设定池化大小为(3,3),stride大小为(1,1),那么采取最大池化后的矩阵变为

    8    9
    8    9
 
 

以上就是卷积神经网络的基本结构了,下面附上一张图来直观感受一下。





 
 
 

来源;张泽旺 深度学习每日摘要
智造家 查看全部
2.1_.JPG

 
前言:上一期推送了一篇文采洋溢的散文,发现阅读量明显下降,看来技术宅男大概是不需要文学来熏陶的吧。这一期聊一下卷积神经网络的基础原理。
 
 

    前面提到了后向传播(BP)算法的基础图模型,这是在计算机自动求导中使用的最基本模型,它为深度学习模型的梯度下降算法训练提供了必要条件。有了BP算法的基础,现在来总体看一下深度学习的流程。
 

    深度学习一般包括三大块,即数据采集、模型构建、训练优化。其中,模型构建是起着至关重要的作用。从是否具有时间关联性的角度来看,深度学习分为非时序模型和时序模型。简单来说,非时序模型的应用场景是数据不具有时间维度上的展宽,例如一张图片;而时序模型的应用场景是数据需要具有时间维度上的展宽,例如一个音频文件或者视频文件。
 

    非时序模型的搭建一般相对容易,常见的有前馈式神经网络,它由输入层、隐含层和输出层构成,并且最显著的特征是它的隐含层上各神经元之间不存在连接,这就导致前馈式神经网络是不具有时序记忆性的。
 

    时序模型的处理要麻烦很多,最常见的时序模型时循环神经网络,它的总体结构和前馈式神经网络相似,最大的不同之处就是其隐含层上各神经元之间是存在连接的,即前一时刻的特征会对下一时刻产生一定的影响。
 

    无论是时序问题还是非时序问题,卷积神经网络都可以应用到其中。原因是卷积神经网络既可以对空间信息进行卷积,也可以对时间信息进行卷积。例如,在图像识别中,卷积神经网络的应用是在空间维度上的;在语音识别中,卷积神经网络的应用是在时间维度上的。接下来,我们来具体看一下卷积神经网络的原理。
 

    卷积神经网络通常由卷积层(Convolutional Layer)池化层(Pooling Layer)构成,卷积神经网络可以用于一维数据,也可以用于二维数据,下面以二维数据来分析讲解。
 

    卷积层的操作通常是一定个数的滤波器构成的,滤波器负责依次对上一层的输入特征进行局部卷积操作,因此,这里一般需要设定一个卷积核的大小,在ImageNet比赛中,二维卷积核的大小为3*3,这也被认为是最佳的卷积核,滤波器的个数一般因数据量的大小而定义。值得注意的是,对于标准的卷积神经网络,在每个滤波器中,所有的局部卷积的权重是共享的,至于为什么需要共享权重,我想这个灵感是源自于图片的对称性,即你可以在一幅图片中识别出一只猫,而不管这个猫的姿势是水平的还是倾斜的,有点类似于编程中,写了一个函数,在多处被使用。
 

    对于每一个卷积层,除了滤波器的数量和卷积核的大小需要确定之外,还有铺平(padding)的大小需要确定,铺平即意味着在两端用0去补充;并且平移(stride)的大小也需要确定,在二维中,一般是指水平方向和垂直方向的每次局部卷积所移动的步长。
 

    这样,卷积层的操作就很易懂了,例如若一个原始特征矩阵为

    1    2    3
    4    5    6
 

设定只包含一个滤波器,卷积核的大小为2*2,并且padding为None,stride为(1,1),如果初始权重矩阵为

    0.1    0.2
    0.3    0.4
 

那么,局部卷积过后的矩阵为

    3.7    3.7
 
 

    上面就是卷积层的操作,下面来提一下另外一个结构——池化层。池化层简而言之就是局部降维。一方面池化是为了减少网络的参数,另一方面池化也是一种平滑处理的手段,即可以更大程度地减少噪音的负面影响。局部池化的维度(Pooling size)需要去设定,同时,池化也具有stride属性,含义同上。池化的方式一般有两种,最大池化和平均池化。最大池化的意思是对一个局部只取最大的那个元素保留下来;而平均池化的意思是对一个局部取所有元素的平均值保留下来。例如如果一个池化前的矩阵为

    1    2    9    4
    5    6    8    8
    7    8    6    9
    1    3    5    7
 

那么,若设定池化大小为(3,3),stride大小为(1,1),那么采取最大池化后的矩阵变为

    8    9
    8    9
 
 

以上就是卷积神经网络的基本结构了,下面附上一张图来直观感受一下。

2.2_.jpg

 
 
 

来源;张泽旺 深度学习每日摘要
智造家
711 浏览

卷积神经网络技术及发展

智能科技类 小螺号 2016-09-20 10:04 发表了文章 来自相关话题

 
【导读】深度学习很火,说起深度学习中一个很重要的概念——卷积神经网络(CNN)似乎也人人皆知。不过,CNN究竟是什么,涉及哪些概念,经过如何发展,真正要有逻辑地归纳一遍,估计不少人都说不清。日前,南洋理工大学研究人员梳理CNN发展历史,从基础组成部分讲起,介绍并探讨CNN在视觉识别方面的原理及应用,是系统深入理解CNN的好文。
Recent Advances in Convolutional Neural Networks
 
 

摘要
 
过去几年,深度学习在解决诸如视觉识别、语音识别和自然语言处理等很多问题方面都表现出色。在不同类型的神经网络当中,卷积神经网络是得到最深入研究的。早期由于缺乏训练数据和计算能力,要在不产生过拟合的情况下训练高性能卷积神经网络是很困难的。标记数据和近来GPU的发展,使得卷积神经网络研究涌现并取得一流结果。本文中,我们将纵览卷积神经网络近来发展,同时介绍卷积神经网络在视觉识别方面的一些应用。
 
 
引言
 
卷积神经网络(CNN)是一种常见的深度学习架构,受生物自然视觉认知机制启发而来。1959年,Hubel & Wiesel [1] 发现,动物视觉皮层细胞负责检测光学信号。受此启发,1980年 Kunihiko Fukushima 提出了CNN的前身——neocognitron 。

20世纪 90 年代,LeCun et al. [3] 等人发表论文,确立了CNN的现代结构,后来又对其进行完善。他们设计了一种多层的人工神经网络,取名叫做LeNet-5,可以对手写数字做分类。和其他神经网络一样, LeNet-5 也能使用 backpropagation 算法训练。

CNN能够得出原始图像的有效表征,这使得CNN能够直接从原始像素中,经过极少的预处理,识别视觉上面的规律。然而,由于当时缺乏大规模训练数据,计算机的计算能力也跟不上,LeNet-5 对于复杂问题的处理结果并不理想。

2006年起,人们设计了很多方法,想要克服难以训练深度CNN的困难。其中,最著名的是 Krizhevsky et al.提出了一个经典的CNN 结构,并在图像识别任务上取得了重大突破。其方法的整体框架叫做 AlexNet,与 LeNet-5 类似,但要更加深一些。

AlexNet 取得成功后,研究人员又提出了其他的完善方法,其中最著名的要数 ZFNet [7], VGGNet [8], GoogleNet [9] 和 ResNet [10] 这四种。从结构看,CNN 发展的一个方向就是层数变得更多,ILSVRC 2015 冠军 ResNet 是 AlexNet 的20 多倍,是 VGGNet 的8 倍多。通过增加深度,网络便能够利用增加的非线性得出目标函数的近似结构,同时得出更好的特性表征。但是,这样做同时也增加了网络的整体复杂程度,使网络变得难以优化,很容易过拟合。

研究人员提出了很多方法来解决这一问题。在下面的章节中,我们会先列出CNN的组成部分,然后介绍CNN不同方面的最近进展,接着引入快速计算技巧,并探讨CNN在图像分类、物体识别等不同方面的应用进展,最后归纳总结。
 
 
基本组成部分
 
在不同的参考资料中,对 CNN的组成部分都有着不同的描述。不过,CNN的基本组成成分是十分接近的。

以分类数字的 LeNet-5 为例,这个 CNN 含有三种类型的神经网络层:






卷积层:学会识别输入数据的特性表征

池化(Pooling):典型的操作包括平均 pooling [12] 和最大化 pooling [13–15]






全连接层:将卷积层和Pooling 层堆叠起来以后,就能够形成一层或多层全连接层,这样就能够实现高阶的推力能力。
 
 
完善 CNN
 
自从 2012 年 AlexNet 成功以后,研究人员设计了很多种完善 CNN 的方法。在这一节中,我们将从 6 方面进行介绍。


1. 卷积层

1)网络中的网络(Network in Network,NIN):由 Lin et al. [21] 提出的基本网络结构






2) Inception module: 由 Szegedy et al. [9] 提出,是 NIN 的拓展


2. 池化层

池化层是CNN的重要组成部分,通过减少卷积层之间的连接,降低运算复杂程度。以下是常用的几种循环方法:

1)Lp 池化:Lp 池化是建立在复杂细胞运行机制的基础上,受生物启发而来 [24] [25]

2) 混合池化:受随机Dropout [16] 和 DropConnect [28], Yu et al. 启发而来

3)随机池化:随机循环 [30] 是受 drptout 启发而来的方法

4)Spectral 池化


3. 激活函数

常用的非线性激活函数有sigmoid、tanh、relu等等,前两者sigmoid/tanh比较常见于全链接层,后者relu常见于卷积层。

1) ReLU

2) Leaky ReLU

3) Parametric ReLU

4) Randomized ReLU

5) ELU

6) Maxout:

7) Probout


4. Loss 函数

1) Softmax loss

2) Hinge loss

3) Contrastive loss


5. 正则化






1)DropOut

2) DropConnect


6. 优化

1) 初始化权重

2) 随机梯度下降

3) 批量标准化

4) Shortcut 连接
 
 
CNN 应用
 
A 图像分类

B 物体检测

C 物体追踪

D 姿态预估(Pose estimatation)

E 文本检测识别

F 视觉 saliency 检测

G 行动识别

H 场景标记
 
 
讨论
 
深度CNN在图像处理、视频、语音和文本中取得了突破。本文种,我们主要从计算机视觉的角度对最近CNN取得的进展进行了深度的研究。我们讨论了CNN在不同方面取得的进步:比如,层的设计,活跃函数、损失函数、正则化、优化和快速计算。除了从CNN的各个方面回顾其进展,我们还介绍了CNN在计算机视觉任务上的应用,其中包括图像分类、物体检测、物体追踪、姿态估计、文本检测、视觉显著检测、动作识别和场景标签。

虽然在实验的测量中,CNN获得了巨大的成功,但是,仍然还有很多工作值得进一步研究。首先,鉴于最近的CNN变得越来越深,它们也需要大规模的数据库和巨大的计算能力,来展开训练。人为搜集标签数据库要求大量的人力劳动。所以,大家都渴望能开发出无监督式的CNN学习方式。

同时,为了加速训练进程,虽然已经有一些异步的SGD算法,证明了使用CPU和GPU集群可以在这方面获得成功,但是,开放高效可扩展的训练算法依然是有价值的。在训练的时间中,这些深度模型都是对内存有高的要求,并且消耗时间的,这使得它们无法在手机平台上部署。如何在不减少准确度的情况下,降低复杂性并获得快速执行的模型,这是重要的研究方向。

其次,我们发现,CNN运用于新任务的一个主要障碍是:如何选择合适的超参数?比如学习率、卷积过滤的核大小、层数等等,这需要大量的技术和经验。这些超参数存在内部依赖,这会让调整变得很昂贵。最近的研究显示,在学习式深度CNN架构的选择技巧上,存在巨大的提升空间。

最后,关于CNN,依然缺乏统一的理论。目前的CNN模型运作模式依然是黑箱。我们甚至都不知道它是如何工作的,工作原理是什么。当下,值得把更多的精力投入到研究CNN的基本规则上去。同时,正如早期的CNN发展是受到了生物视觉感知机制的启发,深度CNN和计算机神经科学二者需要进一步的深入研究。

有一些开放的问题,比如,生物学上大脑中的学习方式如何帮助人们设计更加高效的深度模型?带权重分享的回归计算方式是否可以计算人类的视觉皮质等等。

我们希望这篇文章不仅能让人们更好地理解CNN,同时也能促进CNN领域中未来的研究活动和应用发展。0文章导航← 【每日学习】Python在人工智能中的作用
 
 
 
 
文章来源于 未来科技学院智造家平台提供 查看全部

2.0_.jpg

 
【导读】深度学习很火,说起深度学习中一个很重要的概念——卷积神经网络(CNN)似乎也人人皆知。不过,CNN究竟是什么,涉及哪些概念,经过如何发展,真正要有逻辑地归纳一遍,估计不少人都说不清。日前,南洋理工大学研究人员梳理CNN发展历史,从基础组成部分讲起,介绍并探讨CNN在视觉识别方面的原理及应用,是系统深入理解CNN的好文。
Recent Advances in Convolutional Neural Networks
 
 

摘要
 
过去几年,深度学习在解决诸如视觉识别、语音识别和自然语言处理等很多问题方面都表现出色。在不同类型的神经网络当中,卷积神经网络是得到最深入研究的。早期由于缺乏训练数据和计算能力,要在不产生过拟合的情况下训练高性能卷积神经网络是很困难的。标记数据和近来GPU的发展,使得卷积神经网络研究涌现并取得一流结果。本文中,我们将纵览卷积神经网络近来发展,同时介绍卷积神经网络在视觉识别方面的一些应用。
 
 
引言
 
卷积神经网络(CNN)是一种常见的深度学习架构,受生物自然视觉认知机制启发而来。1959年,Hubel & Wiesel [1] 发现,动物视觉皮层细胞负责检测光学信号。受此启发,1980年 Kunihiko Fukushima 提出了CNN的前身——neocognitron 。

20世纪 90 年代,LeCun et al. [3] 等人发表论文,确立了CNN的现代结构,后来又对其进行完善。他们设计了一种多层的人工神经网络,取名叫做LeNet-5,可以对手写数字做分类。和其他神经网络一样, LeNet-5 也能使用 backpropagation 算法训练。

CNN能够得出原始图像的有效表征,这使得CNN能够直接从原始像素中,经过极少的预处理,识别视觉上面的规律。然而,由于当时缺乏大规模训练数据,计算机的计算能力也跟不上,LeNet-5 对于复杂问题的处理结果并不理想。

2006年起,人们设计了很多方法,想要克服难以训练深度CNN的困难。其中,最著名的是 Krizhevsky et al.提出了一个经典的CNN 结构,并在图像识别任务上取得了重大突破。其方法的整体框架叫做 AlexNet,与 LeNet-5 类似,但要更加深一些。

AlexNet 取得成功后,研究人员又提出了其他的完善方法,其中最著名的要数 ZFNet [7], VGGNet [8], GoogleNet [9] 和 ResNet [10] 这四种。从结构看,CNN 发展的一个方向就是层数变得更多,ILSVRC 2015 冠军 ResNet 是 AlexNet 的20 多倍,是 VGGNet 的8 倍多。通过增加深度,网络便能够利用增加的非线性得出目标函数的近似结构,同时得出更好的特性表征。但是,这样做同时也增加了网络的整体复杂程度,使网络变得难以优化,很容易过拟合。

研究人员提出了很多方法来解决这一问题。在下面的章节中,我们会先列出CNN的组成部分,然后介绍CNN不同方面的最近进展,接着引入快速计算技巧,并探讨CNN在图像分类、物体识别等不同方面的应用进展,最后归纳总结。
 
 
基本组成部分
 
在不同的参考资料中,对 CNN的组成部分都有着不同的描述。不过,CNN的基本组成成分是十分接近的。

以分类数字的 LeNet-5 为例,这个 CNN 含有三种类型的神经网络层:

2.1_.jpg


卷积层:学会识别输入数据的特性表征

池化(Pooling):典型的操作包括平均 pooling [12] 和最大化 pooling [13–15]

2.2_.jpg


全连接层:将卷积层和Pooling 层堆叠起来以后,就能够形成一层或多层全连接层,这样就能够实现高阶的推力能力。
 
 
完善 CNN
 
自从 2012 年 AlexNet 成功以后,研究人员设计了很多种完善 CNN 的方法。在这一节中,我们将从 6 方面进行介绍。


1. 卷积层

1)网络中的网络(Network in Network,NIN):由 Lin et al. [21] 提出的基本网络结构

2.3_.jpg


2) Inception module: 由 Szegedy et al. [9] 提出,是 NIN 的拓展


2. 池化层

池化层是CNN的重要组成部分,通过减少卷积层之间的连接,降低运算复杂程度。以下是常用的几种循环方法:

1)Lp 池化:Lp 池化是建立在复杂细胞运行机制的基础上,受生物启发而来 [24] [25]

2) 混合池化:受随机Dropout [16] 和 DropConnect [28], Yu et al. 启发而来

3)随机池化:随机循环 [30] 是受 drptout 启发而来的方法

4)Spectral 池化


3. 激活函数

常用的非线性激活函数有sigmoid、tanh、relu等等,前两者sigmoid/tanh比较常见于全链接层,后者relu常见于卷积层。

1) ReLU

2) Leaky ReLU

3) Parametric ReLU

4) Randomized ReLU

5) ELU

6) Maxout:

7) Probout


4. Loss 函数

1) Softmax loss

2) Hinge loss

3) Contrastive loss


5. 正则化

2.4_.jpg


1)DropOut

2) DropConnect


6. 优化

1) 初始化权重

2) 随机梯度下降

3) 批量标准化

4) Shortcut 连接
 
 
CNN 应用
 
A 图像分类

B 物体检测

C 物体追踪

D 姿态预估(Pose estimatation)

E 文本检测识别

F 视觉 saliency 检测

G 行动识别

H 场景标记
 
 
讨论
 
深度CNN在图像处理、视频、语音和文本中取得了突破。本文种,我们主要从计算机视觉的角度对最近CNN取得的进展进行了深度的研究。我们讨论了CNN在不同方面取得的进步:比如,层的设计,活跃函数、损失函数、正则化、优化和快速计算。除了从CNN的各个方面回顾其进展,我们还介绍了CNN在计算机视觉任务上的应用,其中包括图像分类、物体检测、物体追踪、姿态估计、文本检测、视觉显著检测、动作识别和场景标签。

虽然在实验的测量中,CNN获得了巨大的成功,但是,仍然还有很多工作值得进一步研究。首先,鉴于最近的CNN变得越来越深,它们也需要大规模的数据库和巨大的计算能力,来展开训练。人为搜集标签数据库要求大量的人力劳动。所以,大家都渴望能开发出无监督式的CNN学习方式。

同时,为了加速训练进程,虽然已经有一些异步的SGD算法,证明了使用CPU和GPU集群可以在这方面获得成功,但是,开放高效可扩展的训练算法依然是有价值的。在训练的时间中,这些深度模型都是对内存有高的要求,并且消耗时间的,这使得它们无法在手机平台上部署。如何在不减少准确度的情况下,降低复杂性并获得快速执行的模型,这是重要的研究方向。

其次,我们发现,CNN运用于新任务的一个主要障碍是:如何选择合适的超参数?比如学习率、卷积过滤的核大小、层数等等,这需要大量的技术和经验。这些超参数存在内部依赖,这会让调整变得很昂贵。最近的研究显示,在学习式深度CNN架构的选择技巧上,存在巨大的提升空间。

最后,关于CNN,依然缺乏统一的理论。目前的CNN模型运作模式依然是黑箱。我们甚至都不知道它是如何工作的,工作原理是什么。当下,值得把更多的精力投入到研究CNN的基本规则上去。同时,正如早期的CNN发展是受到了生物视觉感知机制的启发,深度CNN和计算机神经科学二者需要进一步的深入研究。

有一些开放的问题,比如,生物学上大脑中的学习方式如何帮助人们设计更加高效的深度模型?带权重分享的回归计算方式是否可以计算人类的视觉皮质等等。

我们希望这篇文章不仅能让人们更好地理解CNN,同时也能促进CNN领域中未来的研究活动和应用发展。0文章导航← 【每日学习】Python在人工智能中的作用
 
 
 
 
  • 文章来源于 未来科技学院
  • 智造家平台提供

385 浏览

TensorFlow(三)——卷积神经网络用于手写字识别

机械自动化类 机械设计 2016-12-09 09:43 发表了文章 来自相关话题

往期TensorFlow教程系列延伸阅读:

TensorFlow(一)——基础图模型
TensorFlow(二)——逻辑回归




1. 导入基本库

这期讲解如何运用TensorFlow来建立一个卷积神经网络用于手写字识别。首先导入一些必备的库。

import tensorflow as tf


import tensorflow.examples.tutorials.mnist.input_data as input_data

from libs.utils import *

import matplotlib.pyplot as plt




2.新建权重函数和偏置函数

首先我们写两个通用函数,权重变量和偏置向量,传入的参数都是维度信息,并且都是使用高斯随机分布来产生初始值。

def weight_variable(shape):

    initial = tf.random_normal(shape, mean=0.0, stddev=0.01)

    return tf.Variable(initial)



def bias_variable(shape):

    initial = tf.random_normal(shape, mean=0.0, stddev=0.01)

    return tf.Variable(initial)




3.新建输入输出有关的占位符

这里我们使用的训练数据是MNIST手写字识别数据库,手写字识别数据库中的每张图片是28*28大小,然后手写字一共是十种类别,即1234567890,所以这里我们首先新建两个占位符,分别是输入数据x和标签数据y,其中None代表batch那个维度大小目前还无法确定。

mnist = input_data.read_data_sets('MNIST_data/', one_hot=True)

x = tf.placeholder(tf.float32, [None, 784])

y = tf.placeholder(tf.float32, [None, 10])




4.构造两层卷积神经网络

由于这里我们想运用卷积神经网络,因此首先需要把数据数据的维度变成4-D形式,即(batch_size,width,height,channel),所以这里width和height我们设置为28,channel为1,而batch_size设置为-1的意思是这个维度只用把总维度去除以width*height*channel即可得到。

x_tensor = tf.reshape(x, [-1, 28, 28, 1])



接下来我们需要设置卷积感知区域的大小以及卷积核的个数,这里我们设置感知区域的大小为3*3,卷积核的个数为16,这样就构建了权重矩阵。而偏置对于每个卷积核都是共享的,因此偏置是一个长度为n_filters_1的向量。

filter_size = 3

n_filters_1 = 16


W_conv1 = weight_variable([filter_size, filter_size, 1, n_filters_1])

b_conv1 = bias_variable([n_filters_1])



接下来我们可以构建第一个卷积层,我们知道,卷积层出了感知区域大小、卷积核个数两个属性以外,它还包括滑动步长、是否铺平等。所以,这里我们调用tf.nn.conv2d函数,输入数据是x_tensor,而卷积核就是权重矩阵,我们同时设置strides为2*2,即每次在height维度以及width维度滑动步长均为2,而padding设置为'same',即满足了卷积前与卷积后的数据维度一致。除此之外,我们还在卷积后加了偏置向量,并且最终通过了elu激活函数。

h_conv1 = tf.nn.elu(

    tf.nn.conv2d(input=x_tensor,

                 filter=W_conv1,

                 strides=[1, 2, 2, 1],

                 padding='SAME') +

    b_conv1)



为了使得识别准确率较高,我们在第一层卷积输出的基础上,再添一层卷积神经网络,同理,添加方法与第一层基本类似,只不过这里的输入由x_tensor改变为了h_conv1,并且卷积核和偏置向量都是不同的。

n_filters_2 = 16

W_conv2 = weight_variable([filter_size, filter_size, n_filters_1, n_filters_2])

b_conv2 = bias_variable([n_filters_2])

h_conv2 = tf.nn.elu(

    tf.nn.conv2d(input=h_conv1,

                 filter=W_conv2,

                 strides=[1, 2, 2, 1],

                 padding='SAME') +

    b_conv2)




5.添加全连接隐含层

接下来,我们将添加几个全连接层,第一个全连接层充当一种特征变换的作用,或者可以称为隐含层。在由卷积层过渡到隐含层之间,需要对卷积层的输出做一个维度变换,这里我们把维度变换成(batch_size,num_units)的形式。

h_conv2_flat = tf.reshape(h_conv2, [-1, 7 * 7 * n_filters_2])



创造一个全连接层,隐含层神经元个数为1024,然后通过一个非线性函数elu。

n_fc = 1024

W_fc1 = weight_variable([7 * 7 * n_filters_2, n_fc])

b_fc1 = bias_variable([n_fc])

h_fc1 = tf.nn.elu(tf.matmul(h_conv2_flat, W_fc1) + b_fc1)




6.添加Dropout防止过拟合

为了防止出现过拟合,我们设置一个神经元保留概率keep_prob,然后对输出层进行dropout操作。

keep_prob = tf.placeholder(tf.float32)

h_fc1_drop = tf.nn.dropout(h_fc1, keep_prob)




7.添加Softmax层

最后一层我们加上softmax操作,得到关于10个数字的分类概率。

W_fc2 = weight_variable([n_fc, 10])

b_fc2 = bias_variable([10])

y_pred = tf.nn.softmax(tf.matmul(h_fc1_drop, W_fc2) + b_fc2)




8.获取目标函数

根据交叉熵公式得到误差函数,并且建立Adam优化器。

cross_entropy = -tf.reduce_sum(y * tf.log(y_pred))

optimizer = tf.train.AdamOptimizer().minimize(cross_entropy)




计算分类正确率。

correct_prediction = tf.equal(tf.argmax(y_pred, 1), tf.argmax(y, 1))

accuracy = tf.reduce_mean(tf.cast(correct_prediction, 'float'))




9.新建会话并进行mini-batch训练

新建一个会话,并且初始化所有变量。

sess = tf.Session()

sess.run(tf.initialize_all_variables())




这里使用mini-batch来训练,设置mini-batch大小为100,设置迭代周期为5,注意这里每次run的是优化器。

batch_size = 100

n_epochs = 5

for epoch_i in range(n_epochs):

    for batch_i in range(mnist.train.num_examples // batch_size):

        batch_xs, batch_ys = mnist.train.next_batch(batch_size)

        sess.run(optimizer, feed_dict={

            x: batch_xs, y: batch_ys, keep_prob: 0.5})

    print(sess.run(accuracy,

                   feed_dict={

                       x: mnist.validation.images,

                       y: mnist.validation.labels,

                       keep_prob: 1.0

                   }))

(程序结果运行需要下载mnist手写字识别数据库)

 
 
 
 
来源:张泽旺 深度学习每日摘要
智造家 查看全部
往期TensorFlow教程系列延伸阅读:

TensorFlow(一)——基础图模型
TensorFlow(二)——逻辑回归





1. 导入基本库

这期讲解如何运用TensorFlow来建立一个卷积神经网络用于手写字识别。首先导入一些必备的库。

import tensorflow as tf


import tensorflow.examples.tutorials.mnist.input_data as input_data

from libs.utils import *

import matplotlib.pyplot as plt




2.新建权重函数和偏置函数

首先我们写两个通用函数,权重变量和偏置向量,传入的参数都是维度信息,并且都是使用高斯随机分布来产生初始值。

def weight_variable(shape):

    initial = tf.random_normal(shape, mean=0.0, stddev=0.01)

    return tf.Variable(initial)



def bias_variable(shape):

    initial = tf.random_normal(shape, mean=0.0, stddev=0.01)

    return tf.Variable(initial)




3.新建输入输出有关的占位符

这里我们使用的训练数据是MNIST手写字识别数据库,手写字识别数据库中的每张图片是28*28大小,然后手写字一共是十种类别,即1234567890,所以这里我们首先新建两个占位符,分别是输入数据x和标签数据y,其中None代表batch那个维度大小目前还无法确定。

mnist = input_data.read_data_sets('MNIST_data/', one_hot=True)

x = tf.placeholder(tf.float32, [None, 784])

y = tf.placeholder(tf.float32, [None, 10])




4.构造两层卷积神经网络

由于这里我们想运用卷积神经网络,因此首先需要把数据数据的维度变成4-D形式,即(batch_size,width,height,channel),所以这里width和height我们设置为28,channel为1,而batch_size设置为-1的意思是这个维度只用把总维度去除以width*height*channel即可得到。

x_tensor = tf.reshape(x, [-1, 28, 28, 1])



接下来我们需要设置卷积感知区域的大小以及卷积核的个数,这里我们设置感知区域的大小为3*3,卷积核的个数为16,这样就构建了权重矩阵。而偏置对于每个卷积核都是共享的,因此偏置是一个长度为n_filters_1的向量。

filter_size = 3

n_filters_1 = 16


W_conv1 = weight_variable([filter_size, filter_size, 1, n_filters_1])

b_conv1 = bias_variable([n_filters_1])



接下来我们可以构建第一个卷积层,我们知道,卷积层出了感知区域大小、卷积核个数两个属性以外,它还包括滑动步长、是否铺平等。所以,这里我们调用tf.nn.conv2d函数,输入数据是x_tensor,而卷积核就是权重矩阵,我们同时设置strides为2*2,即每次在height维度以及width维度滑动步长均为2,而padding设置为'same',即满足了卷积前与卷积后的数据维度一致。除此之外,我们还在卷积后加了偏置向量,并且最终通过了elu激活函数。

h_conv1 = tf.nn.elu(

    tf.nn.conv2d(input=x_tensor,

                 filter=W_conv1,

                 strides=[1, 2, 2, 1],

                 padding='SAME') +

    b_conv1)



为了使得识别准确率较高,我们在第一层卷积输出的基础上,再添一层卷积神经网络,同理,添加方法与第一层基本类似,只不过这里的输入由x_tensor改变为了h_conv1,并且卷积核和偏置向量都是不同的。

n_filters_2 = 16

W_conv2 = weight_variable([filter_size, filter_size, n_filters_1, n_filters_2])

b_conv2 = bias_variable([n_filters_2])

h_conv2 = tf.nn.elu(

    tf.nn.conv2d(input=h_conv1,

                 filter=W_conv2,

                 strides=[1, 2, 2, 1],

                 padding='SAME') +

    b_conv2)




5.添加全连接隐含层

接下来,我们将添加几个全连接层,第一个全连接层充当一种特征变换的作用,或者可以称为隐含层。在由卷积层过渡到隐含层之间,需要对卷积层的输出做一个维度变换,这里我们把维度变换成(batch_size,num_units)的形式。

h_conv2_flat = tf.reshape(h_conv2, [-1, 7 * 7 * n_filters_2])



创造一个全连接层,隐含层神经元个数为1024,然后通过一个非线性函数elu。

n_fc = 1024

W_fc1 = weight_variable([7 * 7 * n_filters_2, n_fc])

b_fc1 = bias_variable([n_fc])

h_fc1 = tf.nn.elu(tf.matmul(h_conv2_flat, W_fc1) + b_fc1)




6.添加Dropout防止过拟合

为了防止出现过拟合,我们设置一个神经元保留概率keep_prob,然后对输出层进行dropout操作。

keep_prob = tf.placeholder(tf.float32)

h_fc1_drop = tf.nn.dropout(h_fc1, keep_prob)




7.添加Softmax层

最后一层我们加上softmax操作,得到关于10个数字的分类概率。

W_fc2 = weight_variable([n_fc, 10])

b_fc2 = bias_variable([10])

y_pred = tf.nn.softmax(tf.matmul(h_fc1_drop, W_fc2) + b_fc2)




8.获取目标函数

根据交叉熵公式得到误差函数,并且建立Adam优化器。

cross_entropy = -tf.reduce_sum(y * tf.log(y_pred))

optimizer = tf.train.AdamOptimizer().minimize(cross_entropy)




计算分类正确率。

correct_prediction = tf.equal(tf.argmax(y_pred, 1), tf.argmax(y, 1))

accuracy = tf.reduce_mean(tf.cast(correct_prediction, 'float'))




9.新建会话并进行mini-batch训练

新建一个会话,并且初始化所有变量。

sess = tf.Session()

sess.run(tf.initialize_all_variables())




这里使用mini-batch来训练,设置mini-batch大小为100,设置迭代周期为5,注意这里每次run的是优化器。

batch_size = 100

n_epochs = 5

for epoch_i in range(n_epochs):

    for batch_i in range(mnist.train.num_examples // batch_size):

        batch_xs, batch_ys = mnist.train.next_batch(batch_size)

        sess.run(optimizer, feed_dict={

            x: batch_xs, y: batch_ys, keep_prob: 0.5})

    print(sess.run(accuracy,

                   feed_dict={

                       x: mnist.validation.images,

                       y: mnist.validation.labels,

                       keep_prob: 1.0

                   }))

(程序结果运行需要下载mnist手写字识别数据库)

 
 
 
 
来源:张泽旺 深度学习每日摘要
智造家
282 浏览

我所理解的深度学习(四)

机械自动化类 喷漆李 2016-12-05 16:01 发表了文章 来自相关话题

 
非常深度的卷积神经网络应用于图像识别


    卷积神经网络在图像识别中的应用非常多,因为卷积神经网络善于应对图像的空间变化。


    对于一张像素为224*224的三通道RGB图片,我们可以首先对其进行一定程度地预处理。预处理的方式一般比较简单,即对每个通道进行归一化(每个通道上的每个像素值减去所有像素的平均值)。


    这里与第一篇应用所不同的是,为了持续提高图像识别的准确度和减少内存的消耗,一种非常深度的卷积神经网络被提出来了。之所以说减少内存,是因为这里没有使用局部响应归一化层,并且与以前所使用的卷积神经网络所不同的是,以前的卷积神经网络在较浅层往往会使用较大的感知区域,例如11*11或9*9,平移大小一般设为2,这样所提取的局部区域特征信息有可能会有损失,而这里使用的是3*3较小的局部感知区域,并且平移大小设置为1,这样就可以充分挖掘更多更精细的局部特征信息。


    其实使用两个3*3的感知区域叠加起来看起来跟一个5*5的感知区域的效果一样,那为什么还要使用两个3*3的感知区域堆叠起来而不使用一个5*5的感知区域呢呢?原因很简单有以下。



    第一,仅仅使用一层5*5的感知区域卷积层,这样只有一层非线性的ReLU函数,而使用两层3*3堆叠起来则包含两层非线性的ReLU函数,这样使得非线性的决策性更充分,换句话说可以对特征进行了很多可能的探索;


    第二,使用两个3*3的感知区域卷积层堆叠起来要比使用一个5*5的感知区域卷积层所含参数少,因为如果假设两个3*3的感知区域堆叠层的通道数为C,那么它所包含的参数个数为2*(3^2*C^2)=18C^2;而对于一个5*5的感知区域卷积层,它所包含的参数个数为1*(5^2*C^2)=25C^2。


    因此,使用这样一种较小的感知区和较深的卷积层,可以看成对原来较大感知区域进行再次分解,并且在其中还添加了更多的非线性决策能力,因此可以使得特征提取更为健壮。
        





    在上表中,可以注意到还有一个明显不同的特殊卷积层,那就是1*1的感知区的卷积层(如表中conv1字样所示),这种感知区大小为1*1,即卷积前后维度仍然保持不变,可以看做对单个神经元进行一个非线性操作,大家可能觉得这不就是一种全连接的前馈式神经网络吗?其实不是的,注意卷积神经网络有一个重要的特点,那就是权重共享,也就是说这里每一个神经元都会乘以同一个权重标量,即所有神经元进行统一的线性映射,然后再通过一个非线性ReLU函数。这样做的好处是什么呢?最明显的一点是它既具有特征变换的性质,又在一定程度上避免了全连接神经网络过拟合的可能。以后我会在讲解Network in Network概念的时候中去详细说明这个微结构。


    这样一种使用较小的感知区域以及非常深的网络结构,在图像识别取得了比以往结构都要好的准确率,并且,实验证明,网络结构越深,准确度越高。在具体的训练过程上,即训练一个多分类器,方案基本和上一篇一样,因此这里就不再详细展开了。(后面我会就训练深度神经网络写一篇)




今日名句:

人们宁愿自我欺骗,也不愿意相信自己是被欺骗的。因为他活在自己的“思维之墙”当中。
 
 
 
 
 来源:张泽旺 深度学习每日摘要
智造家 查看全部

15.1_.jpg

 
非常深度的卷积神经网络应用于图像识别


    卷积神经网络在图像识别中的应用非常多,因为卷积神经网络善于应对图像的空间变化。


    对于一张像素为224*224的三通道RGB图片,我们可以首先对其进行一定程度地预处理。预处理的方式一般比较简单,即对每个通道进行归一化(每个通道上的每个像素值减去所有像素的平均值)。


    这里与第一篇应用所不同的是,为了持续提高图像识别的准确度和减少内存的消耗,一种非常深度的卷积神经网络被提出来了。之所以说减少内存,是因为这里没有使用局部响应归一化层,并且与以前所使用的卷积神经网络所不同的是,以前的卷积神经网络在较浅层往往会使用较大的感知区域,例如11*11或9*9,平移大小一般设为2,这样所提取的局部区域特征信息有可能会有损失,而这里使用的是3*3较小的局部感知区域,并且平移大小设置为1,这样就可以充分挖掘更多更精细的局部特征信息。


    其实使用两个3*3的感知区域叠加起来看起来跟一个5*5的感知区域的效果一样,那为什么还要使用两个3*3的感知区域堆叠起来而不使用一个5*5的感知区域呢呢?原因很简单有以下。



    第一,仅仅使用一层5*5的感知区域卷积层,这样只有一层非线性的ReLU函数,而使用两层3*3堆叠起来则包含两层非线性的ReLU函数,这样使得非线性的决策性更充分,换句话说可以对特征进行了很多可能的探索;


    第二,使用两个3*3的感知区域卷积层堆叠起来要比使用一个5*5的感知区域卷积层所含参数少,因为如果假设两个3*3的感知区域堆叠层的通道数为C,那么它所包含的参数个数为2*(3^2*C^2)=18C^2;而对于一个5*5的感知区域卷积层,它所包含的参数个数为1*(5^2*C^2)=25C^2。


    因此,使用这样一种较小的感知区和较深的卷积层,可以看成对原来较大感知区域进行再次分解,并且在其中还添加了更多的非线性决策能力,因此可以使得特征提取更为健壮。
        
15.2_.JPG


    在上表中,可以注意到还有一个明显不同的特殊卷积层,那就是1*1的感知区的卷积层(如表中conv1字样所示),这种感知区大小为1*1,即卷积前后维度仍然保持不变,可以看做对单个神经元进行一个非线性操作,大家可能觉得这不就是一种全连接的前馈式神经网络吗?其实不是的,注意卷积神经网络有一个重要的特点,那就是权重共享,也就是说这里每一个神经元都会乘以同一个权重标量,即所有神经元进行统一的线性映射,然后再通过一个非线性ReLU函数。这样做的好处是什么呢?最明显的一点是它既具有特征变换的性质,又在一定程度上避免了全连接神经网络过拟合的可能。以后我会在讲解Network in Network概念的时候中去详细说明这个微结构。


    这样一种使用较小的感知区域以及非常深的网络结构,在图像识别取得了比以往结构都要好的准确率,并且,实验证明,网络结构越深,准确度越高。在具体的训练过程上,即训练一个多分类器,方案基本和上一篇一样,因此这里就不再详细展开了。(后面我会就训练深度神经网络写一篇)




今日名句:

人们宁愿自我欺骗,也不愿意相信自己是被欺骗的。因为他活在自己的“思维之墙”当中。
 
 
 
 
 来源:张泽旺 深度学习每日摘要
智造家
304 浏览

我所理解的深度学习(三)

机械自动化类 喷漆李 2016-12-05 14:40 发表了文章 来自相关话题

前言:从本期开始,我将连续讲解卷积神经网络在图像识别、语音识别等领域的应用。在正文中,卷积神经网络使用缩写CNN来代替。



    CNN最早被应用于图像识别领域,鉴于它具有可以适应空间变化的优势。在2012年的ILSVRC(ImageNet Large Scale Visual Recognition Competition)比赛中,一个由Hinton小组提出来的包含6000万个参数和65万个神经元的五层Deep CNN(以下统称为DCNN)成功地取得了该比赛即图像识别的第一名。
 
ImageNet数据库包含150万张图片,它们被分类成22000个不同类别的物体。ILSVRC使用了其中的120万张图片作为训练集,5万张图片作为验证集,15万张图片作为测试集,图片的类别一共选取了1000种。每张图片被预处理成维度为256*256大小,并且使用RGB三个通道的像素值作为训练的输入数据。



    此DCNN结构包括五个卷积层和三个全连接层,在最后一层全连接层的基础上,紧接着一个Softmax层,它的作用是映射到1000个类别的概率分布。
 
DCNN使用256*256*3的图片像素矩阵作为输入层,第一个卷积层包含了96个卷积核,并且每个核的大小为11*11*3;第二个卷积层包含了256个卷积核,并且每个核的大小为5*5*96;第三个卷积层包含了384个卷积核,并且每个核的大小为3*3*256;第四个卷积层包含了384个卷积核,并且每个核的大小为3*3*384;第五个卷积层包含了256个卷积核,并且每个核的大小为3*3*284。其中第一层和第二层之间、第二层和第三层之间均含有一个最大池化层,这里池化的方式是采取了有交叠的池化,即池化大小为3*3,平移量大小为2*2,实验表明采取这种有交叠的池化方式可以有效减少过拟合。最后有三个全连接层,它们的神经元个数分别是4092、4092、1000。因此,总体的网络结构如下所示:


      输入层:256*256*3


              ↓ (卷积大小11*11*3)
            96核卷积层
               ↓
              最大池化层(3*3,2*2)
            ↓ (卷积大小5*5*96)
           256核卷积层
                ↓
           最大池化层(3*3,2*2)
            ↓ (卷积大小3*3*256)
            384核卷积层
           ↓ (卷积大小3*3*384)
            384核卷积层
           ↓ (卷积大小3*3*384)
         256核卷积层
            ↓ (卷积大小3*3*384)    
         全连接层(4092个神经元)
           ↓
            全连接层 (4092个神经元)
               ↓
             全连接层 (1000个神经元)
           ↓
         1000个类别的概率分布

    

    以上就是此DCNN的详细结构,除此之外,还有一些重要的特征需要说明一下。第一,该结构中使用的激活函数均为ReLU函数,此函数在一定程度上具有可以避免梯度消失问题的优势,尽管现在已经有更好的激活函数可以代替ReLU了(后面我会专门讲一期深度学习中的激活函数);此训练是在多GPU上进行的;另外,网络中还加入了局部响应归一化这一技巧(后面我会专门讲这个)。


    为了防止过拟合,在此DCNN结构的前两个全连接层中引入了比例为0.5的dropout,即在训练时让一半的神经元不起作用(数学上即激活值设为0),在测试的时候使用所有的神经元并且将它们的激活值乘以0.5,实验表明,采取此Dropout有效地避免了过拟合,但是收敛所需要的迭代次数比不引入Dropout的迭代次数多一倍。


    此DCNN训练所使用的算法是具有动量的批量随机梯度下降算法,每一个批的大小为128个样本,动量因子为0.9,权重削弱比例为0.0005。所有权重的初始化为均值为0,标准差为0.01的高斯分布。并且卷积层中,第二层、第三层、第五层的偏置初始化为1,其余的偏置初始化为0。


最后分享摘自《成熟比成功更重要》一书中关于工作重要性的一段话:

• 如果你对幸福的看法是无止境的悠闲,如果你期望退休后躺在摇椅上,那么你是活在一个愚人的天堂。因为懒惰是人类最大的敌人,它只会制造悲哀、早衰和死亡。适量的工作而不是过度紧张的工作,不会对人造成伤害,但过分的安逸却会。 
 
 
 
 
来源: 张泽旺 深度学习每日摘要
智造家 查看全部
3.1_.jpg

前言:从本期开始,我将连续讲解卷积神经网络在图像识别、语音识别等领域的应用。在正文中,卷积神经网络使用缩写CNN来代替。



    CNN最早被应用于图像识别领域,鉴于它具有可以适应空间变化的优势。在2012年的ILSVRC(ImageNet Large Scale Visual Recognition Competition)比赛中,一个由Hinton小组提出来的包含6000万个参数和65万个神经元的五层Deep CNN(以下统称为DCNN)成功地取得了该比赛即图像识别的第一名。
 
ImageNet数据库包含150万张图片,它们被分类成22000个不同类别的物体。ILSVRC使用了其中的120万张图片作为训练集,5万张图片作为验证集,15万张图片作为测试集,图片的类别一共选取了1000种。每张图片被预处理成维度为256*256大小,并且使用RGB三个通道的像素值作为训练的输入数据。



    此DCNN结构包括五个卷积层和三个全连接层,在最后一层全连接层的基础上,紧接着一个Softmax层,它的作用是映射到1000个类别的概率分布。
 
DCNN使用256*256*3的图片像素矩阵作为输入层,第一个卷积层包含了96个卷积核,并且每个核的大小为11*11*3;第二个卷积层包含了256个卷积核,并且每个核的大小为5*5*96;第三个卷积层包含了384个卷积核,并且每个核的大小为3*3*256;第四个卷积层包含了384个卷积核,并且每个核的大小为3*3*384;第五个卷积层包含了256个卷积核,并且每个核的大小为3*3*284。其中第一层和第二层之间、第二层和第三层之间均含有一个最大池化层,这里池化的方式是采取了有交叠的池化,即池化大小为3*3,平移量大小为2*2,实验表明采取这种有交叠的池化方式可以有效减少过拟合。最后有三个全连接层,它们的神经元个数分别是4092、4092、1000。因此,总体的网络结构如下所示:


      输入层:256*256*3


              ↓ (卷积大小11*11*3)
            96核卷积层
               ↓
              最大池化层(3*3,2*2)
            ↓ (卷积大小5*5*96)
           256核卷积层
                ↓
           最大池化层(3*3,2*2)
            ↓ (卷积大小3*3*256)
            384核卷积层
           ↓ (卷积大小3*3*384)
            384核卷积层
           ↓ (卷积大小3*3*384)
         256核卷积层
            ↓ (卷积大小3*3*384)    
         全连接层(4092个神经元)
           ↓
            全连接层 (4092个神经元)
               ↓
             全连接层 (1000个神经元)
           ↓
         1000个类别的概率分布

    

    以上就是此DCNN的详细结构,除此之外,还有一些重要的特征需要说明一下。第一,该结构中使用的激活函数均为ReLU函数,此函数在一定程度上具有可以避免梯度消失问题的优势,尽管现在已经有更好的激活函数可以代替ReLU了(后面我会专门讲一期深度学习中的激活函数);此训练是在多GPU上进行的;另外,网络中还加入了局部响应归一化这一技巧(后面我会专门讲这个)。


    为了防止过拟合,在此DCNN结构的前两个全连接层中引入了比例为0.5的dropout,即在训练时让一半的神经元不起作用(数学上即激活值设为0),在测试的时候使用所有的神经元并且将它们的激活值乘以0.5,实验表明,采取此Dropout有效地避免了过拟合,但是收敛所需要的迭代次数比不引入Dropout的迭代次数多一倍。


    此DCNN训练所使用的算法是具有动量的批量随机梯度下降算法,每一个批的大小为128个样本,动量因子为0.9,权重削弱比例为0.0005。所有权重的初始化为均值为0,标准差为0.01的高斯分布。并且卷积层中,第二层、第三层、第五层的偏置初始化为1,其余的偏置初始化为0。


最后分享摘自《成熟比成功更重要》一书中关于工作重要性的一段话:

• 如果你对幸福的看法是无止境的悠闲,如果你期望退休后躺在摇椅上,那么你是活在一个愚人的天堂。因为懒惰是人类最大的敌人,它只会制造悲哀、早衰和死亡。适量的工作而不是过度紧张的工作,不会对人造成伤害,但过分的安逸却会。 
 
 
 
 
来源: 张泽旺 深度学习每日摘要
智造家
295 浏览

我所理解的深度学习(二)

机械自动化类 喷漆李 2016-12-05 14:30 发表了文章 来自相关话题

 
前言:上一期推送了一篇文采洋溢的散文,发现阅读量明显下降,看来技术宅男大概是不需要文学来熏陶的吧。这一期聊一下卷积神经网络的基础原理。
 
 

    前面提到了后向传播(BP)算法的基础图模型,这是在计算机自动求导中使用的最基本模型,它为深度学习模型的梯度下降算法训练提供了必要条件。有了BP算法的基础,现在来总体看一下深度学习的流程。
 

    深度学习一般包括三大块,即数据采集、模型构建、训练优化。其中,模型构建是起着至关重要的作用。从是否具有时间关联性的角度来看,深度学习分为非时序模型和时序模型。简单来说,非时序模型的应用场景是数据不具有时间维度上的展宽,例如一张图片;而时序模型的应用场景是数据需要具有时间维度上的展宽,例如一个音频文件或者视频文件。
 

    非时序模型的搭建一般相对容易,常见的有前馈式神经网络,它由输入层、隐含层和输出层构成,并且最显著的特征是它的隐含层上各神经元之间不存在连接,这就导致前馈式神经网络是不具有时序记忆性的。
 

    时序模型的处理要麻烦很多,最常见的时序模型时循环神经网络,它的总体结构和前馈式神经网络相似,最大的不同之处就是其隐含层上各神经元之间是存在连接的,即前一时刻的特征会对下一时刻产生一定的影响。
 

    无论是时序问题还是非时序问题,卷积神经网络都可以应用到其中。原因是卷积神经网络既可以对空间信息进行卷积,也可以对时间信息进行卷积。例如,在图像识别中,卷积神经网络的应用是在空间维度上的;在语音识别中,卷积神经网络的应用是在时间维度上的。接下来,我们来具体看一下卷积神经网络的原理。
 

    卷积神经网络通常由卷积层(Convolutional Layer)和池化层(Pooling Layer)构成,卷积神经网络可以用于一维数据,也可以用于二维数据,下面以二维数据来分析讲解。
 

    卷积层的操作通常是一定个数的滤波器构成的,滤波器负责依次对上一层的输入特征进行局部卷积操作,因此,这里一般需要设定一个卷积核的大小,在ImageNet比赛中,二维卷积核的大小为3*3,这也被认为是最佳的卷积核,滤波器的个数一般因数据量的大小而定义。值得注意的是,对于标准的卷积神经网络,在每个滤波器中,所有的局部卷积的权重是共享的,至于为什么需要共享权重,我想这个灵感是源自于图片的对称性,即你可以在一幅图片中识别出一只猫,而不管这个猫的姿势是水平的还是倾斜的,有点类似于编程中,写了一个函数,在多处被使用。
 

    对于每一个卷积层,除了滤波器的数量和卷积核的大小需要确定之外,还有铺平(padding)的大小需要确定,铺平即意味着在两端用0去补充;并且平移(stride)的大小也需要确定,在二维中,一般是指水平方向和垂直方向的每次局部卷积所移动的步长。
 

    这样,卷积层的操作就很易懂了,例如若一个原始特征矩阵为

    1    2    3
    4    5    6
 

设定只包含一个滤波器,卷积核的大小为2*2,并且padding为None,stride为(1,1),如果初始权重矩阵为

    0.1    0.2
    0.3    0.4
 

那么,局部卷积过后的矩阵为

    3.7    3.7
 
 

    上面就是卷积层的操作,下面来提一下另外一个结构——池化层。池化层简而言之就是局部降维。一方面池化是为了减少网络的参数,另一方面池化也是一种平滑处理的手段,即可以更大程度地减少噪音的负面影响。局部池化的维度(Pooling size)需要去设定,同时,池化也具有stride属性,含义同上。池化的方式一般有两种,最大池化和平均池化。最大池化的意思是对一个局部只取最大的那个元素保留下来;而平均池化的意思是对一个局部取所有元素的平均值保留下来。例如如果一个池化前的矩阵为

    1    2    9    4
    5    6    8    8
    7    8    6    9
    1    3    5    7
 

那么,若设定池化大小为(3,3),stride大小为(1,1),那么采取最大池化后的矩阵变为

    8    9
    8    9
 
 

以上就是卷积神经网络的基本结构了,下面附上一张图来直观感受一下。





 
 
 

来源;张泽旺 深度学习每日摘要
智造家 查看全部
2.1_.JPG

 
前言:上一期推送了一篇文采洋溢的散文,发现阅读量明显下降,看来技术宅男大概是不需要文学来熏陶的吧。这一期聊一下卷积神经网络的基础原理。
 
 

    前面提到了后向传播(BP)算法的基础图模型,这是在计算机自动求导中使用的最基本模型,它为深度学习模型的梯度下降算法训练提供了必要条件。有了BP算法的基础,现在来总体看一下深度学习的流程。
 

    深度学习一般包括三大块,即数据采集、模型构建、训练优化。其中,模型构建是起着至关重要的作用。从是否具有时间关联性的角度来看,深度学习分为非时序模型和时序模型。简单来说,非时序模型的应用场景是数据不具有时间维度上的展宽,例如一张图片;而时序模型的应用场景是数据需要具有时间维度上的展宽,例如一个音频文件或者视频文件。
 

    非时序模型的搭建一般相对容易,常见的有前馈式神经网络,它由输入层、隐含层和输出层构成,并且最显著的特征是它的隐含层上各神经元之间不存在连接,这就导致前馈式神经网络是不具有时序记忆性的。
 

    时序模型的处理要麻烦很多,最常见的时序模型时循环神经网络,它的总体结构和前馈式神经网络相似,最大的不同之处就是其隐含层上各神经元之间是存在连接的,即前一时刻的特征会对下一时刻产生一定的影响。
 

    无论是时序问题还是非时序问题,卷积神经网络都可以应用到其中。原因是卷积神经网络既可以对空间信息进行卷积,也可以对时间信息进行卷积。例如,在图像识别中,卷积神经网络的应用是在空间维度上的;在语音识别中,卷积神经网络的应用是在时间维度上的。接下来,我们来具体看一下卷积神经网络的原理。
 

    卷积神经网络通常由卷积层(Convolutional Layer)池化层(Pooling Layer)构成,卷积神经网络可以用于一维数据,也可以用于二维数据,下面以二维数据来分析讲解。
 

    卷积层的操作通常是一定个数的滤波器构成的,滤波器负责依次对上一层的输入特征进行局部卷积操作,因此,这里一般需要设定一个卷积核的大小,在ImageNet比赛中,二维卷积核的大小为3*3,这也被认为是最佳的卷积核,滤波器的个数一般因数据量的大小而定义。值得注意的是,对于标准的卷积神经网络,在每个滤波器中,所有的局部卷积的权重是共享的,至于为什么需要共享权重,我想这个灵感是源自于图片的对称性,即你可以在一幅图片中识别出一只猫,而不管这个猫的姿势是水平的还是倾斜的,有点类似于编程中,写了一个函数,在多处被使用。
 

    对于每一个卷积层,除了滤波器的数量和卷积核的大小需要确定之外,还有铺平(padding)的大小需要确定,铺平即意味着在两端用0去补充;并且平移(stride)的大小也需要确定,在二维中,一般是指水平方向和垂直方向的每次局部卷积所移动的步长。
 

    这样,卷积层的操作就很易懂了,例如若一个原始特征矩阵为

    1    2    3
    4    5    6
 

设定只包含一个滤波器,卷积核的大小为2*2,并且padding为None,stride为(1,1),如果初始权重矩阵为

    0.1    0.2
    0.3    0.4
 

那么,局部卷积过后的矩阵为

    3.7    3.7
 
 

    上面就是卷积层的操作,下面来提一下另外一个结构——池化层。池化层简而言之就是局部降维。一方面池化是为了减少网络的参数,另一方面池化也是一种平滑处理的手段,即可以更大程度地减少噪音的负面影响。局部池化的维度(Pooling size)需要去设定,同时,池化也具有stride属性,含义同上。池化的方式一般有两种,最大池化和平均池化。最大池化的意思是对一个局部只取最大的那个元素保留下来;而平均池化的意思是对一个局部取所有元素的平均值保留下来。例如如果一个池化前的矩阵为

    1    2    9    4
    5    6    8    8
    7    8    6    9
    1    3    5    7
 

那么,若设定池化大小为(3,3),stride大小为(1,1),那么采取最大池化后的矩阵变为

    8    9
    8    9
 
 

以上就是卷积神经网络的基本结构了,下面附上一张图来直观感受一下。

2.2_.jpg

 
 
 

来源;张泽旺 深度学习每日摘要
智造家
711 浏览

卷积神经网络技术及发展

智能科技类 小螺号 2016-09-20 10:04 发表了文章 来自相关话题

 
【导读】深度学习很火,说起深度学习中一个很重要的概念——卷积神经网络(CNN)似乎也人人皆知。不过,CNN究竟是什么,涉及哪些概念,经过如何发展,真正要有逻辑地归纳一遍,估计不少人都说不清。日前,南洋理工大学研究人员梳理CNN发展历史,从基础组成部分讲起,介绍并探讨CNN在视觉识别方面的原理及应用,是系统深入理解CNN的好文。
Recent Advances in Convolutional Neural Networks
 
 

摘要
 
过去几年,深度学习在解决诸如视觉识别、语音识别和自然语言处理等很多问题方面都表现出色。在不同类型的神经网络当中,卷积神经网络是得到最深入研究的。早期由于缺乏训练数据和计算能力,要在不产生过拟合的情况下训练高性能卷积神经网络是很困难的。标记数据和近来GPU的发展,使得卷积神经网络研究涌现并取得一流结果。本文中,我们将纵览卷积神经网络近来发展,同时介绍卷积神经网络在视觉识别方面的一些应用。
 
 
引言
 
卷积神经网络(CNN)是一种常见的深度学习架构,受生物自然视觉认知机制启发而来。1959年,Hubel & Wiesel [1] 发现,动物视觉皮层细胞负责检测光学信号。受此启发,1980年 Kunihiko Fukushima 提出了CNN的前身——neocognitron 。

20世纪 90 年代,LeCun et al. [3] 等人发表论文,确立了CNN的现代结构,后来又对其进行完善。他们设计了一种多层的人工神经网络,取名叫做LeNet-5,可以对手写数字做分类。和其他神经网络一样, LeNet-5 也能使用 backpropagation 算法训练。

CNN能够得出原始图像的有效表征,这使得CNN能够直接从原始像素中,经过极少的预处理,识别视觉上面的规律。然而,由于当时缺乏大规模训练数据,计算机的计算能力也跟不上,LeNet-5 对于复杂问题的处理结果并不理想。

2006年起,人们设计了很多方法,想要克服难以训练深度CNN的困难。其中,最著名的是 Krizhevsky et al.提出了一个经典的CNN 结构,并在图像识别任务上取得了重大突破。其方法的整体框架叫做 AlexNet,与 LeNet-5 类似,但要更加深一些。

AlexNet 取得成功后,研究人员又提出了其他的完善方法,其中最著名的要数 ZFNet [7], VGGNet [8], GoogleNet [9] 和 ResNet [10] 这四种。从结构看,CNN 发展的一个方向就是层数变得更多,ILSVRC 2015 冠军 ResNet 是 AlexNet 的20 多倍,是 VGGNet 的8 倍多。通过增加深度,网络便能够利用增加的非线性得出目标函数的近似结构,同时得出更好的特性表征。但是,这样做同时也增加了网络的整体复杂程度,使网络变得难以优化,很容易过拟合。

研究人员提出了很多方法来解决这一问题。在下面的章节中,我们会先列出CNN的组成部分,然后介绍CNN不同方面的最近进展,接着引入快速计算技巧,并探讨CNN在图像分类、物体识别等不同方面的应用进展,最后归纳总结。
 
 
基本组成部分
 
在不同的参考资料中,对 CNN的组成部分都有着不同的描述。不过,CNN的基本组成成分是十分接近的。

以分类数字的 LeNet-5 为例,这个 CNN 含有三种类型的神经网络层:






卷积层:学会识别输入数据的特性表征

池化(Pooling):典型的操作包括平均 pooling [12] 和最大化 pooling [13–15]






全连接层:将卷积层和Pooling 层堆叠起来以后,就能够形成一层或多层全连接层,这样就能够实现高阶的推力能力。
 
 
完善 CNN
 
自从 2012 年 AlexNet 成功以后,研究人员设计了很多种完善 CNN 的方法。在这一节中,我们将从 6 方面进行介绍。


1. 卷积层

1)网络中的网络(Network in Network,NIN):由 Lin et al. [21] 提出的基本网络结构






2) Inception module: 由 Szegedy et al. [9] 提出,是 NIN 的拓展


2. 池化层

池化层是CNN的重要组成部分,通过减少卷积层之间的连接,降低运算复杂程度。以下是常用的几种循环方法:

1)Lp 池化:Lp 池化是建立在复杂细胞运行机制的基础上,受生物启发而来 [24] [25]

2) 混合池化:受随机Dropout [16] 和 DropConnect [28], Yu et al. 启发而来

3)随机池化:随机循环 [30] 是受 drptout 启发而来的方法

4)Spectral 池化


3. 激活函数

常用的非线性激活函数有sigmoid、tanh、relu等等,前两者sigmoid/tanh比较常见于全链接层,后者relu常见于卷积层。

1) ReLU

2) Leaky ReLU

3) Parametric ReLU

4) Randomized ReLU

5) ELU

6) Maxout:

7) Probout


4. Loss 函数

1) Softmax loss

2) Hinge loss

3) Contrastive loss


5. 正则化






1)DropOut

2) DropConnect


6. 优化

1) 初始化权重

2) 随机梯度下降

3) 批量标准化

4) Shortcut 连接
 
 
CNN 应用
 
A 图像分类

B 物体检测

C 物体追踪

D 姿态预估(Pose estimatation)

E 文本检测识别

F 视觉 saliency 检测

G 行动识别

H 场景标记
 
 
讨论
 
深度CNN在图像处理、视频、语音和文本中取得了突破。本文种,我们主要从计算机视觉的角度对最近CNN取得的进展进行了深度的研究。我们讨论了CNN在不同方面取得的进步:比如,层的设计,活跃函数、损失函数、正则化、优化和快速计算。除了从CNN的各个方面回顾其进展,我们还介绍了CNN在计算机视觉任务上的应用,其中包括图像分类、物体检测、物体追踪、姿态估计、文本检测、视觉显著检测、动作识别和场景标签。

虽然在实验的测量中,CNN获得了巨大的成功,但是,仍然还有很多工作值得进一步研究。首先,鉴于最近的CNN变得越来越深,它们也需要大规模的数据库和巨大的计算能力,来展开训练。人为搜集标签数据库要求大量的人力劳动。所以,大家都渴望能开发出无监督式的CNN学习方式。

同时,为了加速训练进程,虽然已经有一些异步的SGD算法,证明了使用CPU和GPU集群可以在这方面获得成功,但是,开放高效可扩展的训练算法依然是有价值的。在训练的时间中,这些深度模型都是对内存有高的要求,并且消耗时间的,这使得它们无法在手机平台上部署。如何在不减少准确度的情况下,降低复杂性并获得快速执行的模型,这是重要的研究方向。

其次,我们发现,CNN运用于新任务的一个主要障碍是:如何选择合适的超参数?比如学习率、卷积过滤的核大小、层数等等,这需要大量的技术和经验。这些超参数存在内部依赖,这会让调整变得很昂贵。最近的研究显示,在学习式深度CNN架构的选择技巧上,存在巨大的提升空间。

最后,关于CNN,依然缺乏统一的理论。目前的CNN模型运作模式依然是黑箱。我们甚至都不知道它是如何工作的,工作原理是什么。当下,值得把更多的精力投入到研究CNN的基本规则上去。同时,正如早期的CNN发展是受到了生物视觉感知机制的启发,深度CNN和计算机神经科学二者需要进一步的深入研究。

有一些开放的问题,比如,生物学上大脑中的学习方式如何帮助人们设计更加高效的深度模型?带权重分享的回归计算方式是否可以计算人类的视觉皮质等等。

我们希望这篇文章不仅能让人们更好地理解CNN,同时也能促进CNN领域中未来的研究活动和应用发展。0文章导航← 【每日学习】Python在人工智能中的作用
 
 
 
 
文章来源于 未来科技学院智造家平台提供 查看全部

2.0_.jpg

 
【导读】深度学习很火,说起深度学习中一个很重要的概念——卷积神经网络(CNN)似乎也人人皆知。不过,CNN究竟是什么,涉及哪些概念,经过如何发展,真正要有逻辑地归纳一遍,估计不少人都说不清。日前,南洋理工大学研究人员梳理CNN发展历史,从基础组成部分讲起,介绍并探讨CNN在视觉识别方面的原理及应用,是系统深入理解CNN的好文。
Recent Advances in Convolutional Neural Networks
 
 

摘要
 
过去几年,深度学习在解决诸如视觉识别、语音识别和自然语言处理等很多问题方面都表现出色。在不同类型的神经网络当中,卷积神经网络是得到最深入研究的。早期由于缺乏训练数据和计算能力,要在不产生过拟合的情况下训练高性能卷积神经网络是很困难的。标记数据和近来GPU的发展,使得卷积神经网络研究涌现并取得一流结果。本文中,我们将纵览卷积神经网络近来发展,同时介绍卷积神经网络在视觉识别方面的一些应用。
 
 
引言
 
卷积神经网络(CNN)是一种常见的深度学习架构,受生物自然视觉认知机制启发而来。1959年,Hubel & Wiesel [1] 发现,动物视觉皮层细胞负责检测光学信号。受此启发,1980年 Kunihiko Fukushima 提出了CNN的前身——neocognitron 。

20世纪 90 年代,LeCun et al. [3] 等人发表论文,确立了CNN的现代结构,后来又对其进行完善。他们设计了一种多层的人工神经网络,取名叫做LeNet-5,可以对手写数字做分类。和其他神经网络一样, LeNet-5 也能使用 backpropagation 算法训练。

CNN能够得出原始图像的有效表征,这使得CNN能够直接从原始像素中,经过极少的预处理,识别视觉上面的规律。然而,由于当时缺乏大规模训练数据,计算机的计算能力也跟不上,LeNet-5 对于复杂问题的处理结果并不理想。

2006年起,人们设计了很多方法,想要克服难以训练深度CNN的困难。其中,最著名的是 Krizhevsky et al.提出了一个经典的CNN 结构,并在图像识别任务上取得了重大突破。其方法的整体框架叫做 AlexNet,与 LeNet-5 类似,但要更加深一些。

AlexNet 取得成功后,研究人员又提出了其他的完善方法,其中最著名的要数 ZFNet [7], VGGNet [8], GoogleNet [9] 和 ResNet [10] 这四种。从结构看,CNN 发展的一个方向就是层数变得更多,ILSVRC 2015 冠军 ResNet 是 AlexNet 的20 多倍,是 VGGNet 的8 倍多。通过增加深度,网络便能够利用增加的非线性得出目标函数的近似结构,同时得出更好的特性表征。但是,这样做同时也增加了网络的整体复杂程度,使网络变得难以优化,很容易过拟合。

研究人员提出了很多方法来解决这一问题。在下面的章节中,我们会先列出CNN的组成部分,然后介绍CNN不同方面的最近进展,接着引入快速计算技巧,并探讨CNN在图像分类、物体识别等不同方面的应用进展,最后归纳总结。
 
 
基本组成部分
 
在不同的参考资料中,对 CNN的组成部分都有着不同的描述。不过,CNN的基本组成成分是十分接近的。

以分类数字的 LeNet-5 为例,这个 CNN 含有三种类型的神经网络层:

2.1_.jpg


卷积层:学会识别输入数据的特性表征

池化(Pooling):典型的操作包括平均 pooling [12] 和最大化 pooling [13–15]

2.2_.jpg


全连接层:将卷积层和Pooling 层堆叠起来以后,就能够形成一层或多层全连接层,这样就能够实现高阶的推力能力。
 
 
完善 CNN
 
自从 2012 年 AlexNet 成功以后,研究人员设计了很多种完善 CNN 的方法。在这一节中,我们将从 6 方面进行介绍。


1. 卷积层

1)网络中的网络(Network in Network,NIN):由 Lin et al. [21] 提出的基本网络结构

2.3_.jpg


2) Inception module: 由 Szegedy et al. [9] 提出,是 NIN 的拓展


2. 池化层

池化层是CNN的重要组成部分,通过减少卷积层之间的连接,降低运算复杂程度。以下是常用的几种循环方法:

1)Lp 池化:Lp 池化是建立在复杂细胞运行机制的基础上,受生物启发而来 [24] [25]

2) 混合池化:受随机Dropout [16] 和 DropConnect [28], Yu et al. 启发而来

3)随机池化:随机循环 [30] 是受 drptout 启发而来的方法

4)Spectral 池化


3. 激活函数

常用的非线性激活函数有sigmoid、tanh、relu等等,前两者sigmoid/tanh比较常见于全链接层,后者relu常见于卷积层。

1) ReLU

2) Leaky ReLU

3) Parametric ReLU

4) Randomized ReLU

5) ELU

6) Maxout:

7) Probout


4. Loss 函数

1) Softmax loss

2) Hinge loss

3) Contrastive loss


5. 正则化

2.4_.jpg


1)DropOut

2) DropConnect


6. 优化

1) 初始化权重

2) 随机梯度下降

3) 批量标准化

4) Shortcut 连接
 
 
CNN 应用
 
A 图像分类

B 物体检测

C 物体追踪

D 姿态预估(Pose estimatation)

E 文本检测识别

F 视觉 saliency 检测

G 行动识别

H 场景标记
 
 
讨论
 
深度CNN在图像处理、视频、语音和文本中取得了突破。本文种,我们主要从计算机视觉的角度对最近CNN取得的进展进行了深度的研究。我们讨论了CNN在不同方面取得的进步:比如,层的设计,活跃函数、损失函数、正则化、优化和快速计算。除了从CNN的各个方面回顾其进展,我们还介绍了CNN在计算机视觉任务上的应用,其中包括图像分类、物体检测、物体追踪、姿态估计、文本检测、视觉显著检测、动作识别和场景标签。

虽然在实验的测量中,CNN获得了巨大的成功,但是,仍然还有很多工作值得进一步研究。首先,鉴于最近的CNN变得越来越深,它们也需要大规模的数据库和巨大的计算能力,来展开训练。人为搜集标签数据库要求大量的人力劳动。所以,大家都渴望能开发出无监督式的CNN学习方式。

同时,为了加速训练进程,虽然已经有一些异步的SGD算法,证明了使用CPU和GPU集群可以在这方面获得成功,但是,开放高效可扩展的训练算法依然是有价值的。在训练的时间中,这些深度模型都是对内存有高的要求,并且消耗时间的,这使得它们无法在手机平台上部署。如何在不减少准确度的情况下,降低复杂性并获得快速执行的模型,这是重要的研究方向。

其次,我们发现,CNN运用于新任务的一个主要障碍是:如何选择合适的超参数?比如学习率、卷积过滤的核大小、层数等等,这需要大量的技术和经验。这些超参数存在内部依赖,这会让调整变得很昂贵。最近的研究显示,在学习式深度CNN架构的选择技巧上,存在巨大的提升空间。

最后,关于CNN,依然缺乏统一的理论。目前的CNN模型运作模式依然是黑箱。我们甚至都不知道它是如何工作的,工作原理是什么。当下,值得把更多的精力投入到研究CNN的基本规则上去。同时,正如早期的CNN发展是受到了生物视觉感知机制的启发,深度CNN和计算机神经科学二者需要进一步的深入研究。

有一些开放的问题,比如,生物学上大脑中的学习方式如何帮助人们设计更加高效的深度模型?带权重分享的回归计算方式是否可以计算人类的视觉皮质等等。

我们希望这篇文章不仅能让人们更好地理解CNN,同时也能促进CNN领域中未来的研究活动和应用发展。0文章导航← 【每日学习】Python在人工智能中的作用
 
 
 
 
  • 文章来源于 未来科技学院
  • 智造家平台提供