TensorFlow实战:Chapter-3 CNN(卷积神经网络)

卷积神经网络简介

卷积神经网络(convolutional neural network,CNN)最初是用来解决图像识别等问题设计的,随着计算机的发展,现在CNN的应用已经非常广泛了,在自然语言处理(NLP)、医药发现、文本处理等等中都有应用。这里我们着重分析CNN在图像处理上的应用。

在早期图像处理识别研究中,最大的问题是如何组织特征,这是因为图像数据不像其他类型的数据可以通过人工理解来提取特征。在图像中,我们很难根据人为理解提取出有效的特征。在深度学习广泛应用之前,我们必须借助SIFT、HoG等特征提取算法结合SVM等机器学习算法进行图像处理识别。

CNN作为一个深度学习架构被提出的最初诉求,是降低对图像数据预处理的要求,以及避免复杂的特征工程。CNN可以直接使用图像作为输入,减少了许多特征提取的手续。CNN的最大特点在于卷积的权值共享结构,大幅度的减少神经网络的参数,同时防治了过拟合

CNN的提出

CNN概念最早来自感受野(Receptive Field),科学家对猫的视觉皮层细胞研究发现,每一个视觉神经元只会处理一小块区域的视野图像,即感受野

后来,提出神经认识机(Neocognitron)概念,神经认识机包含两类神经元,用来抽取特征的S-cells,还有用来抗形变的C-cells。S-cells对应CNN中的卷积滤波操作,而C-cells则对应激活函数、最大池化等操作

CNN的壮大

在最近的时间里,CNN最先是在ImageNet上大放光彩,随后被大众熟知,一直到现在成为图像处理的利器。先说说ImageNet.

ImageNet是一个基于WordNet(一个大型语义库)的大型图像数据库。在ImageNet中,将近1500万图片被关联到WordNet的大约20000个名词同义词集上,可以被认为是分类问题的一个类别。ImageNet每年都会举办图像识别相关的竞赛(ILSCVRC)。

 

总体上对CNN有一个了解,下面该细致的剖析CNN的每个部分 

卷积神经网络结构 

我们来对比一下CNN与传统神经网络的区别。下图显示了全连接神经网络的结构和CNN的结构对比

可以看到,CNN相对全连接神经网络所使用的权值参数大大减少了

卷积神经网络的常见网络结构 

常见的架构图如下: 

从一个实际的图片类型识别角度来看: 

总结下来, 一般来说,一个卷积神经网络主要由以下结构组成:

  • 输入层 
    输入层是整个神经网络的输入,一般代表的是图片的像素矩阵(一般为三维矩阵,即像素x像素x通道)

  • 卷积层 
    卷积层试图从输入层中抽象出更高的特征。

  • 池化层 
    保留最显著的特征,提升模型的畸变容忍能力。

  • 全连接层 
    图像中被抽象成了信息含量更高的特征在经过神经网络完成后续分类等任务。

  • 输出层 
    一般是使用softmax输出概率值或者分类结果。

下面重点介绍卷积层、池化层。

图像处理中的卷积

图像处理中的卷积计算,会先定义一个卷积核,而这个卷积核就是定义一个滤波器,卷积核与输入信号做加权叠加得到输出
也可以理解为二维变量的离散卷积,无论哪种卷积都离不开加权叠加的要义。

图像卷积示例如图: 

Kernel即定义的卷积核,Kernel与原图像(同等大小的区域)对应的加权叠加得到的值即为输出。

到这里,我们应该对卷积有了一个直观的认识了。

CNN内的卷积层处理和图像处理中的卷积非常相似,下面主要讲讲图像处理中的卷积类型与特点。

卷积的类型的参数

一个常见的卷积过程:

(蓝色为输入数据、阴影为卷积核、绿色为卷积输出) 
输入尺寸大小为:4x4 
滤波器尺寸大小为:3x3 
输出尺寸大小为:2x2

在卷积过程中:有一个步长(stride)参数:步长即每次filter移动的间隔距离。这里stride=1; 
如果难以理解stride的含义,看下一个例子。

下图为stride=2(横竖两个方向上)的卷积过程: 

输入尺寸大小为:4x4 
滤波器尺寸大小为:3x3 
输出尺寸大小为:2x2

从上两个例子可以看出,只要滤波器的尺寸不是1x1,那么输出尺寸必定会小于输入尺寸大小,而在实际的图片处理过程中,许多时候我们需要保持图像的大小不变,以便于图像的处理。为了保持输入和输出尺寸一致,同时也有卷积的效果。我们可以对输入图片的外圈做填充操作。

这里我们引入了另外一个参数:padding. zero-padding即在输入的外圈补零的圈数(这里为什么要补零,而不是其他数字:是因为数字零对卷积贡献为零,不会产生额外的偏差).

如果难以理解zero-padding的含义,看下一个例子。


下图为输入图像外圈补一圈零,即padding=1的卷积过程: 

输入尺寸大小为:5x5 
滤波器尺寸大小为:3x3 
输出尺寸大小为:5x5

可以看出输入和输出的尺寸大小一致

到这里,我们可以给出输入尺寸、输出尺寸、滤波器尺寸、stride和padding的关系:

输入图片的尺寸大小W1 x H1

卷积核(又称滤波器,以下都称滤波器)的大小F x F

输出图片的尺寸大小W2 x H2

stride:S padding:P

关系式如下: 
W2 = (W1-F+2P)/S + 1 
H2 = (H1-F+2P)/S + 1

还去有其他类型的卷积,更多卷积类型可参考点这里

卷积层

在CNN中,每一个卷积层会直接接受图像像素级输入,每一个卷积操作只会处理一小块图像,经过卷积变换后再传到后面的网络,每一层卷积都会提取数据特征,再经过组合和抽象形成更高阶的特征

卷积层原理

下面剖析一个卷积层的原理:

1. 一张32x32x3的图片(大小为32x32的3通道图片),滤波器大小为5x5x3(滤波器的深度必须与输入层的深度相同). 

2. 卷积运算同样也是通过向量运算实现的,这里我们把滤波器的值甩成一列向量W.(W大小为75x1). 
同时从输入图片中取同样大小的输入数据X(X大小也为75x1), 


每一次卷积的输出是一个数值,所以输出层的深度变为1.

  • 3. 一次完整的卷积过程后,得到一个28x28x1大小的输出图(这里又称为activation maps).

 

如果我们有6个5x5的滤波器,会得到一个6个28x28x1的输出图,那么叠加到一起就得到28x28x**6**的输出层 

4. 多个卷积层之间连接一起(多层之间又经过了激活函数),从低层的特征抽象到高层的特征. 
(这里其实有一个问题:就是多个卷积层直接连接,图像的尺寸会迅速下降,这不是我们想要的,在这里我们可以前面提到的zero-padding来维持输入输出尺寸一致)  

实际图片处理过程如下:

 

卷积层特点

一般卷积神经网络由多个卷积层构成,每个卷积层中通常会进行如下几个操作。

  1. 图像通过多个不同的卷积核的滤波,并添加偏置(bias),提取局部特征,每一个卷积核会映射出一个新的2D图像
  2. 将前面卷积核的滤波输出结果,进行非线性的激活函数处理
  3. 对激活函数的结构再进行池化操作(即降采样,后面会详细讲解),目前一般使用最大池化,保留最大特征,提示模型的畸变容忍能力

这几个步骤构成了常见的卷积层,当然也可以再加上LRN(Local Response Normalization,局部响应归一化层),还有Batch Normalization等.

权值共享

每一个卷积层中使用的过滤器参数是相同的,这就是卷积核的权值共享,这是CNN的一个非常重要的性质。

  • 从直观上理解,共享卷积核可以使得图像上的内容不受位置的影响,这提高了模型对平移的容忍性,这大大的提高了模型提取特征的能力
  • 从网络结构上来说,共享每一个卷积层的卷积核,可以大大减少网络的参数,这不仅可以降低计算的复杂度,而且还能减少因为连接过多导致的严重过拟合,从而提高了模型的泛化能力

权值共享与传统的全连接的区别如下图:

多卷积核

在每一个卷积层中,会使用多个卷积核运算,这是因为每一个卷积核滤波得到的图像就是一类特征的映射,我们提供越多的卷积核,能提供多个方向上的图像特征,可以从图像中抽象出有效而丰富的高阶特征。 

 

池化层

在通过卷积层获得输入的特征时,我们需要做的利用这么特征继续做分类运算。但是针对多个卷积核下的输出特征,依旧会面临着超庞大的参数运算,为了解决这个问题,我们依旧需要减少参数量。这里我们琢磨下,在使用卷积层时,是因为卷积运算可以有效的从输入中提取特征,我们可以对特征做再统计。这一再统计既要能够反映原输入的特征,又要能够降低数据量,我们很自然的想到了取平均值、最大值。这也是池化操作。

池化层原理

从CNN的总体结构上来看,在卷积层之间往往会加入一个池化层(pooling layer).池化层可以非常有效地缩小图片的尺寸。从而减少最后全连接层的参数,在加快计算速度的同时也防止了过拟合的产生。

池化层前向传播过程类似于卷积层的操作一样,也是通过移动一个类似滤波器的结构完成的,不同于卷积层的是,池化层的滤波器计算不是加权求和,而且求区域内的极大值或者平均值。

  1. 使用最多的是最大值操作的池化层,又称最大池化层(max pooling),计算图像区域内最大值,提取纹理效果较好

 

2 使用平均值操作的池化层,又称平均池化层(mean pooling),计算图像区域的平均值,保留背景更好  

3 随机池化(Stochastic-pooling),介于两者之间,通过对像素点按照数值大小赋予概率,再按照概率进行亚采样 

池化层算法

 

池化层特点

池化单元的平移不变性

这类似于卷积层的平移不变性。

显著减少参数数量

降采样进一步降低了输出参数量,并赋予模型对轻度形变的容忍性,提高了模型的泛化能力

TensorFlow中的CNN

说了那么多CNN的理论,下面该看看如何在TensorFlow中实现CNN了

这里按照官方api介绍官方api点这里

卷积

tf.nn.conv2d

conv2d(
    input,
    filter,
    strides,
    padding,
    use_cudnn_on_gpu=None,
    data_format=None,
    name=None
)
  • 给定输入Tensor的shape为[batch, in_height, in_width, in_channels],滤波器Tensor的shape为 [filter_height, filter_width, in_channels, out_channels], 计算过程如下: 
  1. 将滤波器平坦化为2-D矩阵,形状为[filter_height * filter_width * in_channels,output_channels]
  2. 从输入张量中提取图像块,形成一个形状为[batch,out_height,out_width,filter_height * filter_width * in_channels]的虚拟张量。
  3. 对于每一个图像块,做图像块矢量右乘滤波器矩阵。

#默认格式为NHWC:

output[b, i, j, k] =
sum_{di, dj, q} input[b, strides[1] * i + di, strides[2] * j + dj, q] *
                filter[di, dj, q, k]

必须保持 strides[0] = strides[3] = 1.大多数情况下水平方向和深度方向的步长是一致的:即strides = [1, stride, stride, 1]
参数 description
input A Tensor.类型必须为如下其一:half, float32 .是一个4-D的Tensor,格式取决于data_format参数
filter A Tensor.和input类型一致,是一个4-D的Tensor且shape为
[filter_height, filter_width, in_channels, out_channels]
strides A list of ints.一个长度为4的1-D tensor.指定了在输入的Tensor中每个维度滑动滤波的步长
padding 选择不同的填充方案,可选”SAME”或”VALID”
use_cudnn_on_gpu An optional bool. Defaults to True
data_format 指定输入和输出的数据格式(可选).可选择”NHWC”或者”NCHW”.默认为”NHWC”
”NHWC”:数据按[batch, height, width, channels]存储
”NCHW”: 数据按[batch, channels, height, width]存储
name 该ops的name(可选)
   
   
返回值 A Tensor. 类型和input相同,一个4-D的Tensor,格式取决于data_format

池化

tf.nn.max_pool

max_pool(
    value,
    ksize,
    strides,
    padding,
    data_format='NHWC',
    name=None
)
参数 description
value A 4-D Tensor 类型为 tf.float32.
shape为 [batch, height, width, channels]
ksize A list of ints that has length >= 4. The size of the window for each dimension of the input tensor.
strides A list of ints that has length >= 4. The stride of the sliding window for each dimension of the input tensor.
padding ‘VALID’ 或 ‘SAME’
data_format ‘NHWC’ 或 ‘NCHW’
name 该ops的name(可选)
   
   
返回值 A Tensor with type tf.float32

激活函数

方法(加粗的有详解) description
tf.nn.relu Computes rectified linear: max(features, 0)
tf.nn.relu6 Computes Rectified Linear 6: min(max(features, 0), 6)
tf.nn.crelu Computes Concatenated ReLU
tf.nn.elu Computes exponential linear: exp(features) - 1 if < 0, features otherwise.
tf.nn.softplus Computes softplus: log(exp(features) + 1).
tf.nn.softsign Computes softsign: features / (abs(features) + 1)
tf.nn.dropout Computes dropout
tf.nn.bias_add Adds bias to value
tf.sigmoid Computes sigmoid of x element-wise
tf.tanh Computes hyperbolic tangent of x element-wise

tf.nn.relu

relu(
features,
name=None
)

计算非线性映射:函数关系为 max(features, 0)

参数 description
features A Tensor. 类型是如下一个: float32, float64, int32, int64, uint8, int16, int8, uint16, half
name 该ops的name(可选)
   
   
返回值 A Tensor with sam type as features.

tf.nn.dropout

dropout(
    x,
    keep_prob,
    noise_shape=None,
    seed=None,
    name=None
)

使用概率keep_prob,将输入元素按比例放大1 / keep_prob,否则输出0.缩放是为了使预期的和不变

By default, each element is kept or dropped independently. If noise_shape is specified, it must be broadcastable to the shape of x, and only dimensions with noise_shape[i] == shape(x)[i] will make independent decisions. For example, if shape(x) = [k, l, m, n] and noise_shape = [k, 1, 1, n], each batch and channel component will be kept independently and each row and column will be kept or not kept together.
参数 description
x A tensor.
keep_prob A scalar Tensor with the same type as x. The probability that each element is kept
noise_shape A 1-D Tensor of type int32, representing the shape for randomly generated keep/drop flags
seed A Python integer. Used to create random seeds
name 该ops的name(可选)
   
   
返回值 A Tensor of the same shape of x.

tf.nn.bias_add

bias_add(
    value,
    bias,
    data_format=None,
    name=None
)
  • 参数 description
    value A Tensor with type float, double, int64, int32, uint8, int16, int8, complex64, or complex128.
    bias A 1-D Tensor with size matching the last dimension of value. Must be the same type as value unless value is a quantized type, in which case a different quantized type may be used.
    data_format ‘NHWC’ or ‘NCHW’
    name 该ops的name(可选)
       
       
    返回值 A Tensor with the same type as value

TensorFlow实现简易神经网络模型

MNIST数据集下的基础CNN 
使用的是结构为卷积–>池化–>卷积–>池化–>全连接层–>softmax层的卷积神经网络。 
下面直接贴代码:

#!/usr/bin/env python
#-*- coding:utf-8 -*-
# author:Administrator
# datetime:2018/8/1 0001 14:38

"""
卷积–>池化–>卷积–>池化–>全连接层–>softmax层的卷积神经网络。

"""

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

def weight_variable(shape):
    """
    使用卷积神经网络会有很多权重和偏置需要创建,我们可以定义初始化函数便于重复使用
    给权重制造一些随机噪声避免完全对称,使用截断的正态分布噪声,标准差为0.1
    :param shape:  需要创建的权重Shape
    :return:  权重Tensor
    """
    initial = tf.truncated_normal(shape,stddev=0.1)
    return tf.Variable(initial)

def bias_variable(shape):
    """
    偏置生成函数,因为激活函数使用的是Relu,我们给偏置增加一些小的正值,避免死亡节点
    :param shape:
    :return:
    """
    initial = tf.constant(0.1,shape=shape)
    return tf.Variable(initial)

def conv2d(x,W):
    """
    卷积层要重复使用,tf.nn.conv2d是TensorFlow中的二维卷积函数

    :param x: 输入,[5,5,1,32]代表卷积核是5*%,1个通道,32个不同卷积核
    :param W: 卷积的参数
       strides: 代表卷积末班移动的步长
       padding:代表填充,SAME代表输出输入尺寸一样
    :return:
    """
    return tf.nn.conv2d(x,W,strides=[1,1,1,1],padding='SAME')

def max_pool_2x2(x):
    """
        tf.nn.max_pool是TensorFLow中最大池化函数.我们使用2x2最大池化
        因为希望整体上缩小图片尺寸,因而池化层的strides设为横竖两个方向为2步长
    :param x:
    :return:
    """
    return tf.nn.max_pool(x,ksize=[1,2,2,1],strides=[1,2,2,1],padding='SAME')

def train(mnist):

    # 使用占位符
    x = tf.placeholder(tf.float32,[None,784])  # x 为特征
    y_ = tf.placeholder(tf.float32,[None,10])  # y_为label

    # 卷积中将1x78转换为28x28x1 [-1,,,]代表样本数量不变,[,,,1]代表通道数
    x_image = tf.reshape(x,[-1,28,28,1])

    # 第一个卷积层 [5,5,1,32] 代表卷积核大小5x5,1个通道,32个不同卷积核
    # 创建滤波器权值---》偏置-----》卷积----》池化
    W_conv1 = weight_variable([5,5,1,32])
    b_conv1 = bias_variable([32])
    h_conv1 = tf.nn.relu(conv2d(x_image,W_conv1) + b_conv1)   #28x28x1 与32个5x5x1滤波器 --> 28x28x32
    h_pool1 = max_pool_2x2(h_conv1)    # 28x28x32 -->14x14x32

    # 第二个卷积层,卷积核为5x5,通道数为32,有64个不同的卷积核
    W_conv2 = weight_variable([5,5,32,64])
    b_conv2 = bias_variable([64])
    h_conv2 = tf.nn.relu(conv2d(h_pool1,W_conv2) + b_conv2)        #14x14x32 与64个5x5x32滤波器 --> 14x14x64
    h_pool2 = max_pool_2x2(h_conv2)           #14x14x64 --> 7x7x64

    # h_pool2 的大小为7x7x64转为1-D 然后做FC层
    W_fc1 = weight_variable([7*7*64,1024])
    b_fc1 = bias_variable([1024])
    h_pool2_flat = tf.reshape(h_pool2,[-1,7*7*64])             #7x7x64 --> 1x3136
    h_fc1 = tf.nn.relu(tf.matmul(h_pool2_flat,W_fc1) + b_fc1)  #FC层传播 3136 --> 1024

    # 使用Dropout层减轻过拟合,通过一个placeholder传入一个keep_prob比率控制
    keep_prob = tf.placeholder(tf.float32)
    h_fc1_drop = tf.nn.dropout(h_fc1,keep_prob)

    # 将Dropout层的输出连接到一个softmax层,得到最后的概率输出
    W_fc2 = weight_variable([1024,10])
    b_fc2 = bias_variable([10])
    y_conv = tf.nn.softmax(tf.matmul(h_fc1_drop,W_fc2) + b_fc2)

    # 定义损失函数,使用交叉熵
    cross_entropy = tf.reduce_mean(-tf.reduce_sum(y_ * tf.log(y_conv),reduction_indices=[1]))
    train_step = tf.train.AdamOptimizer(1e-4).minimize(cross_entropy)

    # 定义评测准确率
    correct_predict = tf.equal(tf.argmax(y_conv,1),tf.argmax(y_,1))
    accuracy = tf.reduce_mean(tf.cast(correct_predict,tf.float32))

    # 开始训练
    with tf.Session() as sess:
        init_op = tf.global_variables_initializer()
        sess.run(init_op)

        STEP = 20000
        for i in range(STEP):
            batch = mnist.train.next_batch(50)
            if i % 100 ==0:
                train_accuracy = sess.run(accuracy,feed_dict={x:batch[0],
                                                              y_:batch[1],
                                                              keep_prob:1.0})
                print('step %d,training accuracy %g' % (i,train_accuracy))
            sess.run(train_step,feed_dict={x:batch[0],y_:batch[1],keep_prob:0.5})

        acc = sess.run(accuracy,feed_dict={x:mnist.test.images,
                                           y_:mnist.test.labels,
                                           keep_prob:1.0})
        print("test accuracy %g" % acc)

if __name__ == '__main__':
    mnist = input_data.read_data_sets("./tensorflow_jc/tensorflow_shizhan/mnist_data/", one_hot=True)  # 载入数据集
    train(mnist)

输出:

D:\anaconda\envs\tensorflow\python.exe D:/PythonWenjian/TensorFlow_jc/tensroflow_shizhan/TensorFlow_ch06.py
Extracting ./tensorflow_jc/tensorflow_shizhan/mnist_data/train-images-idx3-ubyte.gz
Extracting ./tensorflow_jc/tensorflow_shizhan/mnist_data/train-labels-idx1-ubyte.gz
Successfully downloaded t10k-images-idx3-ubyte.gz 1648877 bytes.
Extracting ./tensorflow_jc/tensorflow_shizhan/mnist_data/t10k-images-idx3-ubyte.gz
Successfully downloaded t10k-labels-idx1-ubyte.gz 4542 bytes.
Extracting ./tensorflow_jc/tensorflow_shizhan/mnist_data/t10k-labels-idx1-ubyte.gz
step 0,training accuracy 0.1
step 100,training accuracy 0.82
step 200,training accuracy 0.92
step 300,training accuracy 0.86
step 400,training accuracy 1
step 500,training accuracy 0.92
step 600,training accuracy 1
step 700,training accuracy 0.98
step 800,training accuracy 0.94
step 900,training accuracy 1
step 1000,training accuracy 0.96
step 1100,training accuracy 0.98
step 1200,training accuracy 0.96
step 1300,training accuracy 0.92
step 1400,training accuracy 0.92
step 1500,training accuracy 0.98
step 1600,training accuracy 0.96
step 1700,training accuracy 0.88
step 1800,training accuracy 0.96
step 1900,training accuracy 0.96
step 2000,training accuracy 0.94
step 2100,training accuracy 0.98
step 2200,training accuracy 1
step 2300,training accuracy 0.96
step 2400,training accuracy 0.98
step 2500,training accuracy 1
step 2600,training accuracy 1
step 2700,training accuracy 0.96
step 2800,training accuracy 1
step 2900,training accuracy 0.98
step 3000,training accuracy 0.98
step 3100,training accuracy 0.96
step 3200,training accuracy 0.98
step 3300,training accuracy 0.96
step 3400,training accuracy 1
step 3500,training accuracy 0.96
step 3600,training accuracy 0.98
step 3700,training accuracy 1
step 3800,training accuracy 0.96
step 3900,training accuracy 1
step 4000,training accuracy 0.98
step 4100,training accuracy 0.96
step 4200,training accuracy 0.98
step 4300,training accuracy 1
step 4400,training accuracy 1
step 4500,training accuracy 1
step 4600,training accuracy 1
step 4700,training accuracy 0.98
step 4800,training accuracy 0.98
step 4900,training accuracy 0.98
step 5000,training accuracy 1
step 5100,training accuracy 0.96
step 5200,training accuracy 1
step 5300,training accuracy 0.98
step 5400,training accuracy 1
step 5500,training accuracy 1
step 5600,training accuracy 1
step 5700,training accuracy 0.98
step 5800,training accuracy 0.96
step 5900,training accuracy 1
step 6000,training accuracy 0.98
step 6100,training accuracy 1
step 6200,training accuracy 0.96
step 6300,training accuracy 0.98
step 6400,training accuracy 1
step 6500,training accuracy 0.98
step 6600,training accuracy 1
step 6700,training accuracy 1
step 6800,training accuracy 1
step 6900,training accuracy 1
step 7000,training accuracy 0.98
step 7100,training accuracy 1
step 7200,training accuracy 1
step 7300,training accuracy 0.98
step 7400,training accuracy 1
step 7500,training accuracy 0.98
step 7600,training accuracy 0.98
step 7700,training accuracy 1
step 7800,training accuracy 1
step 7900,training accuracy 1
step 8000,training accuracy 0.94
step 8100,training accuracy 1
step 8200,training accuracy 0.98
step 8300,training accuracy 1
step 8400,training accuracy 0.98
step 8500,training accuracy 0.98
step 8600,training accuracy 1
step 8700,training accuracy 1
step 8800,training accuracy 1
step 8900,training accuracy 1
step 9000,training accuracy 1
step 9100,training accuracy 1
step 9200,training accuracy 0.98
step 9300,training accuracy 1
step 9400,training accuracy 1
step 9500,training accuracy 1
step 9600,training accuracy 1
step 9700,training accuracy 1
step 9800,training accuracy 1
step 9900,training accuracy 1
step 10000,training accuracy 1
step 10100,training accuracy 1
step 10200,training accuracy 1
step 10300,training accuracy 1
step 10400,training accuracy 0.98
step 10500,training accuracy 0.98
step 10600,training accuracy 1
step 10700,training accuracy 1
step 10800,training accuracy 1
step 10900,training accuracy 1
step 11000,training accuracy 1
step 11100,training accuracy 0.98
step 11200,training accuracy 1
step 11300,training accuracy 1
step 11400,training accuracy 1
step 11500,training accuracy 0.98
step 11600,training accuracy 1
step 11700,training accuracy 1
step 11800,training accuracy 1
step 11900,training accuracy 1
step 12000,training accuracy 1
step 12100,training accuracy 1
step 12200,training accuracy 1
step 12300,training accuracy 1
step 12400,training accuracy 1
step 12500,training accuracy 1
step 12600,training accuracy 1
step 12700,training accuracy 1
step 12800,training accuracy 1
step 12900,training accuracy 0.98
step 13000,training accuracy 1
step 13100,training accuracy 1
step 13200,training accuracy 1
step 13300,training accuracy 0.98
step 13400,training accuracy 0.98
step 13500,training accuracy 1
step 13600,training accuracy 1
step 13700,training accuracy 1
step 13800,training accuracy 1
step 13900,training accuracy 1
step 14000,training accuracy 1
step 14100,training accuracy 1
step 14200,training accuracy 1
step 14300,training accuracy 1
step 14400,training accuracy 1
step 14500,training accuracy 1
step 14600,training accuracy 1
step 14700,training accuracy 1
step 14800,training accuracy 1
step 14900,training accuracy 1
step 15000,training accuracy 1
step 15100,training accuracy 1
step 15200,training accuracy 1
step 15300,training accuracy 1
step 15400,training accuracy 1
step 15500,training accuracy 1
step 15600,training accuracy 1
step 15700,training accuracy 1
step 15800,training accuracy 1
step 15900,training accuracy 1
step 16000,training accuracy 1
step 16100,training accuracy 1
step 16200,training accuracy 1
step 16300,training accuracy 1
step 16400,training accuracy 1
step 16500,training accuracy 1
step 16600,training accuracy 1
step 16700,training accuracy 1
step 16800,training accuracy 1
step 16900,training accuracy 1
step 17000,training accuracy 1
step 17100,training accuracy 1
step 17200,training accuracy 1
step 17300,training accuracy 1
step 17400,training accuracy 1
step 17500,training accuracy 1
step 17600,training accuracy 0.98
step 17700,training accuracy 1
step 17800,training accuracy 1
step 17900,training accuracy 1
step 18000,training accuracy 1
step 18100,training accuracy 0.96
step 18200,training accuracy 1
step 18300,training accuracy 1
step 18400,training accuracy 1
step 18500,training accuracy 1
step 18600,training accuracy 1
step 18700,training accuracy 1
step 18800,training accuracy 1
step 18900,training accuracy 1
step 19000,training accuracy 1
step 19100,training accuracy 1
step 19200,training accuracy 1
step 19300,training accuracy 1
step 19400,training accuracy 1
step 19500,training accuracy 1
step 19600,training accuracy 1
step 19700,training accuracy 1
step 19800,training accuracy 1
step 19900,training accuracy 1
test accuracy 0.9924

可以看到CNN模型的准确率远高于深度神经网络的准确率,这主要归功于CNN的网络设计,CNN对图像特征的提取和抽象能力。依靠这卷积核权值共享,CNN的参数量没有爆炸,训练速度得到保证的同时也减轻了过拟合,整个模型的性能大大提升

猜你喜欢

转载自blog.csdn.net/abc_138/article/details/82758193