赞
踩
卷积神经网络(Convolutional Neural Network,CNN)是一种前馈神经网络,它的人工神经元可以响应一部分覆盖范围内的周围单元,对于大型图像处理有出色表现,主要包括卷积层(convolutional layer)和池化层(pooling layer),主要应用于图像、视频、时间序列信号、音频信号、文本数据等。
一般的卷积神经网络都是由多个卷积层组成,每个卷积层主要包括以下几个部分:
1、图像会通过多个不同的卷积核进行滤波,并加偏置,提取出图像的局部特征,每一个卷积核都会映射一个新的2D图像。
2、将前面的卷积核的滤波输出结果,并使用非线性的激活函数进行处理。最常用的激活函数有ReLU函数以及它的变种,还有tan函数,以前最常用的激活函数是sigmoid函数。
3、对激活函数的结果进行池化操作(最大池化、平均池化),目的是为了达到降采样,将2×2的图片降为1×1。最常用的是最大池化,可以保留图像的显著特征,并提升模型的畸变容忍能力,提高模型的鲁棒性。
通过tensorflow来构建一个卷积神经网络并将其应用在MNIST手写数据集上,最后可以得到一个99%以上的准确率。这个模型主要包含四层:
第一层:卷积层,卷积核的大小为5×5,一共包含32个卷积核,步长为1,padding为SAME使得输出图片的大小和输入一致。
第二层:卷积层,卷积核的大小为5×5,一共包含64个卷积核, 步长核填充方式和上一层卷积层一样。
第三层:全连接层,输入7×7×64,输出一个1024维的向量,并使用dropout使得部分节点失活来防止过拟合。
第四层:softmax层,输入是一个1024维的向量,输出一个10维的向量。
第一层卷积层的输入是一个28×28×1的图片,图片的宽高都是28,图片通道为1,通过卷积层之后的输出为28×28×32,然后通过最大池化,输出为14×14×32。
- #第一层卷积
- w_conv1 = initial_weights([5,5,1,32])
- b_conv1 = initial_bais([32])
- h_conv1 = tf.nn.relu(tf.add(conv2d(x_image,w_conv1),b_conv1))
- h_pool1 = max_pool(h_conv1)
第二层卷积层的输入是14×14×32,通过卷积之后的输出是14×14×64,然后通过最大池化之后的输出为7×7×64。
- #第二层卷积
- w_conv2 = initial_weights([5,5,32,64])
- b_conv2 = initial_bais([64])
- h_conv2 = tf.nn.relu(tf.add(conv2d(h_pool1,w_conv2),b_conv2))
- h_pool2 = max_pool(h_conv2)
第三层的输入是一个7×7×64的向量,所以要在计算之前对第二层卷积层的结果进行reshap操作,全连接层通过ReLU激活函数之后,再对其进行dropout操作。
- #全连接
- w_fc1 = initial_weights([7*7*64,1024])
- b_fc1 = initial_bais([1024])
- h_pool2_flat = tf.reshape(h_pool2,shape=[-1,7*7*64])
- h_fc1 = tf.nn.relu(tf.matmul(h_pool2_flat,w_fc1)+b_fc1)
- #dropout防止过拟合
- keep_prob = tf.placeholder(dtype=tf.float32)
- h_fc1_drop = tf.nn.dropout(h_fc1,keep_prob)
第四层的输入是一个1024维的向量,输出是一个10维向量,表示属于0-9数字的概率。
- #softmax层
- w_fc2 = initial_weights([1024,10])
- b_fc2 = initial_bais([10])
- y_conv = tf.nn.softmax(tf.matmul(h_fc1_drop,w_fc2)+b_fc2)
在卷积神经网络中,权重的初始化很重要,这里我们使用的是一个截断的正态分布函数来参数权重,并保证参数的标准差为0.1。 截断的正态分布是指如果函数随机产生的值与均值的差值大于两倍的标准差,那这个值将会被重新生成,来保证初始化权重的值不会相差太大。
- '''
- 初始化权重
- '''
- def initial_weights(weight_shape):
- weights = tf.truncated_normal(weight_shape,mean=0.0,stddev=0.1,dtype=tf.float32)
- return tf.Variable(weights)
截距的值都初始化为0.1
- '''
- 初始化截距
- '''
- def initial_bais(bais_shape):
- bais = tf.constant(0.1,shape=bais_shape)
- return tf.Variable(bais)
卷积的步长为1,填充方式是SAME,来保证卷积的输入和输出的大小一致。
- '''
- 定义卷积函数
- '''
- def conv2d(X,w):
- return tf.nn.conv2d(X,w,strides=[1,1,1,1],padding="SAME")
最大池化的横向和纵向的步长都为2,使得输出图片大小为输入图片大小的一半,达到降采样的目的。
- '''
- 定义池化函数
- '''
- def max_pool(X):
- return tf.nn.max_pool(X,ksize=[1,2,2,1],strides=[1,2,2,1],padding="SAME")
完整代码链接
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。