机器学习入坑指南(十):猫狗大战之数据集准备
猫狗大战是 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
,子文件夹仍为 Cat
、Dog
。然后,从之前的文件夹里分别剪切 (不能复制,否则不能用于测试)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)
至此,数据方面的准备已经做好了,在下一篇文章中,我们将尝试使用数据集训练卷积神经网络来实现识别猫狗的目的。
机器学习入坑指南(十):猫狗大战之数据集准备相关推荐
- 机器学习入坑指南(五):逻辑回归
一.逻辑回归简介 逻辑回归用于解决**"二分类"**问题,比如判断明天是晴是雨,判断一封邮件是否是垃圾邮件,判断肿瘤是否是恶性的等等. 让我们举个例子来说明为什么这类问题适合用逻辑 ...
- 一块GPU搞定ChatGPT;ML系统入坑指南;理解GPU底层架构
1. 跑ChatGPT体量模型,从此只需一块GPU 在发展技术,让大模型掌握更多能力的同时,也有人在尝试降低AI所需的算力资源.最近,一种名为FlexGen的技术因为「一块RTX 3090跑ChatG ...
- 机器学习入坑姿势之大纲
<机器学习入坑姿势>之大纲 一.咱先说好 我是一个"半路出家"的机器学习爱好者,爱好到什么程度呢?在一家排名中等偏上的券商的 IT部门工作了五年后,我居然裸辞了:当HR ...
- 开发工具篇第九讲:菜鸟入坑指南
摘要:本文是开发工具篇第九讲:菜鸟入坑指南.针对新人上手慢的问题,写了这篇入坑指南,方便自己回顾,总结.本文分为四个部分,分别为jenkins使用技巧:常用软件操作命令:开发手册:调试手册.主要材料来 ...
- 旧android 4 平板,如今的安卓平板值不值得买:小米平板4入坑指南
如今的安卓平板值不值得买:小米平板4入坑指南 2018-08-04 07:30:40 29点赞 25收藏 42评论 购买理由 三年前入坑小米平板2,在当年的安卓平板环境里,小米平板还是一款十分值得购买 ...
- api 微信内置浏览器js_多端开发框架uni-app入坑指南,一套代码适用微信、头条等小程序...
前言 hello 小伙伴们,现在我已经正式入坑 uni-app 了.uni-app 已经发布好几个月了,期间也是踩坑无数,但是官方秉承着不抛弃不放弃的精神,积极解决开发者的各种简单的.复杂的问题,在此 ...
- 小白深度学习入坑指南
小白深度学习入坑指南 小白深度学习入坑指南 写博客的初衷适合的人群 理论篇 说明 数学 CV ML DL 优化 实践篇 linux python 深度学习框架 框架学习 硬件配置 软件环境配置 常见的 ...
- 搜索和CTR预估入坑指南
简介 搜索小白.CTR小白,整理了一份入坑指南,一些比较好的博客和论文.本文适用于有一定的机器学习和深度学习基础,但是不懂搜索和CTR的同学. 注:后续会不定时更新. 基础 主要是一些经典的语言模型( ...
- notion 科研_科研新手全面入坑指南
简介 写论文既是当代大学生的必修课,也是科研工作者的必备技能.尽管大部分少数派读者的人生中都要经历一两次写论文的过程,但那些藏在这个过程里的诸多方法和细节,连你的导师都未必会系统地告诉你. 在这份&l ...
最新文章
- android SwipeRefreshLayout嵌套Webview滑动冲突问题解决
- px word 表格宽度_「Word技巧」掌握这六个Word表格处理技巧,表格排版不再是问题...
- 攻防世界Reverse第七题simple-unpack
- Aizu - 1407 Parentheses Editor(对顶栈+模拟)
- 安防监控系统CIF、D1等格式的解释
- echarts柱形图x轴y轴互换_数控机床在加工零件时,突然出现X、Y、Z轴失控?如何处理...
- mysql里边字符函数_mysql函数(一.字符函数)
- POCO C++库导游【转】
- MapXtreme 2005 学习心得 关于地图投影坐标问题的解决方式(十四)
- java表示非法参数的异常是_JAVA 的异常那些事
- android ajax chrome,chrome浏览器ajax请求状态200,response为空的探索
- LFW数据集—人脸对齐
- 这些问题你是否也有中招?TMT行业质量报告新鲜出炉
- 公共关系与人际交往能力
- unbuntu 安装nginx
- QGraphicsView使用详解
- 天气很热,用Python告诉你奶茶哪家最好喝性价比最高?
- 大数据应用型产品设计方法及行业案例介绍(附110页PPT)
- Tomcat(4)-集群
- 动态规划题目——背包