出现问题:
这个数据集和手写数字识别的数据集不一样,它没有单独的label分类对应的文件夹,但是它每张图片的 命名非常规范都是cat.X.img或者dog.X.img,所以要先把每张图片对应的标签读取出来。这时候我参考了别人的博客使用os.listdir("D:/pycharm/maogoushibie/maogou/train.zip")
读取图片的名字
这里出现了两个错误,
(1)按照文件夹复制过来的路径显示路径错误
改正后出现第二个错误
(2)文件路径无效
改正方案:
(1)把文件路径的‘\’改为‘/’
(2)把原来的语句改为
p = os.path.dirname(os.path.realpath(train)) #获取文件的真实路径之后获取它的目录名
错误原因是 os.path.dirname在读取时只需要度文件的 path信息,如果直接输入文件的地址名是找不到文件的
(1):tensorflow学习中遇到的问题和方法
作为一名刚刚学习python和使用tensorflow的新手,尽管之前已经完成过一次手写数字识别的作业,但还是犯了很多错误。印象比较深刻的是
1读取图片数据和图片的命名过程中由于对于图片数据和数组以及字典的格式搞不清楚
2在想尝试继续使用手写数字识别的程序算法模型时,后面又用了下面这样的语句
结果报错说不能优化。后面才查到使用keras的时候,需要规范使用,不能混搭。
3使用电脑跑数据的时候,非常慢,大概五千个图片跑30个周期花了我四五个小时,非常浪费时间,而且电脑很卡也不能做其他的操作。
原因是我没有重视之前pycharm给我的提示:找不到cpu对应的安装库文件,并询问我是否安装好了GPU版本,如果装好了就忽视这个警告。
其实有这个提示的原因是我没有把对应GPU版本的cuda和cudnn装好的原因。
所以又花费了很久装软件,和改错;步骤被我总结在下面的博客中
https://blog.csdn.net/ZhangLH66/article/details/106655005
(2)学习CNN卷积网络
本来准备尝试学习继续使用letnet5的网络结构,对读取的图像进行分类,就像手写数字识别一样。可是发现报了不能优化的一些参数错误,所以就在原来的结构基础上稍稍进行改变参数仍然使用CNN网络进行分类。
(3)将训练好的模型进行保存,并且使用不同的猫狗图片进行测试
三:解决方案
(一)开发环境:pycharm+python3.6+tensorflow-gpu==2.0.0+cuda(10.0)+cudnn(7.5)
使用cpu依旧能跑,但是需要耗费大量的时间
(二)整个项目需要导入的代码:
(三)函数和网络结构设计:学习率设置为0.0001,一次训练数据设置为200(视电脑性能决定),epoch初始设置为20次,随后为了提高准确度可以对以上的参数进行更改。
网络结构参照lenet-5的网络结构进行了更改,由于上次实验验证了分析了下其他条件不变当C1、C2使用55的卷积核时,准确率要比C1、C2使用33的卷积核时高一些。所以这次尝试了使用33的卷积核并使用步长为3的情况下,和55的卷积核在步长为1的情况下,哪个的训练效果会好一点。
四:实验分析和总结
(1)数据集介绍:猫狗的数据集可以在kaddle官网进行下载,其大小我查看了一下,训练集是12500,测试集也是。用本地电脑跑的话,实在是太慢了。所以我手动分类了一下,把数据集分为测试和训练两个,然后分别在其中建猫和狗的文件夹并添加图片。在这里训练集是各有猫狗两千张,测试集是各有猫狗500张
打开任意图片都可以看到它们的大小和形状几乎都不一样,所以后续还需要对图片数据进行归一化处理。
由于在查看资料的时候发现,很多人在数据不足的情况下都会对自己的数据集进行生成调整,以扩大样本数量。这里我也借鉴了这种思想,但是数据集量已经够了,所以仅做学习和避免过拟合的现象用。进行调整的参数参考的资料来自于图像预处理 keras 中文文档链接是 https://keras.io/zh/preprocessing/image/,里面有详细的函数调用方法和参数的含义
(2)实验结果分析:
按照Lenet-5的网络结构进行改编,以及参考了一些博客的编程思路,以下是本代码实现的一些效果
使用cpu的运行速度和使用GPU的运行速度对比:
CPU
GPU
使用3*3卷积核,步长为3的情况下跑出来的数据最终的准确度在0.755,loss在0.356左右
网络结构参数:
训练结果显示
使用5*5卷积核,步长为1的情况下跑出来的数据最终的准确度在0.846,loss在0.576左右
可以看出55卷积核1步长的训练准确度比33卷积核3步长的要准确一些
接下来使用5*5卷积核1步长的训练模型对未参与训练和测试的图片进行预测。
加载猫的图片,它的编号是11110
预测结果:
继续加载猫的图片,它的编号是cat.11111.jpg
预测的结果是
同理加载编号dog.11111.jpg
但这时候就发生了错误,它还是预测为猫
换一张使用dog.1052.jpg
这时候识别正确
以上实验结果说明本实验基本完成课程设计要求,在两个模型结构上都能达到75%以上的准确度,但也有错误识别的现象。
错误率分析:其的照片来源极其生活化,甚至有些图片中不仅猫狗的大小很小还有人的样子;一定成程度上会影响到最后识别的准确度
经过反复的测试,最后可以得出:尽量使用猫和狗的特征比较明显的照片以及最好一张照片中只有猫或者狗,这样的话,会使识别的准确度高一些
需要对训练次数损失函数等继续进行调整。
本文的程序可见我的下载资源链接
https://download.csdn.net/download/ZhangLH66/12510090