1.标准卷积神经网络

标准的卷积神经网络由输入层、卷积层(convolutional layer)、下采样层(downsampling layer)、全连接层(fully—connected layer)和输出层构成。

  • 卷积层也称为检测层
  • 下采样层也称为池化层(pooling layer)

2.卷积神经网络的优势:

第一个特点和优势就是:局部感知

  • 在传统神经网络中每个神经元都要与图片上每个像素相连接,
  • 这样的话就会造成权重的数量巨大造成网络难以训练。
  • 而在含有卷积层的神经网络中每个神经元的权重个数都时卷积核的大小,
  • 这样就相当于神经元只与对应图片部分的像素相连接。
  • 这样就极大的减少了权重的数量。同时我们可以设置卷积操作的步长,
  • 但是步长的设置并无定值需要使用者自己尝试

第二个特点和优势就是:参数共享

  • 卷积核的权重是经过学习得到的,并且在卷积过程中卷积核的权重是不会改变的,这就是参数共享的思想。
  • 通过一个卷积核的操作提取了原图的不同位置的同样特征。
  • 简单来说就是在一幅图片中的不同位置的相同目标,它们的特征是基本相同的

第三个特点和优势就是:多卷积核

  • 我们用一个卷积核操作只能得到一部分特征可能获取不到全部特征,
  • 所以为了能够得到图像更多的特征信息我们引入了多核卷积。
  • 用多个卷积核来学习图像更多的不同的特征(每个卷积核学习到不同的权重)。
  • 主要注意的是在多核卷积的过程中每一层的多个卷积核的大小应该是相同的。

3.关于卷积

先了解卷积运算:内卷积和外卷积(具体如下图)

内卷积:

外卷积:

卷积层的作用:

  • 卷积层的每一个卷积滤波器作用于整个感受野中,对输入图像进行卷积,
  • 卷积的结果构成了输入图像的特征图,从而经过卷积层后就提取出了图像的局部特征。
  • 所以卷积层的主要作用就是可以利用不同的卷积核(也叫滤波器)来提取图像不同的特征。
  • 它是识别图像最核心的部分。

4.关于池化

池化方式:(最大池化、平均池化)

  • 池化层的具体操作与卷基层的操作基本相同,只不过池化层的卷积核为只取对应位置的最大值或平均值(最大池化、平均池化),
  • 并且不会随着反向传播发生变化。一般池化层的filter取2*2,最大取3*3,stride取2,特征信息压缩为原来的1/4。

最大池化方式(每个小块中的最大值):

平均池化方式(每个小块中的平均值):

池化层的作用:

  • 池化层可对提取到的特征信息进行降维,
  • 一方面使特征图变小,简化网络计算复杂度并在一定程度上避免过拟合的出现;一方面进行特征压缩,提取主要特征。
  • 最大池采样在计算机视觉中的价值体现在两个方面:(1)、它减小了来自上层隐藏层的计算复杂度;(2)、这些池化单元具有平移不变性,即使图像有小的位移,提取到的特征依然会保持不变。由于增强了对位移的鲁棒性,这样可以忽略目标的倾斜、旋转之类的相对位置的变化,以此提高精度,最大池采样方法是一个高效的降低数据维度的采样方法。
  • 需要注意的是:这里的pooling操作是特征图缩小,有可能影响网络的准确度。

5.Tensorflow实现

def conv2d(input, filter, strides, padding, use_cudnn_on_gpu=None,data_format=None, name=None)

除去name参数用以指定该操作的name,与方法有关的一共五个参数:

第一个参数input:

  • 指需要做卷积的输入图像,它要求是一个Tensor,具有[batch, in_height, in_width, in_channels]这样的shape,
  • 具体含义是[训练时一个batch的图片数量, 图片高度, 图片宽度, 图像通道数],
  • 注意这是一个4维的Tensor,要求类型为float32和float64其中之一

第二个参数filter:

  • 相当于CNN中的卷积核,它要求是一个Tensor,具有[filter_height, filter_width, in_channels, out_channels]这样的shape,
  • 具体含义是[卷积核的高度,卷积核的宽度,图像通道数,卷积核个数],
  • 要求类型与参数input相同,
  • 有一个地方需要注意,第三维in_channels,就是参数input的第四维

第三个参数strides:

  • 卷积时在图像每一维的步长,这是一个一维的向量,长度4
  • strides[0] = strides[3] = 1
  • strides[1]代表x方向的步长,strides[2]代表y方向的步长

第四个参数padding:

  • string类型的量,只能是"SAME","VALID"其中之一,这个值决定了不同的卷积方式
  • 对于卷积操作:
    • SAME PADDING代表给平面外部补0,卷积窗口采样后得到一个跟原来平面大小相同的平面
    • VALID PADDING代表不会超出平面外部,卷积窗口采样后得到比原来平面小的平面。
  • 对于池化操作:
    • SAME PADDING代表可能会给平面外部补0
    • VALID PADDING代表不会超出平面外部

举例理解:
假如有一个28*28的平面,用2*2并且步长为2的窗口对其进行pooling操作

使用SAME PADDING的方式,得到14*14的平面
使用VALID PADDING的方式,得到14*14的平面

假如有一个2*3的平面,用2*2并且步长为2的窗口对其进行pooling操作

使用SAME PADDING的方式,得到1*2的平面
使用VALID PADDING的方式,得到1*1的平面

第五个参数:use_cudnn_on_gpu:bool类型,是否使用cudnn加速,默认为true

结果返回一个Tensor,这个输出,就是我们常说的feature map

6.卷积神经网络对MNIST手写数据集识别优化

实现代码:

 import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = ''
import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data #载入数据集
mnist = input_data.read_data_sets('MNIST_data', one_hot=True) #每个批次的大小
batch_size = 100 #计算一个有多少个批次
n_batch = mnist.train.num_examples // batch_size #初始化权值
def weight_variable(shape):
initial = tf.truncated_normal(shape, stddev=0.1)#生成一个截断的正态分布
return tf.Variable(initial) #初始化偏置
def bias_variable(shape):
initial = tf.constant(0.1, shape=shape)
return tf.Variable(initial) #卷积层
def conv2d(x,W):
# x input tensor of shape `[batch, in_height, in_width, in_channels]`
# W filter / kernel tensor of shape [filter_height, filter_width, in_channels, out_channels]
# `strides[0] = strides[3] = 1`. strides[1]代表x方向的步长,strides[2]代表y方向的步长
# padding: A `string` from: `"SAME", "VALID"`
return tf.nn.conv2d(x, W, strides=[1, 1, 1, 1], padding='SAME') #池化层
def max_pool_2x2(x):
# ksize [1,x,y,1]
return tf.nn.max_pool(x, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding='SAME') #定义两个placeholder
x = tf.placeholder(tf.float32, [None, 784]) #28*28
y = tf.placeholder(tf.float32, [None,10]) #改变x的格式转为4D的向量[batch,in_height,in_width,in_channels]
x_image = tf.reshape(x, [-1, 28, 28, 1]) #初始化第一个卷积层的权值和偏置
W_conv1 = weight_variable([5, 5, 1, 32]) #5*5的采样窗口,32个卷积核从1个平面抽取特征
b_conv1 = bias_variable([32]) #每一个卷积核一个偏置值 #把x_image和权值向量进行卷积,再加上偏置值,然后应用于relu激活函数
h_conv1 = tf.nn.relu(conv2d(x_image, W_conv1) + b_conv1)
h_pool1 = max_pool_2x2(h_conv1) #初始第二个卷积层的权值和偏置值
W_conv2 = weight_variable([5, 5, 32, 64])#5*5的采样窗口,64个卷积核从32个平面抽取特征
b_conv2 = bias_variable([64]) #把h_pool1和权值向量进行卷积,再加上偏置值,然后应用于relu激活函数
h_conv2 = tf.nn.relu(conv2d(h_pool1, W_conv2) + b_conv2)
h_pool2 = max_pool_2x2(h_conv2) #28*28的图片第一次卷积后还是28*28,第一次池化后变成14*14
#第二次卷积为14*14,第二次池化后变成可7*7
#经过上面的操作后得到64张7*7的平面 #初始化第一个全连接层的权值
W_fc1 = weight_variable([7*7*64, 1024])#上一层有7*7*64个神经元,全连接层有1024个神经元
b_fc1 = bias_variable([1024])#1024个节点 #把池化层2的输出扁平化为1维
h_pool2_flat = tf.reshape(h_pool2, [-1, 7*7*64]) #求第一个全连接层的输出
h_fc1 = tf.nn.relu(tf.matmul(h_pool2_flat, W_fc1) + b_fc1) #keep_prob用来表示神经元的输出概率
keep_prob = tf.placeholder(tf.float32)
h_fc1_drop = tf.nn.dropout(h_fc1, keep_prob) #初始化第二个全连接层
W_fc2 = weight_variable([1024, 10])
b_fc2 = bias_variable([10]) #计算输出
prediction = tf.nn.softmax(tf.matmul(h_fc1_drop, W_fc2) + b_fc2) #交叉熵代价函数
cross_entropy = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=y, logits=prediction)) #使用AdmaOptimizer进行优化
train_step = tf.train.AdamOptimizer(1e-4).minimize(cross_entropy) #结果存放在一个布尔列表中
correct_prediction = tf.equal(tf.argmax(prediction, 1), tf.argmax(y, 1)) #求准确率
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32)) #变量初始化
init = tf.global_variables_initializer() with tf.Session() as sess:
sess.run(init)
for epoch in range(21):
for batch in range(n_batch):
batch_xs, batch_ys = mnist.train.next_batch(batch_size)
sess.run(train_step, feed_dict={x: batch_xs, y: batch_ys, keep_prob: 0.7})
acc = sess.run(accuracy, feed_dict={x: mnist.test.images[:5000], y: mnist.test.labels[:5000], keep_prob: 1.0})
print('Iter : ' + str(epoch) + ',Testing Accuracy = ' + str(acc))

#写在后面:

好久没有做学习总结

最近一直在给老师处理轴承数据,然后用深度学习做分类

每天就是忙忙忙

然后还要去健身

昨天是自己的生日,吃了一个超级可爱的小蛋糕

感觉自己还像个孩子

永远18岁

最近烦心事有点多

很多时候不必向别人解释自己

懂你的人自然而然就会懂

不懂得人解释也不懂

加油吧!小伙郭

加油,每一个为了生活而努力向前的人!

机器学习与Tensorflow(4)——卷积神经网络与tensorflow实现的更多相关文章

  1. TensorFlow 实战卷积神经网络之 LeNet

    欢迎大家关注我们的网站和系列教程:http://www.tensorflownews.com/,学习更多的机器学习.深度学习的知识! LeNet 项目简介 1994 年深度学习三巨头之一的 Yan L ...

  2. 使用TensorFlow的卷积神经网络识别自己的单个手写数字,填坑总结

    折腾了几天,爬了大大小小若干的坑,特记录如下.代码在最后面. 环境: Python3.6.4 + TensorFlow 1.5.1 + Win7 64位 + I5 3570 CPU 方法: 先用MNI ...

  3. Chinese-Text-Classification,用卷积神经网络基于 Tensorflow 实现的中文文本分类。

    用卷积神经网络基于 Tensorflow 实现的中文文本分类 项目地址: https://github.com/fendouai/Chinese-Text-Classification 欢迎提问:ht ...

  4. TensorFlow实现卷积神经网络

    1 卷积神经网络简介 在介绍卷积神经网络(CNN)之前,我们需要了解全连接神经网络与卷积神经网络的区别,下面先看一下两者的结构,如下所示: 图1 全连接神经网络与卷积神经网络结构 虽然上图中显示的全连 ...

  5. Kaggle系列1:手把手教你用tensorflow建立卷积神经网络实现猫狗图像分类

    去年研一的时候想做kaggle上的一道题目:猫狗分类,但是苦于对卷积神经网络一直没有很好的认识,现在把这篇文章的内容补上去.(部分代码参考网上的,我改变了卷积神经网络的网络结构,其实主要部分我加了一层 ...

  6. tensorflow CNN 卷积神经网络中的卷积层和池化层的代码和效果图

    tensorflow CNN 卷积神经网络中的卷积层和池化层的代码和效果图 因为很多 demo 都比较复杂,专门抽出这两个函数,写的 demo. 更多教程:http://www.tensorflown ...

  7. TensorFlow构建卷积神经网络/模型保存与加载/正则化

    TensorFlow 官方文档:https://www.tensorflow.org/api_guides/python/math_ops # Arithmetic Operators import ...

  8. Tensorflow之卷积神经网络(CNN)

    前馈神经网络的弊端 前一篇文章介绍过MNIST,是采用的前馈神经网络的结构,这种结构有一个很大的弊端,就是提供的样本必须面面俱到,否则就容易出现预测失败.如下图: 同样是在一个图片中找圆形,如果左边为 ...

  9. 跟我学算法-tensorflow 实现卷积神经网络

    我们采用的卷积神经网络是两层卷积层,两层池化层和两层全连接层 我们使用的数据是mnist数据,数据训练集的数据是50000*28*28*1 因为是黑白照片,所以通道数是1 第一次卷积采用64个filt ...

随机推荐

  1. centos系统有多个内核,修改默认启动内核

    打开系统文件 vim  /boot/grub/grub.conf default=0,意思是GRUB在默认情况下,也就是用户没有选择的情况下,去启动显示在用户界面的第一个系统:GRUB启动系统时是从0 ...

  2. Java获取工程目录

    背景:程序执行时,会涉及到去读取配置文件等操作,那就需要了解怎么获得文件路径   Java目录映射关系 说明一点:在Java代码执行时,会将编译生成的classes文件,以及配置文件等信息生成到tar ...

  3. 事件委托在ios下面失效

    $(document).on("click","目标class",function(){ //安卓下点击可以,ios下面失效 }) 百度了下说是H5新定义的, ...

  4. git基本

    基本的git操作 git config --global user.name "你的名字或昵称" git config --global user.email "你的邮箱 ...

  5. boost asio 学习(二)了解boost::bind

    2.了解boost::bind使用boost::bind封装一个函数,考虑以下例子示例2a #include <iostream> #include <boost/bind.hpp& ...

  6. wincvs配置方法

    1.安装wincvs_中文1.3.exe 2.安装cvsnt-2.5.03.2260.msi  安装过程中选择complete选项 3.安装python221-setup.exe 安装完成后,先配置环 ...

  7. Alpha 冲刺 (6/10)

    队名 火箭少男100 组长博客 林燊大哥 作业博客 Alpha 冲鸭鸭鸭鸭鸭鸭! 成员冲刺阶段情况 林燊(组长) 过去两天完成了哪些任务 协调各成员之间的工作 测试服务器并行能力 学习MSI.CUDA ...

  8. MFC字体样式和颜色设置

    在编写MFC界面程序时,可能会使用不同大小或者颜色的字体,这里稍做记录. 使用方法 CFont *m_pFont;//创建新的字体 m_pFont = new CFont; m_pFont->C ...

  9. Avro实现RPC

    场景:一个客户端,一个服务端(创建两个avro工程).客户端向服务端发送数据,服务端根据算法算出结果,返回给客户端. Http主外,RPC主内.(解决分布式环境下,节点间的数据通信或远程过程调用) 实 ...

  10. Django URLConf 进阶

    Django处理一个请求 项目启动后根据 settings  ROOT_URLCONF 决定项目根URLconf urlpatterns是django.conf.urls.url()实例的一个Pyth ...