CNN-简单图片分类
原文链接:https://www.dazhuanlan.com/2019/08/17/5d577456ecc9a/
假期的时候跟着专知的一个深度学习课程学习了一些深度学习的内容,也是愈发觉得神经网络十分神奇,最近看了一份简单的图片分类的CNN网络,记录学习一下,从简单学起~
大部分神经网络的基础就不再写了,网上也有很多介绍,这里就照着代码,顺一遍基本的使用方法~
简略介绍
训练样本50张,分为3类:
- 0 => 飞机
- 1 => 汽车
- 2 => 鸟
图片都放在data文档夹中,按照label_id.jpg进行命名,例如2_111.jpg代表图片类别为2(鸟),id为111。
导入相应库
1
|
|
读取数据
1
|
# 数据文档夹
|
这一部分代码主要就是实现将文档夹中的训练样本读取出来,保存在numpy数组中。
定义placeholder(占位符)
1
|
# 定义Placeholder,存放输入和标签
|
palceholder
可以将placeholder理解为一种形参吧,然后不会被直接运行,只有在调用tf.run方法的时候才会被调用,这个时候需要向placeholder传递参数。
函数形式:
1
|
tf.placeholder(
|
dropout
dropout主要是为了解决过拟合的情况,过拟合就是将训练集中的一些不是通用特征的特征当作了通用特征,这样可能会在训练集上的损失函数很小,不过在测试的时候,就会导致损失函数很大。举个例子吧,就像用一个网络来判断这是不是一只猫,而训练集中的猫都是白色的,这样就可能会导致整个网络将白色当作判断猫的一个重要特征,而测试集中的猫可能什么颜色都有,这样就会导致损失函数很大。
- 而dropout的解决方法就是在训练的时候,以一定的概率让部分神经元停止工作,这样就可以减少特征检测器(隐层节点)间的相互作用,避免过拟合情况的发生。
- 测试时整合所有神经元
定义卷积神经网络(卷积层和pooling层)
1
|
# 定义卷积层, 20个卷积核, 卷积核大小为5,用Relu激活
|
sigmoid与relu
- 在BP算法中,反向传播的过程是一个链式求导的过程(误差通过梯度传播),不过使用sigmoid函数,其中可能某一项的导数存在极小值,这样就会导致整个偏导的导数值较小,导致误差无法向前传播,这样的话,前几层的参数无法得到更新。
- 不过relu函数就解决了这个问题啦
max-pooling
池化层有mean-pooling、max-pooling啥的。
pooling层主要是保留特征,减少下一层的参数量和计算量,同时也能防止过拟合。
例如:max-pooling层的大小为2x2,那么就会对一个2x2的像素快进行取样,得到这个小区域的最大值,并将这个值来代表这个区域块传递到下一层中。
通过这样的方式就可以来减少参数量和计算量,并且还保持某种不变性,包括translation(平移),rotation(旋转),scale(尺度)
定义全连接部分
1
|
# 将3维特征转换为1维向量
|
全连接层,加上dropout,然后最后定义输出层。
1
|
arg_max(a, axis=None, out=None)
|
返回沿轴axis最大值的索引值,也就是最可能的标签值。
定义损失函数和优化器
1
|
# 利用交叉熵定义损失
|
代码中的one_hot()函数的作用是将一个值化为一个概率分布的向量,一般用于分类问题。然后再用reduce_mean()得到平均值。
执行阶段
1
|
# 用于保存和载入模型
|
这一部分代码感觉没啥特别好写的,大部分都写在注释里了,而且一些写法应该也是比较固定的,,,,
总结
可以看一下运行结果
感觉效果还是挺好的,真的挺神奇的。在这个过程中也是学习到了很多知识,这个整理总结归纳的过程也是收获颇多,以后继续加油~
原文地址:https://www.cnblogs.com/petewell/p/11406462.html
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 这 9 种方法有效帮你提高国内访问 Github 的速度
- python实现sm2和sm4国密(国家商用密码)算法
- 面试常考算法之区间问题
- 爬虫 | JS逆向某验滑动加密分析
- LeetCode | 28.实现strStr()
- Redis | Redis 哈希相关命令
- 如何访问SAP Spartacus里的config数据
- 工具系列 | HTTP API 身份验证和授权
- Providers in SAP Spartacus
- 详解ELF可执行文件格式:读取头部信息和程序表头
- 我用 Python 写了个基金涨跌通知助手
- 模仿腾讯新闻做了款新闻阅读小程序
- 使用关键点进行小目标检测
- 彻底搞懂 etcd 系列文章(八):etcd 事务 API
- 使用docker搭建一套开发环境全家桶