这个库里面主要是一些常用的模型用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/
转载文章受原作者版权保护。转载请注明原作者出处!