一、原理讲解

1. 卷积神经网络的应用

  • 分类(分类预测)
  • 检索(检索出该物体的类别)
  • 检测(检测出图像中的物体,并标注)
  • 分割(将图像分割出来)
  • 人脸识别
  • 图像生成(生成不同状态的图像)
  • 自动驾驶
  • 等等。。。

2. 传统神经网络与卷积神经网络比较

传统神经网络采用的是全连接神经网络,权重矩阵的参数太多,导致速度减慢,也会产生过拟合。

卷积神经网络通过卷积核,大大降低了参数个数。实现局部关联,参数共享的效果。

3. 卷积神经网络基本结构

  • 卷积层
  • 激活层(ReLu)
  • 池化层
  • 全连接层

3.1 卷积层(Convolutional Layer)

卷积是对两个实变函数的一种数学操作,也就是求内积。

在图像处理中,图像是以二维矩阵的形式输入到神经网络的,因此我们需要二维卷积。

图3-1

图3-2

图3-3

图3-1、图3-2、图3-3很好地展示了卷积过程,名称注释如下:

input:输入层,即图像的矩阵向量

kernel:卷积核或称滤波器,可以定义卷积核的大小,图3-1中卷积核的大小为2*2

output:输出,即特征图feature map,通过卷积计算出来的结果。计算公式为input(图3-1中为4*3)•kernel(图3-1中为2*2),两个向量求内积。

stride:步长,即卷积核向右滑动的长度。图3-1中步长为1。

padding:填充,当卷积时,卷积核滑动到最右侧发现无法形成与自己单元一致的向量时,需要在四周用0填充,确保卷积核能完成计算过程。如图3-4所示。

depth/channel:深度,即当前卷积层中卷积核的个数。如图3-4为2层。

图3-4

卷积是从输入图像中提取特征的第一层,Conv层的目标是提取输入数据的特征。 卷积通过使用小方块输入数据学习图像特征来保持像素之间的关系。

输出的特征图(feature map)大小:

图3-5

未加padding时:

(N-F)/stride + 1

加padding时:

(N-F+padding*2)/stride + 1

例子:

input:32*32

filter:10, 5*5

stride:1

padding:2

输出:?  (32-5+2*2)/1+1=32 ,即 32*32*10

参数:?  (5*5+1)*10

代码实现:

 # 定义卷积核,10个卷积核,卷积核大小是5,用Relu激活
conv0 = tf.layers.conv2d(datas, 10, 5, activation=tf.nn.relu)

3.2 池化层(Pooling Layer)

特征:

保留了主要特征的同事减少参数和计算量,防止过拟合,提高模型泛化能力。

它一般处在卷积层和卷积层之间,全连接层和全连接层之间。

类型划分:

max pooling:最大化池化,如图3-6和图3-7所示

average pooling:平均池化,如图3-7所示

图3-6

图3-7

3.3 全连接层(Fully Connected Layer)

  • 两层之间所有神经元都有权重连接
  • 通常全连接才呢过在卷积神经网络尾部
  • 全连接层参数量通常最大

二、代码实战

 # 定义卷积层, 20个卷积核,卷积核大小为5, 用Relu激活
conv0 = tf.layers.conv2d(datas, 20, 5, activation=tf.nn.relu)
# 定义max-pooling层,pooling窗口为2*2,步长为2*2
pool0 = tf.layers.max_pooling2d(conv0, [2, 2], [2, 2]) # 定义卷积层,40个卷积核,卷积核大小为4, 用Relu激活
conv1 = tf.layers.conv2d(pool0, 40, 4, activation=tf.nn.relu)
# 定义max-pooling层,pooling窗口为2*2,步长为2*2
pool1 = rf.layers.max_pooling2d(conv1, [2, 2], [2, 2]) # 将3维特征装换为1维向量
flatten = tf.layers.flatten(pool1) # 全连接层,转换为长度为400的特征向量
fc = tf.layers.dense(flatten, 400, activation=tf.nn.relu) # 加上DropOut,防止过拟合
dropput_fc = tf.layers.dropout(fc, dropout_placeholdr) # 未激活的输出层
# num_classes:分类数
logits = tf.layers.dense(dropout_fc, num_classes) predicted_labels = tf.arg_max(ligits, 1)

CNN(卷积神经网络)原理讲解及简单代码的更多相关文章

  1. cnn(卷积神经网络)比较系统的讲解

    本文整理了网上几位大牛的博客,详细地讲解了CNN的基础结构与核心思想,欢迎交流. [1]Deep learning简介 [2]Deep Learning训练过程 [3]Deep Learning模型之 ...

  2. Keras(四)CNN 卷积神经网络 RNN 循环神经网络 原理及实例

    CNN 卷积神经网络 卷积 池化 https://www.cnblogs.com/peng8098/p/nlp_16.html 中有介绍 以数据集MNIST构建一个卷积神经网路 from keras. ...

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

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

  4. Deep Learning模型之:CNN卷积神经网络(一)深度解析CNN

    http://m.blog.csdn.net/blog/wu010555688/24487301 本文整理了网上几位大牛的博客,详细地讲解了CNN的基础结构与核心思想,欢迎交流. [1]Deep le ...

  5. [转]Theano下用CNN(卷积神经网络)做车牌中文字符OCR

    Theano下用CNN(卷积神经网络)做车牌中文字符OCR 原文地址:http://m.blog.csdn.net/article/details?id=50989742 之前时间一直在看 Micha ...

  6. Deep Learning论文笔记之(四)CNN卷积神经网络推导和实现(转)

    Deep Learning论文笔记之(四)CNN卷积神经网络推导和实现 zouxy09@qq.com http://blog.csdn.net/zouxy09          自己平时看了一些论文, ...

  7. TensorFlow——CNN卷积神经网络处理Mnist数据集

    CNN卷积神经网络处理Mnist数据集 CNN模型结构: 输入层:Mnist数据集(28*28) 第一层卷积:感受视野5*5,步长为1,卷积核:32个 第一层池化:池化视野2*2,步长为2 第二层卷积 ...

  8. 3层-CNN卷积神经网络预测MNIST数字

    3层-CNN卷积神经网络预测MNIST数字 本文创建一个简单的三层卷积网络来预测 MNIST 数字.这个深层网络由两个带有 ReLU 和 maxpool 的卷积层以及两个全连接层组成. MNIST 由 ...

  9. CNN(卷积神经网络)、RNN(循环神经网络)、DNN(深度神经网络)的内部网络结构有什么区别?

    https://www.zhihu.com/question/34681168 CNN(卷积神经网络).RNN(循环神经网络).DNN(深度神经网络)的内部网络结构有什么区别?修改 CNN(卷积神经网 ...

随机推荐

  1. 磁盘空间命令df/du/free

    1.df 显示文件系统大小 -h 以易读方式显示 -k KB -m MB -a 显示所有 2. du 显示文件大小 -h 只显示目录 -a 所有 -s 只显示总量 3.free 显示内存 -k -m ...

  2. python中字符串格式化的两种方法

    知识点汇总;1-字符串格式化输出方法一: % 1-print('名字是 %s,年龄是%s' % (name ,age)) 2- %s ---字符串-----相当于执行了str() 3- (name , ...

  3. 常用的webpack 配置

    const path = require('path'); let HtmlWebpackPlugin = require('html-webpack-plugin'); let VueLoaderP ...

  4. java课堂测试2(两种方式)

    实验源代码 这是不使用数组形式的源代码 /* 2017/10/10 王翌淞 课堂测试2 */import java.util.Scanner; public class Number { public ...

  5. Linux系统中的硬件问题如何排查?(2)

    Linux系统中的硬件问题如何排查?(2) 2013-03-27 10:32 核子可乐译 51CTO.com 字号:T | T 在Linux系统中,对于硬件故障问题的排查可能是计算机管理领域最棘手的工 ...

  6. 第十二章 学习 shell脚本之前的基础知识

    http://www.92csz.com/study/linux/12.htm [什么是shell] 简单点理解,就是系统跟计算机硬件交互时使用的中间介质,它只是系统的一个工具.实际上,在shell和 ...

  7. java——>> 和>>>

    试一下 public static void main(String[] args) { System.out.println(Integer.toBinaryString(-16)); System ...

  8. c++linux多线程基础知识

    http://blog.csdn.net/lovecodeless/article/details/24929273 http://blog.csdn.net/Jiangweihll/article/ ...

  9. vue-项目模块化中this 指向问题

    在VUE项目中,我们想把一些主要的代码抽到一个模块中 export default { /** * 获取本地的群列表数据 * @param {*} params */ getGroupList () ...

  10. shell练习--PAT题目1005:继续(3n+1)猜想(全绿失败喜加一)

    卡拉兹(Callatz)猜想已经在1001中给出了描述.在这个题目里,情况稍微有些复杂. 当我们验证卡拉兹猜想的时候,为了避免重复计算,可以记录下递推过程中遇到的每一个数.例如对 n=3 进行验证的时 ...