猫狗大战是 kaggle 的一个著名比赛项目,即编写一个算法使机器能够区分猫和狗(图片)。前面我们已经尝试过使用深度学习的方法识别手写数字图片,效果似乎还不错,稍加改进,就可以应用到这个问题上。

对于机器学习来讲,数据的重要性甚至大于算法。之间已经讨论过数据预处理的问题,但猫狗大战使用的数据集是图像,在方法上有一些区别,所以单独再拿出来说一下。

内容参考自:Python Programming Tutorials,我后续的深度学习内容也是基于这个教程,等不及更新的小伙伴可以直接看原版~

1 获取数据

「点击从微软官方下载猫狗大战数据集」

下载完成后,把它解压到合适的位置。文件夹的结构是:

PetImages
┣ Cat
┗ Dog

2 reshape

猫和狗的图片被分到了不同的子文件夹中。打开观察,发现这些图片的大小并不一样。想想之前的神经网络,输入的维度最好是相同的。所以我们需要把图片 reshape 一下,顺便把颜色丢掉以减少数据量(灰度图像足够识别猫狗了)。

这里需要用到新的模块,opencv,可以使用 pip install opencv-python 安装。

先读进来一张图片:

import numpy as np
import matplotlib.pyplot as plt
import os
import cv2
from tqdm import tqdmDATADIR = "X:/Datasets/PetImages"CATEGORIES = ["Dog", "Cat"]for category in CATEGORIES:path = os.path.join(DATADIR,category)for img in os.listdir(path): img_array = cv2.imread(os.path.join(path,img) ,cv2.IMREAD_GRAYSCALE)  # 把图片读取为数组plt.imshow(img_array, cmap='gray')  # 使用灰度图plt.show()  break  # 这里先拿一个图片测试,所以 break 两次break


看看这个图片的大小:

print(img_array.shape)

(398, 500)

这个图片的大小是 398x500,我们尝试把它缩小到 50x50:

IMG_SIZE = 50new_array = cv2.resize(img_array, (IMG_SIZE, IMG_SIZE))
plt.imshow(new_array, cmap='gray')
plt.show()


感觉有些模糊,再试试 100x100

嗯,这个 OK。接下来我们就可以创建训练集和测试集了。

3 分割数据集

这里需要手动创建一个测试集的文件夹,命名为 Testing,子文件夹仍为 CatDog。然后,从之前的文件夹里分别剪切 (不能复制,否则不能用于测试)15 个图片到两个文件夹中。

接下来,创建训练集:

training_data = []def create_training_data():for category in CATEGORIES:  path = os.path.join(DATADIR,category)  class_num = CATEGORIES.index(category)  for img in tqdm(os.listdir(path)):  try:img_array = cv2.imread(os.path.join(path,img) ,cv2.IMREAD_GRAYSCALE)  new_array = cv2.resize(img_array, (IMG_SIZE, IMG_SIZE)) training_data.append([new_array, class_num])  # 把图片数组和分类标签加入数据集except Exception as e: passcreate_training_data()print(len(training_data))

100%|███████████████████████████████████| 12486/12486 [00:46<00:00, 267.07it/s]
100%|███████████████████████████████████| 12486/12486 [01:00<00:00, 205.21it/s]
24916

运行后,训练集就创建好啦!这里我们的猫狗图片在数量上是均衡的,如果一个数据集里绝大多数都是狗的照片,显然机器会选择把一切都识别成狗。还有另外一个问题,我们的数据集如果一开始是猫,而后来全是狗,那机器仍然会把所有图片识别成狗。所以我们需要打乱数据的分布顺序:

import randomrandom.shuffle(training_data)

之后可以验证一下,查看训练集前 10 个数据的标签:

for sample in training_data[:10]:print(sample[1])

0
1
0
1
1
0
0
0
1
0

4 创建并保存模型

数据已经准备好了,并被分割成为了训练集和测试集,接下来我们需要把它们读进模型中并保存,方便之后的使用。

X = []
y = []for features,label in training_data:X.append(features)y.append(label)X = np.array(X).reshape(-1, IMG_SIZE, IMG_SIZE, 1)# 保存模型
import picklepickle_out = open("X.pickle","wb")
pickle.dump(X, pickle_out)
pickle_out.close()pickle_out = open("y.pickle","wb")
pickle.dump(y, pickle_out)
pickle_out.close()

当我们需要使用它的时候,可以使用以下代码:

pickle_in = open("X.pickle","rb")
X = pickle.load(pickle_in)pickle_in = open("y.pickle","rb")
y = pickle.load(pickle_in)

至此,数据方面的准备已经做好了,在下一篇文章中,我们将尝试使用数据集训练卷积神经网络来实现识别猫狗的目的。

机器学习入坑指南(十):猫狗大战之数据集准备相关推荐

  1. 机器学习入坑指南(五):逻辑回归

    一.逻辑回归简介 逻辑回归用于解决**"二分类"**问题,比如判断明天是晴是雨,判断一封邮件是否是垃圾邮件,判断肿瘤是否是恶性的等等. 让我们举个例子来说明为什么这类问题适合用逻辑 ...

  2. 一块GPU搞定ChatGPT;ML系统入坑指南;理解GPU底层架构

    1. 跑ChatGPT体量模型,从此只需一块GPU 在发展技术,让大模型掌握更多能力的同时,也有人在尝试降低AI所需的算力资源.最近,一种名为FlexGen的技术因为「一块RTX 3090跑ChatG ...

  3. 机器学习入坑姿势之大纲

    <机器学习入坑姿势>之大纲 一.咱先说好 我是一个"半路出家"的机器学习爱好者,爱好到什么程度呢?在一家排名中等偏上的券商的 IT部门工作了五年后,我居然裸辞了:当HR ...

  4. 开发工具篇第九讲:菜鸟入坑指南

    摘要:本文是开发工具篇第九讲:菜鸟入坑指南.针对新人上手慢的问题,写了这篇入坑指南,方便自己回顾,总结.本文分为四个部分,分别为jenkins使用技巧:常用软件操作命令:开发手册:调试手册.主要材料来 ...

  5. 旧android 4 平板,如今的安卓平板值不值得买:小米平板4入坑指南

    如今的安卓平板值不值得买:小米平板4入坑指南 2018-08-04 07:30:40 29点赞 25收藏 42评论 购买理由 三年前入坑小米平板2,在当年的安卓平板环境里,小米平板还是一款十分值得购买 ...

  6. api 微信内置浏览器js_多端开发框架uni-app入坑指南,一套代码适用微信、头条等小程序...

    前言 hello 小伙伴们,现在我已经正式入坑 uni-app 了.uni-app 已经发布好几个月了,期间也是踩坑无数,但是官方秉承着不抛弃不放弃的精神,积极解决开发者的各种简单的.复杂的问题,在此 ...

  7. 小白深度学习入坑指南

    小白深度学习入坑指南 小白深度学习入坑指南 写博客的初衷适合的人群 理论篇 说明 数学 CV ML DL 优化 实践篇 linux python 深度学习框架 框架学习 硬件配置 软件环境配置 常见的 ...

  8. 搜索和CTR预估入坑指南

    简介 搜索小白.CTR小白,整理了一份入坑指南,一些比较好的博客和论文.本文适用于有一定的机器学习和深度学习基础,但是不懂搜索和CTR的同学. 注:后续会不定时更新. 基础 主要是一些经典的语言模型( ...

  9. notion 科研_科研新手全面入坑指南

    简介 写论文既是当代大学生的必修课,也是科研工作者的必备技能.尽管大部分少数派读者的人生中都要经历一两次写论文的过程,但那些藏在这个过程里的诸多方法和细节,连你的导师都未必会系统地告诉你. 在这份&l ...

最新文章

  1. android SwipeRefreshLayout嵌套Webview滑动冲突问题解决
  2. px word 表格宽度_「Word技巧」掌握这六个Word表格处理技巧,表格排版不再是问题...
  3. 攻防世界Reverse第七题simple-unpack
  4. Aizu - 1407 Parentheses Editor(对顶栈+模拟)
  5. 安防监控系统CIF、D1等格式的解释
  6. echarts柱形图x轴y轴互换_数控机床在加工零件时,突然出现X、Y、Z轴失控?如何处理...
  7. mysql里边字符函数_mysql函数(一.字符函数)
  8. POCO C++库导游【转】
  9. MapXtreme 2005 学习心得 关于地图投影坐标问题的解决方式(十四)
  10. java表示非法参数的异常是_JAVA 的异常那些事
  11. android ajax chrome,chrome浏览器ajax请求状态200,response为空的探索
  12. LFW数据集—人脸对齐
  13. 这些问题你是否也有中招?TMT行业质量报告新鲜出炉
  14. 公共关系与人际交往能力
  15. unbuntu 安装nginx
  16. QGraphicsView使用详解
  17. 天气很热,用Python告诉你奶茶哪家最好喝性价比最高?
  18. 大数据应用型产品设计方法及行业案例介绍(附110页PPT)
  19. Tomcat(4)-集群
  20. 动态规划题目——背包

热门文章

  1. Java解析woff_ttf字体转换成web中使用的woff、svg、eot格式字体
  2. 计算机网络协议编号是什么,因特网协议
  3. 免认证的 php短信接口代码
  4. 小米网关+HomeAssistant获取智能硬件数据
  5. CC2017常用快捷键整理
  6. C语言math.c的运用
  7. 人工智能专栏第一讲-什么是人工智能/人工智能的历史/人工智能的发展路径/人工智能的发展趋势
  8. js选择器获取元素的value值,如何判断为空
  9. 软件开发工具推荐 :Gow
  10. 【高级】管理科学基础知识