人工智能(AI)库TensorFlow 踩坑日记之二

这个库里面主要是一些常用的模型用tensorflow实现之后的代码。其中我用的是

models/tree/master/tutorials/image/cifar10 这个示例,上一篇也大致讲过了。

关于上次遇到问题是:

虽然训练了很多次,但是每次实际去用时都是相同的结果。这个问题主要原因是

在核心代码文件cifar10.py里

被我改成 batch_size =1

一开始我误以为这个batch要跟训练文件的.bin 文件里面的图片数量对应,其实不然。这个batch_size 是为了用

cifar10_input.py

创建一个图片跟标签的队列,每个队列128个元素,便于分布式处理。

由于改成1之后可能是影响是训练效果。导致整体的loss很高,所以识别率很差。有待进一步验证。

2018-03-11 修正

batch_size 作用就是一次性训练这么多次之后才开始做梯度下降,这样loss 的波动不会太大。

2018-06-19 补充

看完这篇文章之后终于对batch_size 有了一个更深刻的理解。就是越小的batch会导致局部的梯度波动大,难以收敛。

另外一个原因很可能是最致命的

上一篇讲到label的对应方式是

label 也是用string_input_producer 做了另外一条字符串队列

这其实是错误的,因为两条队列要完美保持一致,而且还不能加shuffle 参数 这个参数可以随机获取图片文件,以便训练模型效果更具备泛化能力。

shuffle=true 还是要加的。

label的获取方式就得另外想办法。

把 cifar10_input.py 方法 read_cifar10 改造如下:

其中 splitilenames ,diff 方法是我新增的,主要是为了把文件所在目录的路劲切出来

比如”H:\imagenet\fortest\n01440764″ 切出来 “n01330764″。 这个方法是支持批量处理的。

之所以写的这么麻烦。是因为输入量是tensor,所以所有操作都必须按照tensorflow的api写。

diff方法(代码在下面) 是为了判定key 的分类名在所有分类里面的文件排序位置(数字0-1000以内)。用这个位置作为label。

这里 读者估计有一个疑问

“为啥不直接用分类名’n01330764’作为label标签去训练呢?”

这里也是迫于无奈,因为原始代码cifar10的后续功能有2个限制,1,label必须是int型,2label最大值不能大于分类总数。所以不能简单把”n”删除然后转成数字 1330764 。

否则会出各种错。修正这2个问题明显比我新增一个diff方法改动更大。

虽然不太优雅,各位看官轻拍。

2018-06-19 修正

后来这里取label的方法还是换成文件夹按字母排序后的位置作为label了。这样保险很多,而且性能也好一些。

好了,到止为止,train(训练过程)的代码就改完了,可以开始训练了。

cifar10_eval.py 这边需要改个地方。

通过参数传入 单图片的地址,用来放到生产环境执行识别程序。

先跑一下8.jpg 测试一下

得出来结果是0 之所以有这么多,是因为

cifar10_eval 原来的代码用了一部分跟训练代码一致的过程,其中训练代码中batchsize=128,导致虽然输入只有1张图,输出的结果还是有128个。有点多余,不过取其中一个作为结果就可以了。(这里可以在把batchsize改为1,只在运行时用1)

然后我用C# MVC写了一个页面。用来上传图片,然后输出中文结果。

主要核心代码是(C#):

主要是把图片改为 32*32 然后用Process 拉起python 去执行 cifar10_runsingle.py (这个是cifar10_eval.py 改造后的)。

然后用正则把 结果的数字切出来。

剩下就是把位置比如 0替换成”n01330764″

测试一下

Original: https://www.cnblogs.com/7rhythm/p/7270207.html
Author: 鬼柒
Title: 人工智能(AI)库TensorFlow 踩坑日记之二

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/644295/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Dell raid 硬盘格式重装系统

    这种情况大概率都是出现在dell笔记本上,因为dell 原厂默认使用的硬盘格式是raid on 硬盘模式,并非我们常用的AHCI硬盘模式。raid on 硬盘模式下,绝大部分PE也…

    技术杂谈 2023年6月21日
    0142
  • 编程语言史话,为什么编程中 1=2?

    考虑以下代码: a = 1 a = a + 1 print(a) 你写代码时候是不是也疑惑过,为什么代码中会有a = a + 1,这个怎么解释?这就不是在说1 = 2么? 这是一个…

    技术杂谈 2023年5月31日
    0101
  • ThreeJS中创建文字的几种方法

    1. DOM + CSS 传统html5的文字实现,用于添加描述性叠加文字的方法。一般使用绝对定位,并且保证z-index够大,用于显示在3D场景之上。 优点:与CSS3D效果一致…

    技术杂谈 2023年7月24日
    067
  • Plugin caching_sha2_password could not be loaded: The specifiedmodule could not be found.

    MySQL新版默认使用caching_sha2_password作为身份验证插件,而旧版是使用mysql_native_password 当连接MySQL时报错”plu…

    技术杂谈 2023年5月31日
    087
  • 数据库多表查询 联合查询 增删改查

    插入 方式一 语法: insert into 表名 (字段名,…) values (值,…); 特点: 1、要求值的类型和字段的类型要一致或兼容 2、字段的个数和顺序不一定…

    技术杂谈 2023年6月21日
    086
  • Linux中的RCU机制

    什么是RCU? RCU(Read-Copy Update),顾名思义就是读-拷贝-修改,它是基于其原理命名的。对于被RCU保护的共享数据结构,读者不需要获得任何锁就可以访问它,但写…

    技术杂谈 2023年7月24日
    081
  • 1956和1985高程转换

    Original: https://www.cnblogs.com/gisoracle/p/16394986.htmlAuthor: gisoracleTitle: 1956和19…

    技术杂谈 2023年5月30日
    086
  • 华为測试 公共子串计算

    题目标题: 计算两个字符串的最大公共字串的长度,字符不区分大写和小写 输入两个字符串 输出一个整数 案例输入:asdfas werasdfaswer 案例输出:6 #include…

    技术杂谈 2023年5月31日
    099
  • JAVA基本类型和包装类型

    JAVA基本类型和包装类型 前言 Java语言中的数据类型分为基本数据类型和引用类型,而我们进行Java开发的时候都听说过基本数据类型和包装类型,今天我们就来详细聊一聊Java中的…

    技术杂谈 2023年6月21日
    094
  • PPPOE

    PPPoE(英语:Point-to-Point Protocol Over Ethernet),以太网上的点对点协议,是将点对点协议(PPP)封装在以太网(Ethernet)框架中…

    技术杂谈 2023年5月31日
    092
  • 性能测试工具之Gatling

    估计大部分开发者更多地关注功能测试,并且会提供一些单元测试和集成测试的用例。然而,有时候性能漏洞导致的影响比未发现的业务漏洞更严重,因为性能漏洞影响的是整个系统,而不仅仅是一个业务…

    技术杂谈 2023年5月31日
    0105
  • 日常白痴_Date的比较及增减操作

    一直以来,获取日期都是用new Date(),再不然,顶多用个SimpleDateFormat规范一下格式忽然遇到需求,需要对日期增加和比较大小的时候,就又懵住了,唉,每天都为自己…

    技术杂谈 2023年7月25日
    075
  • 面试手撕并发算法题

    固定打印顺序 使用 wait-notify 实现以下功能:先打印 b,再打印 a 线程t1和t2同时运行,t1中打印 a,t2中打印 b,但 t1 打印得有个前提,就是 t1要在t…

    技术杂谈 2023年6月21日
    076
  • 2.数据及其预处理

    数据样本矩阵 一般数据集的构造形式: 一行一样本,一列一特征,以下为一个示例 姓名 年龄 性别 工作经验 月薪 A 22 男 2 5000 B 23 女 3 6000 C 25 男…

    技术杂谈 2023年7月10日
    064
  • Netty源码分析之ChannelPipeline(五)—异常事件的传播

    ChannelHandler中异常的获取与处理是通过继承重写exceptionCaught方法来实现的,本篇文章我们对ChannelPipeline中exceptionCaught…

    技术杂谈 2023年7月25日
    073
  • One—python的六种数据类型及数据转换

    python的六种数据类型 python中数据类型分为不可变数据类型和可变数据类型 可变数据类型 可变数据类型包括:List(列表)、Dictionary(字典)、Set(集合) …

    技术杂谈 2023年6月21日
    0111
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球