深度学习-卷积神经网络CNN学习笔记

一、基本概念

发展历程

1.感知机网络(解决线性可分问题,20世纪40年代)
2.BP神经网络(解决线性不可分问题,20世纪80年代)
3.深度神经网络(海量图片分类,2010年左右)

应用领域

1.计算机视觉
2.语音识别
3.自然语言处理
4.人机博弈

与人工智能、机器学习关系

在这里插入图片描述

深度学习VS传统机器学习

在这里插入图片描述

二、卷积神经网络CNN

卷积神经网络结构

卷积神经网络大致过程
covolutional layer(卷积)、ReLu layer(非线性映射)、pooling layer(池化)、
fully connected layer(全连接)、output(输出)的组合,例如下图所示的结构。

在这里插入图片描述
从左向右,一共分为七层:
卷积层、池化层、卷积层、池化层、全连接层、全连接层、输出层

32×32变成28×28,28=32-5+1(filter=5×5)
A的一个面变成卷积层的6个面,是因为有6个filter对其进行操作,每个filter权值不一样对应形成一个面
28×28变14×14,是因为池化2×2

卷积操作-得到卷积层的输入值

全连接与局部连接

在CNN中,先选择一个局部区域(filter),用这个局部区域去扫描整张图片。 局部区域所圈起来的所有节点会被连接到下一层的一个节点上。
在这里插入图片描述

在这里插入图片描述

卷积层-CNN权值共享

在这里插入图片描述

加入非线性映射ReLU

和前馈神经网络一样,经过线性组合和偏移后,会加入非线性增强模型的拟合能力。
经过线性组合和偏移后,会加入非线性增强模型的拟合能力。将卷积所得的Feature Map经过ReLU变换(elementwise)。
在这里插入图片描述

池化操作

即从卷积层输出的结果中,抽取“代表”。且抽取方法取决于池化结构
例如下图:将44转化为22,且抽取规则为取最大值
左上角的“6“是1,1,5,6中的最大值
在这里插入图片描述

全连接层

当抓取到足以用来识别图片的特征后,接下来的就是如何进行分类。
全连接层(也叫前馈层)就可以用来将最后的输出映射到线性可分的空间。
卷积网络的最后会将末端得到一个长长的向量,并送入全连接层配合输出层进行分类。

高维输入处理

filter为2×2×3
在这里插入图片描述

多个filter

卷积层的面数只由filter个数决定
在这里插入图片描述

三、 用Python代码实现

卷积操作函数的参数

conv2d(input, filter, strides, padding, use_cudnn_on_gpu=True, data_format=“NHWC”, dilations=[1, 1, 1, 1], name=None):
input即输入的图片,filter即卷积盒, strides即移动的步长, padding即填充(当卷积或池化不能取整时),
其中input, filter必须是四维
[batch, in_height, in_width, in_channels]样本个数,宽度,高度,通道数
[filter_height, filter_width, in_channels, out_channels]宽度,高度,通道数,个数

import tensorflow as tf
import cv2
import numpy as np

img = cv2.imread('0_3.png')    # 图片读取
img = cv2.resize(img, (64, 64))/255   # 图片尺寸压缩和归一化,即行列尺寸修改
img_new = np.float32(np.reshape(img, [1, 64, 64, 3]))   # 将图片shape改为4维
w1 = tf.random_normal([3, 3, 3, 32])  # filter,行,列,通道,个数

conv1 = tf.nn.conv2d(img_new, w1, strides=[1, 1, 1, 1], padding='SAME')  # 卷积操作,全零值填充
#conv1.shape
#stridesJ中间两个值是指步长,ksize中间两个值是指filter的大小22
pool1 = tf.nn.max_pool(conv1, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding='SAME')  # 进行池化操作
#pool1.shape
sess = tf.Session()#启动绘画
conv = sess.run(conv1)
#conv
pool = sess.run(pool1)
#pool
sess.close()#关闭
cv2.imwrite('conv.jpg', conv[0, :, :, 10]*500)   # 将卷积结果的某一个面可视化呈现,第零个样本(本身就一个)所有行的所有列的第10个面,*500值放大
cv2.imwrite('pool.jpg', pool[0, :, :, 10]*100)   # 将池化结果的某一个面可视化呈现

结果可视化

conv.jpg在这里插入图片描述
pool.jpg在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值