猫狗大战
准备工作1-注册Google账号
去Kaggle网址下载数据集时,需要有Google、facebook、Yahoo账号,故先注册Google账号,但由于国内的限制,最后再注册账号时,手机号无法收到验证码,综合查找,找到成功注册Google账号的方法如下。
下载Google浏览器
如下:
下载后安装即可。
修改Google浏览器设置
1. 打开Google浏览器;
2. 点右上角的“ ”,选择“设置”;
3. 在高级里选择“语言”——“英语”;
4. 将英语设为默认语言;
5. 然后关闭浏览器,再次打开;
6. 按照之前正常的注册账号方法一步步注册;
7. 在电话号那步,选择“skip”即可注册成功,有账号才能在Kaggle上下载数据集;
准备工作2-电脑环境及所需软件
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
相关阅读
今年的互联网红包大战,又有哪些新花样?春节将至,除了春运返乡这项独具中国特色、成为“当代新传统”的“全民运动”外,置办年货、发红
线上线下同价,小米为何更赚钱?在广州结束了一场演讲后,一看智能手环,嗯,时间刚好。和主办方握手告别,上车,前往机场,同时开始准备一个重要
微博作为新浪最核心的战略业务,而微头条也正是字节跳动未来的战略重点,当两者相遇微博市场,势必又是一场大战。(注:此为2019前瞻系列的
而刚刚得到最新的消息,曾经作为国内团购老大的拉手网,则已经被江苏民企宏图三胞收购,落寂的背后,映射出团购行业再现冰火两重天的格局
2016年的双十一刚刚过去,它已经走过八个年头,从天猫一家促销节日到全国线上线下购物狂欢,各大电商摩拳擦掌使出浑身解数,做晚会、砸广