必威体育Betway必威体育官网
当前位置:首页 > IT技术

猫狗大战

时间:2019-07-23 08:12:11来源:IT技术作者:seo实验室小编阅读:88次「手机版」
 

猫狗大战

准备工作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去记录想要显示的东西,包括acc\loss甚至image。

Tensorboard的使用

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

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

进入tensorboard,查看各种log

相关阅读

红包大战花样翻新,短视频成新宠?

今年的互联网红包大战,又有哪些新花样?春节将至,除了春运返乡这项独具中国特色、成为“当代新传统”的“全民运动”外,置办年货、发红

一篇文章,讲透小米新零售的8大战略

线上线下同价,小米为何更赚钱?在广州结束了一场演讲后,一看智能手环,嗯,时间刚好。和主办方握手告别,上车,前往机场,同时开始准备一个重要

微博大战再起:微头条独立VS新浪微博,腾讯微博复活刻不容

微博作为新浪最核心的战略业务,而微头条也正是字节跳动未来的战略重点,当两者相遇微博市场,势必又是一场大战。(注:此为2019前瞻系列的

窝窝团率先退出团购大战 转战移动O2O, 你怎么看?

而刚刚得到最新的消息,曾经作为国内团购老大的拉手网,则已经被江苏民企宏图三胞收购,落寂的背后,映射出团购行业再现冰火两重天的格局

案例:双11电商大战,垂直电商如何生存

2016年的双十一刚刚过去,它已经走过八个年头,从天猫一家促销节日到全国线上线下购物狂欢,各大电商摩拳擦掌使出浑身解数,做晚会、砸广

分享到:

栏目导航

推荐阅读

热门阅读