10 卷积神经网络及python实现

news2024/11/17 14:37:58

1 卷积神经网络简介

卷积神经网络(Convolutional Neural Network, CNN)由LeCun在上世纪90年代提出。
LeCun Y., Bottou L., Bengio Y., and Haffner P., Gradient-based learning applied to document recognition, Proceedings of the IEEE, pp. 1-7, 1998.
在这里插入图片描述
卷积核和特征图:
在这里插入图片描述
如果我们用6个卷积核,就能获得6个特征图(feature map)。你也可以把产生的6个特征图看成一个新的“图像”,其height, width, channel数目分别是28,28,6。
在这里插入图片描述

2 基本操作

2.1 卷积层

卷积层:特征提取
可以将图像卷积看成全连接网络的权值共享(weight sharing)
在这里插入图片描述
p 1 = w 1 ∗ x 1 + w 2 ∗ x 2 + w 3 ∗ x 4 + w 4 ∗ x 5 + b 1 p 2 = w 1 ∗ x 2 + w 2 ∗ x 3 + w 3 ∗ x 5 + w 4 ∗ x 6 + b 2 p 3 = w 1 ∗ x 4 + w 2 ∗ x 5 + w 3 ∗ x 7 + w 4 ∗ x 8 + b 3 p 4 = w 1 ∗ x 5 + w 2 ∗ x 6 + w 3 ∗ x 8 + w 4 ∗ x 9 + b 4 \begin{array}{l} p_1 = w_1 * x_1 + w_2 * x_2 + w_3 * x_4 + w_4 * x_5 + b_1 \\ p_2 = w_1 * x_2 + w_2 * x_3 + w_3 * x_5 + w_4 * x_6 + b_2 \\ p_3 = w_1 * x_4 + w_2 * x_5 + w_3 * x_7 + w_4 * x_8 + b_3 \\ p_4 = w_1 * x_5 + w_2 * x_6 + w_3 * x_8 + w_4 * x_9 + b_4 \end{array} p1=w1x1+w2x2+w3x4+w4x5+b1p2=w1x2+w2x3+w3x5+w4x6+b2p3=w1x4+w2x5+w3x7+w4x8+b3p4=w1x5+w2x6+w3x8+w4x9+b4
上一页中的卷积操作,等价于如下权值共享网络:
在这里插入图片描述
在这里插入图片描述
参数个数计算:
第1层(convolutional layer): (55+1)6=156
第2层(subsampling layer): 0
第3层(convolutional layer): (5
5
6+1)16=2416
第4层(subsampling layer): 0
第5层(fully connected layer): (5
5*16+1)*120=48120
第6层(fully connected layer): (120+1)*84=10164
第7层(fully connected layer): (84+1)*10=850

参数总数:61,706

2.2 ReLU 激活层

加入非线性因素,将卷积层输出结果做非线性映射。
ReLU 函数:

  • 对于输入负值,输出全为0;
  • 正值原样输出。
    在这里插入图片描述

2.3 池化层

提取重要的特征信息。
将输入图像进行缩小,减少像素信息,保留重要信息。
取最大值、平均值等。
在这里插入图片描述

2.4 单层卷积神经网络

卷积、激活函数、池化组合在一起。
在这里插入图片描述

2.5 全连接层

全连接层在整个卷积神经网络中起到“分类器”的作用,即通过卷积、池化等深度网络后,再经过全连接层对结果进行识别分类。
在这里插入图片描述

2.6 卷积神经网络流程

在这里插入图片描述

3 代码分析

1.引入头文件,加载数据
将数据读入数据集 独热编码
2.封装函数,方便网络搭建多处调用
(1)构建权重 w w w,产生随机变量
(2)构建偏置 b b b
(3)卷积层准备:卷积函数实现
(4)卷积层 激活函数 x x x与0作比较
(5)池化层:小一倍数据 特征图
3.特征标签的占位符
4.开始网络搭建 CNN构建
1)卷积层 ,创建patch=5*5卷积核
构建 w , b w, b w,b
([卷积核大小5 5,输入数据的维度1(灰度处理),输出的高度32])
(2)第一层卷积层,调用函数
(3)激活relu
(4)池化
2)第二层卷积
和第一层差不多,注意几个点
构建w\b 上一层的输出是这一层的输入,这一层的输出2的次方
第一层卷积层(上一层池化的结果,这一层的w)
3)全连层
据拍平、提纯、分类
(1)第一层全连层:前馈神经网络 输入:第二次池化结果 7764 假设神经元1024个
(2)第二层全连层:分类器
上层输出1024是这层输入,总的分类数为这层输出
5.构建损失函数
6.优化器

"""
卷积神经网络:手写数字模型
"""
import tensorflow as tf
# 加载数据
from tensorflow.examples.tutorials.mnist import input_data
# 将数据读入数据集 独热编码
input_data.read_data_sets('MNIST_data/',one_hot=True)

input_size=28*28
# 分类
num_class=10

# 创建函数:构建权重w,产生随机变量
def weight_variable(shape):
    """
    构建权重w,产生随机变量
    :param shape:
    :return:
    """
    w=tf.random_normal(shape=shape,stddev=0.01)
    return tf.Variable(w)


def bias_variable(shape):
    """
    构建偏置b
    :param shape:
    :return:
    """
    b=tf.constant(0.01,shape=shape)
    return tf.Variable(b)

def con2d(x,w):
    """
    卷积层准备:卷积函数实现
    :param x: 图像矩阵信息
    :param w: 卷积核的值
    :return: conv2d
    """
    # strides:卷积步长[上、右、下、左]
    return tf.nn.conv2d(x,w,strides=[1,1,1,1],padding='SAME')


def relu_con(x):
    """
    卷积层 激活x与0作比较
    :param x:
    :return:
    """
    return tf.nn.relu(x)

def max_pool_con2x2(x):
    """
    池化层:小一倍数据 特征图
    :param x: 图片的矩阵信息
    :return:
    value,
     ksize,
     strides,【上、右、下、左】右、下两个单位
     padding,
     data_format="NHWC",
     name=None,
     input=None
    """
    return tf.nn.max_pool(x,ksize=[1,2,2,1],strides=[1,2,2,1],padding='SAME')

# 网络搭建
# 1.特征标签的占位符
# # 1.占位符---输入层 x:数据输入到图中进行计算  y:识别的数字,有几个类别输入几个数字
xs= tf.placeholder(tf.float32,shape=[None,input_size]) #64列不知道几行
ys = tf.placeholder(tf.float32,shape=[None,num_class])#10类不知道多少个

# 将xs灰度处理:拍平变成一维[-1任意一张图片,28,28矩阵大小,1深度]
# 将该数据放到卷积层操作
x_image=tf.reshape(xs,[-1,28,28,1])
# CNN构建
# 第一层:卷积层 创建patch=5*5卷积核
# ([卷积核大小5 5,输入数据的维度1(灰度处理),输出的高度32])
# 构建w\b
w_conv1=weight_variable([5,5,1,32])
b_conv1=bias_variable([32])
# 第一层卷积层
conv1 = con2d(x_image,w_conv1)
# 激活relu
h_conv1=relu_con(conv1+b_conv1)
# 池化
h_pool1=max_pool_con2x2(h_conv1)

# 第二层=====

# 第二层:卷积层 创建patch=5*5卷积核
# ([卷积核大小5 5,输入数据的维度1(灰度处理),输出的高度32])
# 构建w\b 上一层的输出是这一层的输入,这一层的输出2的次方
w_conv2=weight_variable([5,5,32,64])# 14*14*32
b_conv2=bias_variable([64])
# 第一层卷积层(上一层池化的结果,这一层的w)
conv2 = con2d(h_pool1,w_conv2)
# 激活relu
h_conv2=relu_con(conv2+b_conv2)
# 池化
h_pool2=max_pool_con2x2(h_conv2)

# 全连层 数据拍平、提纯、分类
# 不再做卷积了
# 全连接第一层:前馈神经网络 输入:第二次池化结果 7*7*64 假设神经元1024个
w_fc1=weight_variable([7*7*64,1024])
b_fc1=bias_variable([1024])
# 输出矩阵 几行不管 列:7*7*64
h_pool2_flat=tf.reshape(h_pool2,[-1,7*7*64])
# 前馈神经网络wx+b
h_fc1=tf.matmul(h_pool2_flat,w_fc1)+b_fc1
# 激活
h_flc1=relu_con(h_fc1)

# 第二层全连层:分类
w_fc2=weight_variable([1024,num_class])
b_fc2=bias_variable([num_class])
# 计算并激活
# 前馈神经网络wx+b
h_fc2=tf.matmul(h_flc1,w_fc2)+b_fc2
# 激活---分类 返回每种情况的概率
predict=h_flc2=tf.nn.softmax(h_fc2)

# 构建损失函数
# 优化器

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/398809.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

STM32定时器Timer(PWM呼吸灯)

目录 定时器介绍 定时器工作原理: 定时器分类: STM32F103C8T6定时器资源: ​编辑 通用定时器介绍: 定时器计数模式: 定时器时钟源: ​编辑 定时器溢出时间计算公式: 定时器中断实验…

「IT女神勋章」挑战赛#

缓存 本地缓存 本地缓存为了保证线程安全问题,一般使用ConcurrentMap的方式保存在内存之中 分布式缓存。 常见的分布式缓存则有Redis,MongoDB等。 一致性:本地缓存由于数据存储于内存之中,每个实例都有自己的副本&#xff0c…

完全解读低通滤波,并且用其C语言实现

1、什么是低通滤波 低通滤波是一种信号处理技术,它可以用于去除高频信号成分,只保留低频信号成分。低通滤波器的本质是一个线性时不变系统,它可以通过差分方程或者频域响应的形式来描述。 在差分方程的形式下,低通滤波器可以表示…

MySQL数据库引擎(MyIsAm和InnoDB)

一、数据库引擎 存储引擎就是存储数据、建立索引、更新/查询数据等技术的实现方式。存储引擎是基于表的,而不是基于库的,所以存储引擎也可被称为表类型。MySQL5.5版本之后默认InnoDB,之前是MyIsAm。 PS: 设置引擎语句&#xff1…

计算机网络:RIP协议以及距离向量算法

RIP协议 RIP是一种分布式的基于适量向量的路由选择协议,最大优点是简单。要求网络中的每一个路由器都要维护从它自己到其他每一个目的网络的唯一最佳(最短)距离记录,最多包含15个路由器,距离为16就表示网络不可达&…

每天一道大厂SQL题【Day15】微众银行真题实战(五)

每天一道大厂SQL题【Day15】微众银行真题实战(五) 大家好,我是Maynor。相信大家和我一样,都有一个大厂梦,作为一名资深大数据选手,深知SQL重要性,接下来我准备用100天时间,基于大数据岗面试中的经典SQL题&…

DBT 收购 Transform,指标平台已成现代数据栈关键拼图

今年 2 月初,现代数据技术栈独角兽 DBT 宣布完成对 Transform 的并购。在现代数据栈的体系中,DBT 和 Transform 都扮演着重要角色,DBT 侧重于整个分析链路上的数据转换处理,而 Transform 则聚焦在以指标为中心搭建业务分析应用。 …

【java】Java 封装

文章目录Java 封装封装的优点实现Java封装的步骤实例Java 封装 在面向对象程式设计方法中,封装(英语:Encapsulation)是指一种将抽象性函式接口的实现细节部分包装、隐藏起来的方法。 封装可以被认为是一个保护屏障,防…

14个Python处理Excel的常用操作分享

自从学了Python后就逼迫用Python来处理Excel,所有操作用Python实现。目的是巩固Python,与增强数据处理能力。本文为大家整理了14个Python处理Excel的常用操作,非常好用,希望对大家有所帮助目录自从学了Python后就逼迫用Python来处…

[AI助力] 2023.3.9 考研英语学习 2013 英语二翻译

[AI助力] 2023.3.9 考研英语学习 2013 英语二翻译 文章目录[AI助力] 2023.3.9 考研英语学习 2013 英语二翻译2013 英语二 翻译真题总结Powered with AI用perfect prompt 生成 prompt然后让它们评价,翻译,并改进New Bing 的回答让它改进~ (太惊…

06-CSS

学习目标:能够使用精灵图能够使用字体图标能够写出 CSS 三角能够写出常见的 CSS 用户界面样式能够说出常见的布局技巧1. 精灵图(重点)1.1 为什么需要精灵图一个网页中往往会应用很多小的背景图像作为修饰,当网页中的图像过多时&am…

Cloudflare自动检测恶意IP拉黑到防火墙和自动切换5秒盾防CC攻击

资源宝分享:www.httple.net Cloudflare很多朋友都在使用,如果你的网站服务器架设在国外,那Cloudflare是一个非常好的加速工具,一可以为你的网站进行加速,二可以给你的网站提供防护 网站遭遇非常强大的CC和DDoS攻击时&…

安装sqoop

解压 [rootguo147 install]# tar -zxvf sqoop-1.4.7.tar.gz -C ../soft/ 修改名称 [rootguo147 soft]# mv sqoop-1.4.7/ sqoop147 添加jar包 把sqoop-1.4.7.bin__hadoop-2.6.0/lib 下的avro-1.8.1.jar复制到/opt/soft/sqoop147/lib [rootguo147 lib]# pwd /opt/soft/sqoo…

基础05-TCP三次握手和四次挥手

TCP 连接 三次握手 四次挥手 题目 请描述 TCP 连接的 三次握手 和 四次挥手 建立连接 客户端和服务端通过 HTTP 协议发送请求,并获取内容。 在发送请求之前,需要先建立连接,确定目标机器处于可接受请求的状态。 就例如,你要请…

如何做SpringBoot单元测试?

前言单元测试(unit testing),是指对项目中的最⼩可测试单元进⾏检查和验证的过程就叫单元测试,对于Java来说或者是在SpringBoot项目中,最小的可测试单元就是一个方法。做单元测试就是为了证明某段代码的执⾏结果是否符…

如何快速开发一套分布式IM系统

架构说明: 1)CIM 中的各个组件均采用 SpringBoot 构建;2)采用 Netty Google Protocol Buffer 构建底层通信;3)Redis 存放各个客户端的路由信息、账号信息、在线状态等;4)Zookeeper …

1110道Java面试题及答案(最新Java初级面试题大汇总)

开篇小叙 现在 Java 面试可以说是老生常谈的一个问题了,确实也是这么回事。面试题、面试宝典、面试手册......各种 Java 面试题一搜一大把,根本看不完,也看不过来,而且每份面试资料也都觉得 Nice,然后就开启了收藏之路…

nginx常用命令与简单转发配置

一、Nginx常用基本命令 1、启动Nginx服务器命令: 去到sbin路径:cd /usr/local/nginx/sbin 启动Nginx服务器: ./nginx2、查看Nginx 版本号命令: ./nginx -v 或 ./nginx -V3、查看Nginx进程命令: ps aux|grep nginx4、检查Nginx…

我又和redis超时杠上了

背景 经过上次redis超时排查,并联系云服务商解决之后,redis超时的现象好了一阵子,但是最近又有超时现象报出,但与上次不同的是,这次超时的现象发生在业务高峰期,在简单看过服务器的各项指标以后&#xff0…

虚拟化系列教程:创建 KVM 虚机的几种方式

虚拟化系列教程:创建虚拟机的几种方式[TOC](虚拟化系列教程:创建虚拟机的几种方式)创建 KVM 虚机的几种方式使用 virt-install 命令创建虚拟机参数说明一般选项安装方法存储配置网络配置其它常用的选项图形配置设备选项虚拟化平台其它创建虚拟机的操作演…