卷积 和 神经网络

  莫烦大佬的原文章https://mofanpy.com/tutorials/machine-learning/tensorflow/intro-CNN/

  我的理解就是千层饼,鸡蛋烧,特征叠叠高。

  “卷积” 和 “神经网络”. 卷积也就是说神经网络不再是对每个像素的输入信息做处理了,而是图片上每一小块像素区域进行处理, 这种做法加强了图片信息的连续性. 也加深了神经网络对图片的理解.

   具体来说, 卷积神经网络有一个扫描仪, 持续不断的在图片上滚动扫描图片里的信息,每一次收集的时候都只是收集一小块像素区域, 然后把收集来的信息进行整理, 这时候整理出来的信息有了一些实际上的呈现, 比如这时的神经网络能看到一些边缘的图片信息, 然后在以同样的步骤, 用类似的批量过滤器扫过产生的这些边缘信息, 神经网络从这些边缘信息里面总结出更高层的信息结构,比如说总结的边缘能够画出眼睛,鼻子等等. 再经过一次过滤, 脸部的信息也从这些眼睛鼻子的信息中被总结出来.

   最后我们再把这些信息套入几层普通的全连接神经层进行分类, 这样就能得到输入的图片能被分为哪一类的结果了.

  具体说说图片是如何被卷积的. 下面是一张猫的图片, 图片有长, 宽, 高 三个参数.我们以彩色照片为例子. 过滤器就是影像中不断移动的东西, 他不断在图片收集小批小批的像素块, 收集完所有信息后, 输出的值, 我们可以理解成是一个高度更高,长和宽更小的”图片”. 这个图片里就能包含一些边缘信息. 然后以同样的步骤再进行多次卷积, 将图片的长宽再压缩, 高度再增加, 就有了对输入图片更深的理解. 将压缩,增高的信息嵌套在普通的分类神经层上,我们就能对这种图片进行分类了.

池化(pooling)

  我的理解就是:卷积的时候就是千层饼不切,鸡蛋烧呢一层一层淋蛋液,到了池化层pooling的时候切出一块最好吃的

 

  研究发现, 在每一次卷积的时候, 神经层可能会无意地丢失一些信息. 这时, 池化 (pooling) 就可以很好地解决这一问题. 而且池化是一个筛选过滤的过程, 能将 layer 中有用的信息筛选出来, 给下一个层分析. 同时也减轻了神经网络的计算负担 (具体细节参考). 也就是说在卷集的时候, 我们不压缩长宽, 尽量地保留更多信息, 压缩的工作就交给池化了,这样的一项附加工作能够很有效的提高准确性. 有了这些技术,我们就可以搭建一个属于我们自己的卷积神经网络啦.

  从下到上的顺序, 首先是输入的图片(image), 经过一层卷积层 (convolution), 然后在用池化(pooling)方式处理卷积的信息, 这里使用的是 max pooling 的方式. 然后在经过一次同样的处理, 把得到的第二次处理的信息传入两层全连接的神经层 (fully connected),这也是一般的两层神经网络层,最后在接上一个分类器(classifier)进行分类预测.

CNN卷积神经网络实践

  卷积神经网络包含输入层、隐藏层和输出层,隐藏层又包含卷积层和pooling层,图像输入到卷积神经网络后通过卷积来不断的提取特征,每提取一个特征就会增加一个feature map,所以会看到视频教程中的立方体不断的增加厚度,那么为什么厚度增加了但是却越来越瘦了呢,哈哈这就是pooling层的作用喽,pooling层也就是下采样,通常采用的是最大值pooling和平均值pooling,因为参数太多喽,所以通过pooling来稀疏参数,使我们的网络不至于太复杂。

# coding: utf-8
import tensorflow as tf
import numpy as np
from utils import *
from tensorflow.examples.tutorials.mnist import input_data mnist = input_data.read_data_sets('MNIST_data', one_hot=True) # 以one-hot编码读取mnist数据集
num_steps = 1000 # 训练迭代步数 # 接着呢,我们定义Weight变量,输入shape,返回变量的参数。其中我们使用tf.truncted_normal产生随机变量来进行初始化:
def weight_variable(shape):
initial = tf.truncated_normal(shape,stddev=0.1)
return tf.Variable(initial)
# 同样的定义biase变量,输入shape ,返回变量的一些参数。其中我们使用tf.constant常量函数来进行初始化:
def bias_variable(shape):
initial = tf.constant(0.1,shape=shape)
return tf.Variable(initial) def conv2d(x, W):
# tf.nn.conv2d函数是tensoflow里面的二维的卷积函数,x是图片的所有参数,W是此卷积层的权重,
return tf.nn.conv2d(x, W, strides=[1, 1, 1, 1], padding='SAME')
# 然后定义步长strides=[1,1,1,1]值,strides[0]和strides[3]的两个1是默认值,
# 中间两个1代表padding时在x方向运动一步,y方向运动一步,
# padding采用的方式是SAME。 # 定义pooling函数,向下采样
# 接着定义池化pooling,为了得到更多的图片信息,padding时我们选的是一次一步,也就是strides[1]=strides[2]=1,
# 这样得到的图片尺寸没有变化,而我们希望压缩一下图片也就是参数能少一些从而减小系统的复杂度,因此我们采用pooling来
# 稀疏化参数,也就是卷积神经网络中所谓的下采样层。pooling 有两种,一种是最大值池化,一种是平均值池化,
# 本例采用的是最大值池化tf.max_pool()。
# 池化的核函数大小为2x2,ksize 为池化窗口大小,因此ksize=[1,2,2,1]。步长为2,因此strides=[1,2,2,1]:
def max_pool_2x2(x):
return tf.nn.max_pool(x,ksize=[1,2,2,1],strides=[1,2,2,1],padding='SAME') class mnistmodel(object):
def __init__(self):
self._build_model() def _build_model(self):
self.images = tf.placeholder(tf.float32, [None, 784]) # 设置图片占位符
self.labels = tf.placeholder(tf.float32, [None, 10]) # 设置标签占位符
with tf.variable_scope('feature_extractor'): # 特征提取部分(包含两个卷积层)
self.processimages = tf.reshape(self.images, [-1, 28, 28, 1]) # 将输入图片reshape成[28,28,1]形状
# 网络第一层
W_conv0 = weight_variable([5, 5, 1, 32]) # 该层有32个5*5卷积核
b_conv0 = bias_variable([32]) # 32个bias
h_conv0 = tf.nn.relu(conv2d(self.processimages, W_conv0) + b_conv0) # 卷积操作,使用relu激活函数
h_pool0 = max_pool_2x2(h_conv0) # max pooling操作
# 网络第二层,与第一层类似
W_conv1 = weight_variable([5, 5, 32, 48])
b_conv1 = bias_variable([48])
h_conv1 = tf.nn.relu(conv2d(h_pool0, W_conv1) + b_conv1)
h_pool1 = max_pool_2x2(h_conv1)
# 将第二层输出reshape为二维矩阵以便输入全连接层
self.feature = tf.reshape(h_pool1, [-1, 7 * 7 * 48])
with tf.variable_scope('label_predictor'): # 标签预测部分(两层全连接层)
# 从7*7*48映射到100
W_fc0 = weight_variable([7 * 7 * 48, 100])
b_fc0 = bias_variable([100])
h_fc0 = tf.nn.relu(tf.matmul(self.feature, W_fc0) + b_fc0)
# 从100映射到10,以便之后分类操作
W_fc1 = weight_variable([100, 10])
b_fc1 = bias_variable([10])
logits = tf.matmul(h_fc0, W_fc1) + b_fc1 self.pred = tf.nn.softmax(logits) # 使用Softmax将连续数值转化成相对概率
# 使用交叉熵做标签预测损失
self.pred_loss = tf.nn.softmax_cross_entropy_with_logits(logits=logits, labels=self.labels) graph = tf.get_default_graph()
with graph.as_default():
model = mnistmodel()
learning_rate = tf.placeholder(tf.float32, [])
pred_loss = tf.reduce_mean(model.pred_loss) # 随机梯度下降对loss进行优化
train_op = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(pred_loss)
# 计算标签预测准确率
correct_label_pred = tf.equal(tf.argmax(model.labels, 1), tf.argmax(model.pred, 1))
label_acc = tf.reduce_mean(tf.cast(correct_label_pred, tf.float32)) with tf.Session(graph=graph) as sess:
tf.global_variables_initializer().run()
saver = tf.train.Saver(max_to_keep=1) # 创建saver对象来保存训练的模型
max_acc = 0
is_train = True
# training loop
if is_train:
for i in range(num_steps):
lr = 0.0001
# 调用mnist自带的next_batch函数生成大小为100的batch
batch = mnist.train.next_batch(100) _, p_loss, l_acc = sess.run([train_op, pred_loss, label_acc],
feed_dict={model.images: batch[0], model.labels: batch[1], learning_rate: lr})
print('step:{} pred_loss:{} l_acc: {}'.format(i, p_loss, l_acc))
if i % 100 == 0:
test_acc = sess.run(label_acc,
feed_dict={model.images: mnist.test.images, model.labels: mnist.test.labels})
print('step: {} test_acc: {}'.format(i, test_acc))
# 计算当前模型在测试集上准确率,最终保存准确率最高的一次模型
if test_acc > max_acc:
max_acc = test_acc
saver.save(sess, './ckpt/mnist.ckpt', global_step=i + 1)
# 读取模型日志文件进行测试
else:
model_file = tf.train.latest_checkpoint('./ckpt/')
saver.restore(sess, model_file)
test_acc = sess.run(label_acc, feed_dict={model.images: mnist.test.images, model.labels: mnist.test.labels})
print('test_acc: {}'.format(test_acc))
 

莫烦tensorflow学习记录 (6)卷积神经网络 CNN (Convolutional Neural Network)的更多相关文章

  1. 卷积神经网络(Convolutional Neural Network,CNN)

    全连接神经网络(Fully connected neural network)处理图像最大的问题在于全连接层的参数太多.参数增多除了导致计算速度减慢,还很容易导致过拟合问题.所以需要一个更合理的神经网 ...

  2. 【转载】 卷积神经网络(Convolutional Neural Network,CNN)

    作者:wuliytTaotao 出处:https://www.cnblogs.com/wuliytTaotao/ 本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可,欢迎 ...

  3. 卷积神经网络CNN(Convolutional Neural Networks)没有原理只有实现

    零.说明: 本文的所有代码均可在 DML 找到,欢迎点星星. 注.CNN的这份代码非常慢,基本上没有实际使用的可能,所以我只是发出来,代表我还是实践过而已 一.引入: CNN这个模型实在是有些年份了, ...

  4. “卷积神经网络(Convolutional Neural Network,CNN)”之问

    目录 Q1:CNN 中的全连接层为什么可以看作是使用卷积核遍历整个输入区域的卷积操作? Q2:1×1 的卷积核(filter)怎么理解? Q3:什么是感受野(Receptive field)? Q4: ...

  5. 卷积神经网络(Convolutional Neural Networks)CNN

     申明:本文非笔者原创,原文转载自:http://www.36dsj.com/archives/24006 自今年七月份以来,一直在实验室负责卷积神经网络(Convolutional Neural ...

  6. 【深度学习系列】卷积神经网络CNN原理详解(一)——基本原理

    上篇文章我们给出了用paddlepaddle来做手写数字识别的示例,并对网络结构进行到了调整,提高了识别的精度.有的同学表示不是很理解原理,为什么传统的机器学习算法,简单的神经网络(如多层感知机)都可 ...

  7. 小白也能弄懂的卷积神经网络(Convolutional Neural Networks )

    本系列主要是讲解卷积神经网络 - Convolutional Neural Networks 的系列知识,本系列主要帮助大家入门,我相信这是所有入门深度学习的初学者都必须学习的知识,这里会用更加直接和 ...

  8. tensorflow学习笔记七----------卷积神经网络

    卷积神经网络比神经网络稍微复杂一些,因为其多了一个卷积层(convolutional layer)和池化层(pooling layer). 使用mnist数据集,n个数据,每个数据的像素为28*28* ...

  9. tensorflow学习之路-----卷积神经网络个人总结

    卷积神经网络大总结(个人理解) 神经网络 1.概念:从功能他们模仿真实数据 2.结构:输入层.隐藏层.输出层.其中隐藏层要有的参数:权重.偏置.激励函数.过拟合 3.功能:能通过模仿,从而学到事件 其 ...

  10. 深度学习:卷积神经网络(convolution neural network)

    (一)卷积神经网络 卷积神经网络最早是由Lecun在1998年提出的. 卷积神经网络通畅使用的三个基本概念为: 1.局部视觉域: 2.权值共享: 3.池化操作. 在卷积神经网络中,局部接受域表明输入图 ...

随机推荐

  1. 因果推断review

    什么是因果推断? 因果推断(Causal Inference):就是预估对某个对象/群体/人 等 做不做某种干预后产生的结果. 常说'关系不代表因果'. 比如,一项研究表面,吃早餐的女孩比不吃早餐的女 ...

  2. 【7】SpringBoot是什么?SpringBoot的优缺点有哪些?

    随着动态语言的流行(Ruby.Groovy.Scala.Node.js),Java 的开发显得格外的笨重,繁多的配置.低下的开发效率.复杂的部署流程以及第三方技术集成难度大. 在上述环境下,Sprin ...

  3. redis 简单整理——java 客户端jedis[十六]

    前言 简单介绍一下java客户端jedis. 正文 Java有很多优秀的Redis客户端(详见:http://redis.io/clients#java),这 里介绍使用较为广泛的客户端Jedis,本 ...

  4. 国内chatGPT中文版网站有哪些?国内人工智能百花齐放!该如何选择?

    人工智能技术在中国的快速发展和普及,使得国内的人工智能产业日益壮大.在这些领域中,自然语言处理技术和聊天机器人已经取得了显著的进展.ChatGPT作为一种基于深度学习的聊天机器人模型,在国内得到了广泛 ...

  5. 力扣537(java)-复数乘法(中等)

    题目: 复数 可以用字符串表示,遵循 "实部+虚部i" 的形式,并满足下述条件: 实部 是一个整数,取值范围是 [-100, 100]虚部 也是一个整数,取值范围是 [-100, ...

  6. 智能logo免费体验|如何让餐饮logo在点评网站上一眼出众?

    ​简介:一个新的餐饮店铺,还没有人知晓,Logo就是这个重要的"门面",所传递的信息让人快速识别,就能产生记忆点,愿意进一步了解,从而为店铺带来流量和收益.如何让你的餐饮店铺log ...

  7. 做ToB软件质量保障的这两年

    ​简介:自己算是阿里的老兵了,从实习开始一直投身在 toB 业务的质量保障领域内,不能说是资深的专家,但所经历的.感受的业务特点和体会还是具有一定的代表性,希望能通过这篇文章,总结一下过往,并能和已经 ...

  8. EventBridge 集成云服务实践

    ​简介:本篇文章主要向大家分享了通过 EventBridge 如何集成云产品事件源,如何集成云产品事件目标以及通过事件流如何集成消息产品. 作者:李凯(凯易) EvenBridge 集成概述 Even ...

  9. Apsara Stack 技术百科 | 浅谈阿里云混合云新一代运维平台演进与实践

    ​简介:随着企业业务规模扩大和复杂化及云计算.大数据等技术的不断发展,大量传统企业希望用上云来加速其数字化转型,以获得虚拟化.软件化.服务化.平台化的红利.在这个过程中,因为软件资产规模持续增大而导致 ...

  10. 使用ssh连接远程仓库的方法(github)

    使用ssh连接远程仓库的方法 但是当我登录虚拟机想提交csapp的代码时,我发现需要验证我的账号密码,感觉每次提交都要输入这个很麻烦.然后就在网上查询了下为何提交代码需要输入账号密码. 使用 HTTP ...