机器学习与Tensorflow(4)——卷积神经网络与tensorflow实现
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实现的更多相关文章
- TensorFlow 实战卷积神经网络之 LeNet
欢迎大家关注我们的网站和系列教程:http://www.tensorflownews.com/,学习更多的机器学习.深度学习的知识! LeNet 项目简介 1994 年深度学习三巨头之一的 Yan L ...
- 使用TensorFlow的卷积神经网络识别自己的单个手写数字,填坑总结
折腾了几天,爬了大大小小若干的坑,特记录如下.代码在最后面. 环境: Python3.6.4 + TensorFlow 1.5.1 + Win7 64位 + I5 3570 CPU 方法: 先用MNI ...
- Chinese-Text-Classification,用卷积神经网络基于 Tensorflow 实现的中文文本分类。
用卷积神经网络基于 Tensorflow 实现的中文文本分类 项目地址: https://github.com/fendouai/Chinese-Text-Classification 欢迎提问:ht ...
- TensorFlow实现卷积神经网络
1 卷积神经网络简介 在介绍卷积神经网络(CNN)之前,我们需要了解全连接神经网络与卷积神经网络的区别,下面先看一下两者的结构,如下所示: 图1 全连接神经网络与卷积神经网络结构 虽然上图中显示的全连 ...
- Kaggle系列1:手把手教你用tensorflow建立卷积神经网络实现猫狗图像分类
去年研一的时候想做kaggle上的一道题目:猫狗分类,但是苦于对卷积神经网络一直没有很好的认识,现在把这篇文章的内容补上去.(部分代码参考网上的,我改变了卷积神经网络的网络结构,其实主要部分我加了一层 ...
- tensorflow CNN 卷积神经网络中的卷积层和池化层的代码和效果图
tensorflow CNN 卷积神经网络中的卷积层和池化层的代码和效果图 因为很多 demo 都比较复杂,专门抽出这两个函数,写的 demo. 更多教程:http://www.tensorflown ...
- TensorFlow构建卷积神经网络/模型保存与加载/正则化
TensorFlow 官方文档:https://www.tensorflow.org/api_guides/python/math_ops # Arithmetic Operators import ...
- Tensorflow之卷积神经网络(CNN)
前馈神经网络的弊端 前一篇文章介绍过MNIST,是采用的前馈神经网络的结构,这种结构有一个很大的弊端,就是提供的样本必须面面俱到,否则就容易出现预测失败.如下图: 同样是在一个图片中找圆形,如果左边为 ...
- 跟我学算法-tensorflow 实现卷积神经网络
我们采用的卷积神经网络是两层卷积层,两层池化层和两层全连接层 我们使用的数据是mnist数据,数据训练集的数据是50000*28*28*1 因为是黑白照片,所以通道数是1 第一次卷积采用64个filt ...
随机推荐
- ajax请求导致status为canceled(无任何回调数据)的原因
1.故障现象 一个普通的ajax请求,请求能够到达controller,也能正常处理业务,但是ajax的回调函数为空,即没有任何状态和数据返回,使用谷歌浏览器查看请求状态如下图: 出现该错误:简单来说 ...
- TCP/UDP 常用端口列表
计算机之间依照互联网传输层TCP/IP协议不同的协议通信,都有不同的对应端口.所以,利用短信(datagram)的UDP,所采用的端口号码不一定和采用TCP的端口号码一样.以下为两种通信协议的端口列表 ...
- java 虚拟机栈
与程序计数器一样,Java虚拟机栈也是线程私有的,他的生命周期与线程相同.虚拟机栈描述的是Java执行的内存模型:每个方法被执行的时候都会同时创建一个栈帧用于存储局部变量表,操作栈,动态链接,方法出口 ...
- m文件转换c代码
parametet.mclc; clear; load('src.mat') CZT_N = ; CZT_M = ; CZT_W = exp(-j*(*pi/)); CZT_A = exp(j**pi ...
- 【实习】从ubuntu迁移过来的代码,在centos上编译问题的解决汇总
目前自己的开发环境(同将来线上环境)是centos 7.我这里主要实现服务端.需要组里其他同学提供一个接口(视频编辑).公司内部自己开发环境 通常是台式ubuntu16.04.所以提供视频处理接口是在 ...
- 六、maven仓库中安装没有的jar包
举例:安装dubbo.jar Dubbox 的 jar 包并没有部署到 Maven 的中央仓库中,大家在 Maven 的中央仓库中可以查找到 Dubbo 的最终版本是 2.5.3 , 阿里巴巴解散了 ...
- 选择困难症的福音——团队Scrum冲刺阶段-Day 4
选择困难症的福音--团队Scrum冲刺阶段-Day 4 今日进展 编写提问部分 做了不同问题所对应的游戏选项,但关于游戏分类的界面还没有做完 增加功能 昨天在主界面增加"关于我们" ...
- 17. pt-online-schema-change
在平时MySQL的运维过程中,经常会遇到表结构的变更.在表比较小的时候,直接进行变更,时间较短,但是当表非常大的时候,这么做会导致应用卡死,服务不可用.目前InnoDB引擎是通过以下步骤来进行DDL的 ...
- 使用虚拟机VM12安装REHL7
转载https://blog.csdn.net/qq_19467623/article/details/52869108 转载http://www.07net01.com/2016/03/141198 ...
- Java:内部接口
1.什么是内部接口 内部接口也称为嵌套接口,即在一个接口内部定义另一个接口.举个例子,Entry接口定义在Map接口里面,如下代码: public interface Map { interface ...