我是靠谱客的博主 独特汉堡,最近开发中收集的这篇文章主要介绍猫狗大战,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

准备工作1-注册Google账号



去Kaggle网址下载数据集时,需要有Google、Facebook、Yahoo账号,故先注册Google账号,但由于国内的限制,最后再注册账号时,手机号无法收到验证码,综合查找,找到成功注册Google账号的方法如下。



下载Google浏览器



如下:




下载后安装即可。


修改Google浏览器设置




1. 打开Google浏览器;


2. 点右上角的“ ”,选择“设置”;


3. 在高级里选择“语言”——“英语”;


4. 将英语设为默认语言;


5. 然后关闭浏览器,再次打开;


6. 按照之前正常的注册账号方法一步步注册;


7. 在电话号那步,选择“skip”即可注册成功,有账号才能在Kaggle上下载数据集;



准备工作2-电脑环境及所需软件




1. Win7/Win1064位系统;


2. 安装Anaconda软件(Python3.5);


3. 安装tensorflow-gpu 1.1.0;


4. CUDA8.0 + cudnn 5.1;


5. 安装Python集成开发环境(IDE):Pycharm;



下载数据集




Cats vs. Dogs(猫狗大战)是Kaggle大数据竞赛某一年的一道赛题,利用给定的数据集,用算法实现猫和狗的识别。

 
数据集可以从Kaggle官网上下载:


https://www.kaggle.com/c/dogs-vs-cats




  数据集由训练数据和测试数据组成,训练数据包含猫和狗各12500张图片,测试数据包含12500张猫和狗的图片。(微软的数据集不需要翻墙) 






新建工程



1. 打开Pycharm软件,创建新工程,按照如下目录创建;




2. 在工程名上,点右键,选择“new”—“Directory”,弹出对话框,输入data,即创建data文件夹;




3. 按同样方法,在data文件夹下,添加下载的数据集test、train文件夹;


4. 然后,再创建一个logs文件夹;


5. 在logs文件夹下,添加python代码;


6. Python文件创建方法,在文件夹上点右键,选择“new”—“Python File”如下:





在弹出的对话框内输入.py文件名,如下:





各文件明细



  • data文件夹下包含test和train两个子文件夹,分别用于存放测试数据和训练数据,从官网上下载的数据直接解压到相应的文件夹下即可;

  • logs文件夹用于存放我们训练时的模型结构以及训练参数;

  • input_data.py负责实现读取数据,生成批次(batch);

  • model.py负责实现我们的神经网络模型;

  • training.py负责实现模型的训练;

  • test.py负责对模型进行测试、评估其准确性;

接下来分成数据读取、模型构造、模型训练、测试模型四个部分来讲。



工程流程图







数据处理—input_data.py



导入模块







获取路径下的训练数据(图片+标签)



1. 由于训练数据的前12500张是猫,后12500张是狗,如果直接按这个顺序训练,训练效果可能会受影响,所以需要将顺序打乱,至于是读取数据的时候乱序还是训练的时候乱序可以自己选择。因为图片和标签是一一对应的,所以要整合到一起乱序。


2. 函数get_files(file_dir)的功能是获取给定路径file_dir下的所有的训练数据(包括图片和标签),以list的形式返回。


3. 先用np.hstack()方法将猫和狗图片和标签整合到一起,得到image_list和label_list;


4. hstack((a,b))的功能是将a和b以水平的方式连接,比如原来cats和dogs是长度为12500的向量,执行了hstack(cats, dogs)后,image_list的长度为25000,同理label_list的长度也为25000;


5. 接着将一一对应的image_list和label_list再合并一次,temp的大小是2×25000,经过转置(变成25000×2),然后使用np.random.shuffle()方法进行乱序。


6. 最后从temp中分别取出乱序后的image_list和label_list列向量,作为函数的返回值。


7. 这里要注意,因为label_list里面的数据类型是字符串类型,所以加上label_list =[int(i) for i in label_list]这么一行将其转为int类型。


具体代码如下:






图像分批次进行训练



1. 函数get_batch()用于将图片分批次,传入的参数image和label是函数get_files()返回的image_list和label_list,python中的list类型,所以需要将其转为TensorFlow可以识别的tensor格式。


2. 用slice_input_producer()来建立一个队列,将image和label放入一个list中当做参数传给该函数;然后从队列中取得image和label。


3. 用read_file()读取图片之后,要按照图片格式进行解码。本例程中训练数据是jpg格式的,所以使用decode_jpeg()解码器,如果是其他格式,就要用其他解码器。注意decode出来的数据类型是uint8,之后模型卷积层里面conv2d()要求输入数据为float32类型,所以如果删掉标准化步骤之后需要进行类型转换。


4. 因为训练库中图片大小是不一样的,所以还需要将图片裁剪成相同大小(img_W和img_H)。可用的函数有:1)resize_image_with_crop_or_pad()是从图像中心向四周裁剪,如果图片超过规定尺寸,最后只会剩中间区域的一部分,可能一只狗只剩下躯干,头都不见了,用这样的图片训练结果肯定会受到影响。2)用resize_images()对图像进行缩放,而不是裁剪,采用NEAREST_NEIGHBOR插值方法。


5. 然后用tf.train.batch()方法获取batch;


6. 最后将得到的image_batch和label_batch返回;


7. image_batch是一个4D的tensor,[batch, width, height, channels],label_batch是一个1D的tensor,[batch]。







测试




1. 可以用下面的代码测试获取图片是否成功,因为之前将图片转为float32了,因此这里imshow()出来的图片色彩会有点奇怪,因为本来imshow()是显示uint8类型的数据(灰度值在uint8类型下是0~255,转为float32后会超出这个范围,所以色彩有点奇怪),不过这不影响后面模型的训练。






运行


运行显示目录下的猫、狗图片数,结果如下:





模型设计—model.py



构造卷积神经网络



1. 构造的网络结构为:(卷积层+池化层)* 2 +(全连接层)* 2+ Softmax层;


2. 每个网络层都使用with tf.variable_scope("name")语句,这其实是TensorFlow中的变量作用域机制;


3. 在变量作用域内,使用tf.get_variable(<name>, <shape>, <initializer>): 创建变量;











计算损失






Loss损失值优化






准确率计算







模型训练—training.py










模型测试—test.py











模型评估



模型的评估主要有几个指标:平均准确率、识别的时间、loss下降变化等。Tensorflow提供了一个log可视化的工具tensroboard。要看到log就必须在训练时用summary去记录想要显示的东西,包括accloss甚至image。


Tensorboard的使用



windows下,在CMD命令行或者shell界面下输入(在存放log文件的目录打开才有效,不然在chrome浏览器无法看见图):




然后打开浏览器输入返回的值:




进入tensorboard,查看各种log













最后

以上就是独特汉堡为你收集整理的猫狗大战的全部内容,希望文章能够帮你解决猫狗大战所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(42)

评论列表共有 0 条评论

立即
投稿
返回
顶部