Author:yudake
date:2018/2/27
kaggle 计算机视觉经典赛题:dogs vs. cats
github 地址:https://github.com/yudake/dogs-vs-cats
看 KevinRush 的视频学的,不过现在他已经把相关视频删除了。而且并不完全一样,有自己的修改。
题目
设计一种算法,根据图片区分图片中是猫还是狗。
数据
kaggle 给的训练集共有 25000 条数据,其中 12500 张狗的照片,12500 张猫的照片。
并没有给出猫和狗的标签列表,而是在图片的名称上标记着 dog 和 cat。
所以,我们需要对图片进行预处理,获得图片对应的标签。
数据处理
我们依次读取训练集中所有图片的名字。
如果图片名字中有 dog,把文件地址保存在 dogs 队列中,并且让 dogs 的标签列表添加一个“1”。
如果图片名字中有 cat,把文件地址保存在 cats 队列中,并且让 cats 的标签列表添加一个“0”。
也就是说,我们利用 1 作为 dog 的标记,0 作为 cat 的标记。
为了防止训练过程中训练数据不平衡,我们将队列合并并且 shuffle。
然后利用 pickle 保存下来。
模型
本模型是 tensorflow 官网 cifar-10 案例中给出的一个模型,模型并不深,所以分类效果相对来说比较弱。我在模型中添加了两个 dropout 层。
其中 conv1
的卷积核大小为 [3,3,3,16]
,conv2
的卷积核大小为 [3,3,16,16]
。fc1
输出大小为 128,fc2
的输出大小也为 128。
训练
参数设置
- N_CLASSES = 2
- BATCH_SIZE = 16
- IMG_W = 208
- IMG_H = 208
- EPOCH_NUMS = 10
- learning_rate = 0.0001
我们利用 opencv 读取图片,图片路径从数据处理中保存好的文件中读取。因为模型的输入需要固定大小的图片,所以我们在输入进模型之前需要 resize 为 IMG_W 和 IMG_H 大小的图片。
交叉验证集和测试集选取
我们选取 1000 条数据作为测试集,剩余数据作为训练集。
然后在每个 epoch 中选取 5% 的数据作为交叉验证集。
Accurate
可以发现,在训练集上的平均准确率在 80% 左右,而且可以发现准确率仍在上升。
测试集的准确率为 77%。受硬件制约,我们只训练了 10 个 epoch。如果继续训练,可能准确率会增加。
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于