卷积神经网络(CNN)对于自然语言处理、风格迁移、机器视觉、人机博弈有着广泛而成功的应用,并且在图像分类任务上CNN在15年前就已经超越了人类视觉。
相对于全连接神经网络,CNN主要突破了全连接神经网络对权重的需求,通过感受野的概念(只对图像的特定区域感知,而不是对每个像素做感知),通过卷积层分解图像特征,训练网络进行分类。
比如对全连接网络来说,MNIST手写识别,每一张图像的输入是28281的大小,如果隐藏层节点有500个,那么这一层全连接层的权重个数为28281*500+500(偏置)≈40w,而MNIST只是一个小尺寸单通道的图像,如果图片更大,通道更多,层数更多,所有的参数会指数级增加,导致计算速度过慢。
而CNN是一个多层的神经网络,每层由多个二维平面组成,其中每个平面由多个独立神经元组成。每一层都对图像的某一种特征进行提取,用来提取特征(过滤)的权重矩阵称之为卷积核,训练CNN网络的目的就是求得能够处理图像任务的卷积核。
CNN和FCN在结构上输入层、全连接层、softmax层都是一样的,FCN的损失函数、优化算法同样适用于CNN,两者的区别在于神经网络中相连的两层连接方式是不一样的,体现在网络结构上就是卷积层和降采样层。
卷积就是卷积核(权值矩阵)在2维输入数据上的滑动,对当前输入部分的元素进行矩阵乘法,然后将结果汇为单个输出像素值,重复这个过程直到遍历整张图像。
卷积操作后的图像称为特征图(feature map),卷积后的特征增强,噪音降低,不同的卷积核可以有不同的效果,比如有的是突出横向特征,有的是突出纵向特征,有的是突出RGB某通道的特征等等,不同的核有不同的效果。
降采样层是将高清晰度的图像转变为低清晰度的图像,这个过程可以采用池化的方式来做,但是池化并不是唯一的降采样方式。
下面的例子就是模拟对某个灰度图(无颜色通道,方便处理)提取某种特征的卷积效果案例展示

import numpy as np
from PIL import Image
import matplotlib.pyplot as plt
import matplotlib.cm as cm
#定义图像卷积函数,参数为灰度图和卷积核
def ImgConvolve(image_array, kernel):'''image_array: 原灰度图像矩阵kernel:卷积核返回值:原图像与算子进行卷积后的结果'''image_arr = image_array.copy()#获取灰度像的维度img_dim1,img_dim2 = image_arr.shape#获取卷积核的维度k_dim1,k_dim2 = kernel.shape#降采样后的宽度和高度AddW = int((k_dim1-1)/2)AddH = int((k_dim2-1)/2)#对图片大小区域做 padding 0 填充,作为图片背景temp = np.zeros([img_dim1+AddW*2,img_dim2+AddH*2])#将原图拷贝到临时图片的中央output = np.zeros_like(a = temp)#将扩充后的图和卷积核进行卷积for i in range(AddW,AddW+img_dim1):for j in range(AddH,AddH+img_dim2):output[i][j] = int(np.sum(temp[i-AddW:i+AddW+1,j-AddW:j+AddW+1]*kernel))return output[AddW:AddW+img_dim1,AddH:AddH+img_dim2]
#定义三个典型的卷积核
#提取数值方向特征
#sobel_x
kernel_1 = np.array([[-1,0,1],[-2,0,2],[-1,0,1]])
#提取水平方向特征
#sobel_y
kernel_2 = np.array([[-1,-2,-1],[0,0,0],[1,2,1]])
#二阶微分算子
#Laplace扩展算子
kernel_3 = np.array([[1,1,1],[1,-8,1],[1,1,1]])
#卷积操作
#打开图像并转化为灰度图像,此处请在程序目录下存放任意图片
image = Image.open("touxiang.jpg").convert('L')#将图像转化为数组
image_array = np.array(image)#卷积操作
sobel_x = ImgConvolve(image_array,kernel_1)
sobel_y = ImgConvolve(image_array,kernel_2)
laplace = ImgConvolve(image_array,kernel_3)#显示图像
plt.imshow(image_array,cmap = cm.gray)
plt.axis('off')
plt.show()plt.imshow(sobel_x,cmap = cm.gray)
plt.axis('off')
plt.show()plt.imshow(sobel_y,cmap = cm.gray)
plt.axis('off')
plt.show()plt.imshow(laplace,cmap =cm.gray)
plt.axis('off')
plt.show()

通过上面的代码演示发现,对图像进行卷积,实际上就是滤波,每个卷积核都是一个特殊的特征提取方式,就是一个筛子或滤波器,将图像中符合条件的部分筛选出来。在卷积滑动的过程中,图像的边缘被裁剪掉了。不可避免地会损失信息。为了使输出尺寸与输入保持一致,可以采用0填充或者使用额外的假像素(一般是0像素)填充边缘,从而产生与输入相同大小的输出。一个卷积核提取一种特征,为了使特征提取更充分可以添加多个卷积核提取不同的特征,也就是多通道卷积。然后将特征图在相同位置相加得到总的特征图,再通过偏置项,得到最终的特征图输出。
通过减小矩阵的长和宽可以达到降采样的目的。降采样的方式主要有池化,就是计算图像某一区域上的某个特征的平均值或最大值。均值池化对背景信息更敏感,最大值池化对纹理信息更敏感;步长大于1的卷积操作也是降采样的一种方式。降采样是减少数据处理量的同时保留图像信息。

CIFAR-10 CNN网络学习(一)相关推荐

  1. DeepLearning:CNN网络学习之LetNet-5解读(论文+分析+代码)

    LetNet-5 [写在前面] 权值共享 卷积原理 池化原理 [LetNet介绍] 论文原文 实现过程参数变化概览 详细过程 [代码实现] [参考链接] [写在前面] LetNet-5虽然简单,但是包 ...

  2. 【深度学习系列】用PaddlePaddle和Tensorflow实现经典CNN网络AlexNet

    上周我们用PaddlePaddle和Tensorflow实现了图像分类,分别用自己手写的一个简单的CNN网络simple_cnn和LeNet-5的CNN网络识别cifar-10数据集.在上周的实验表现 ...

  3. pytorchgpu测试_pytorch学习(十)—训练并测试CNN网络

    前言 学习pytorch已经一周了,pytorch官网的示例代码基本上都敲了一遍,关于tensor的使用,数据集,网络定义等.和之前学习caffe痛苦的经历相比,pytorch对常用的操作都进行了封装 ...

  4. 【深度学习】真正的即插即用!盘点11种CNN网络设计中精巧通用的“小”插件...

    作者丨皮特潘 编辑丨极市平台 导读 所谓"插件",就是要能锦上添花,又容易植入.落地,即真正的即插即用.本文盘点的"插件"能够提升CNN平移.旋转.scale等 ...

  5. MINIST深度学习识别:python全连接神经网络和pytorch LeNet CNN网络训练实现及比较(三)...

    版权声明:本文为博主原创文章,欢迎转载,并请注明出处.联系方式:460356155@qq.com 在前两篇文章MINIST深度学习识别:python全连接神经网络和pytorch LeNet CNN网 ...

  6. 从零开始的深度学习(一) 经典CNN网络 LeNet-5

    从零开始的深度学习(一) 经典CNN网络 LeNet-5 之前的四篇博客围绕着一个大作业项目来进行的入门,由于小白初涉,因此行文中有时侧重于某些并不重要的东西,同时也忽略了许多其实蛮重要的东西,再加上 ...

  7. 图解10大CNN网络架构,通俗易懂!

    点击 机器学习算法与Python学习 ,选择加星标 精彩内容不迷路 作者 | Raimi Karim,出品 | AI科技大本营(ID: rgznai100) 本文精心选取了 10 个 CNN 体系结构 ...

  8. 通俗易懂:图解10大CNN网络架构

    作者 | Raimi Karim 译者 | Major 编辑 | 赵雪 出品 | AI科技大本营(ID: rgznai100) 导语:近年来,许多卷积神经网络( CNN )跃入眼帘,而随着其越来越深的 ...

  9. 深度学习(十七)基于改进Coarse-to-fine CNN网络的人脸特征点定位

    基于改进Coarse-to-fine CNN网络的人脸特征点定位 原文地址:http://blog.csdn.net/hjimce/article/details/50099115 作者:hjimce ...

最新文章

  1. 省技术市场举办中小企业专利法律风险防范及专利战略制定讲座
  2. html5动态圆,HTML5 很有创意的圆形导航动画
  3. 数据结构---并查集
  4. 关于sqlserver中xml数据的操作
  5. mysql查询表的列名主键_Oracle中查看所有的表,用户表,列名,主键,外键
  6. php元类,什么是元类-python编程入门系列图文教程-PHP中文网教程
  7. 80%的Oracle JDK用户正在寻找免费的替代品!!!
  8. Aspen hysys换热器修改计算模式Find Fouling模式
  9. VMware vRealize Suite 8.8.0
  10. von-ui组件库文档
  11. Gitlab集成Sonarqube实现自动检测代码并发送报告给提交者
  12. net share c$=c: 发生系统错误
  13. uiautomation 模块
  14. 【Python代码】文件查重(02)-简易版
  15. 银行存款对账java代码_银行存款对账方法
  16. Android系统固件定制方式
  17. 第一章 C++初步知识笔记(上)
  18. 小程序推广要善于借助第三方app推广
  19. 前端h5与 android/ios 交互传参
  20. elasticsearch 1:入门

热门文章

  1. 入门 Activiti 工作流,通俗易懂
  2. Wizpert-激励性帮助
  3. 判断数据库或数据库对象是否存在
  4. Linux LVM在线扩容ext3文件系统
  5. 用 sar 工具检测系统性能瓶颈
  6. Spring的getBean的流程(源码级讲解 + 核心流程总结)
  7. 物联网卡收费标准有哪些
  8. pointer-events: none。 影子属性。 解决遮罩层下面图片或文字超链接无法选中执行功能
  9. JS计算两个经纬度坐标与正北方向夹角
  10. php 无符号float开关,float无符号