建议阅读时长 8 分钟

前言

对于机器学习来说,数据的重要性无可厚非,大部分处理机器学习的问题都是在处理数据,包括数据的清洗,归一化等,好的数据质量能大大提高模型的预测性能

但是对与初学者来说,数据变得不那么重要,因为学习机器学习主要学习算法思想以及如何实现,要善于站在前人的肩膀上对于计算机视觉领域,前辈们已经创建许多非常强大的图片数据集,如 Image-net: 『http://www.image-net.org/ 』 Google 图片数据库 『https://storage.googleapis.com/openimages/web/index.html 』可以帮助我们加速开发模型

下面要介绍的一个框架是 Keras 对于新手非常友好,本人之前使用过一阶段的 Tensorflow 感觉比较抽象,对于想快速入门机器学习的同学, Keras 是一款不错的选择

以下是三个框架这几年的流行程度,从中我们能看出一点趋势

Keras 中有许多数据集,包括用来做二分类的 IMDB 数据集、多分类的路透社数据集、做回归的波士顿房价数据集等,而本文要介绍的是二分类的图片数据集,猫狗数据集,原始数据可以在 Kaggle 官网上进行下载 『https://www.kaggle.com/c/dogs-vs-cats/data』 如果你没有 Kaggle 帐号,我将在文后附上我已经下载的数据集供你们使用

数据格式如下:

其中训练集 1000 张,验证集 500 张,测试集 500 张,总共 4000 张。

猫狗大战开始

机器学习的一般步骤是:准备数据

数据预处理(检查数据、数据归一化、将数据转换成张量等)

建立模型

查看精度和损失

预测

保存模型# 导入包

import os, shutil

import keras

from keras.layers import Conv2D, MaxPooling2D, Dense, Flatten # 卷积神经网络

from keras.models import Sequential

import matplotlib.pyplot as plt # 绘图包

from keras.preprocessing import image # 数据处理

查看数据

检查数据是数据处理过程中一项基本步骤,可以预防数数据路径、数据集数量、数据集格式等出现错误# 对创建的文件夹进行检查

dst_path='./img_data/small_datasets/'

train_cats_dir = os.path.join(dst_path, 'train/cats')

train_dogs_dir = os.path.join(dst_path, 'train/dogs')

test_cats_dir = os.path.join(dst_path, 'test/cats')

test_dogs_dir = os.path.join(dst_path, 'test/dogs')

validation_cats_dir = os.path.join(dst_path, 'validation/cats')

validation_dogs_dir = os.path.join(dst_path, 'validation/dogs')

print('total training cat images:', len(os.listdir(train_cats_dir)))

print('total training dog images:', len(os.listdir(train_dogs_dir)))

print('total validation cat images:', len(os.listdir(validation_cats_dir)))

print('total validation dog images:', len(os.listdir(validation_dogs_dir)))

print('total test cat images:', len(os.listdir(test_cats_dir)))

print('total test dog images:', len(os.listdir(test_dogs_dir)))# 运行结果

totaltraining cat images: 1000

totaltraining dog images: 1000

totalvalidation cat images: 500

totalvalidation dog images: 500

totaltest cat images: 500

totaltest dog images: 500

数据预处理读取图像文件。

将 JPEG 文件解码为 RGB 像素网格。

将这些像素网格转换为浮点数张量。

将像素值(0~255 范围内)缩放到 [0, 1] 区间(正如你所知,神经网络喜欢处理较小的输入值)。# 图像处理辅助工具的模块

# ImageDataGenerator 类,可以快速创建 Python 生成器,能够将硬盘上的图像文件自动转换为预处理好的张量批量。

fromkeras.preprocessing.image import ImageDataGenerator

#### 归一化

train_datagen = ImageDataGenerator(rescale=1./255) # 将所有图像乘以 1./255 进行缩放,即进行归一化

validation_datagen = ImageDataGenerator(rescale=1./255)

train_dir = './img_data/small_datasets/train/'# 训练集路径

validation_dir = './img_data/small_datasets/validation/'# 测试集路径

# 所有图像调整为 (150,150) # 因为使用了 binary_crossentropy损失,所以需要用二进制标签 # 批量大小为 20

train_generator = train_datagen.flow_from_directory(

train_dir, target_size=(150, 150), batch_size=20, class_mode='binary')

validation_generator = validation_datagen.flow_from_directory(

validation_dir, target_size=(150, 150), batch_size=20, class_mode='binary')

# 对数据进行可视化查看,看图片和标签是否匹配,随机检查一部分

fordata_batch, lable_batch in train_generator:

x = data_batch[0]

y = lable_batch[0]

print("data_batch shape", data_batch.shape)

print("lable_batch shape", lable_batch.shape)

break

plt.imshow(image.array_to_img(x))

plt.title(str('cat'if y == 0 else 'dog'))

plt.show()# 输出结果

Found 2000 images belonging to 2 classes.

Found 1000 images belonging to 2 classes.

data_batch shape (20, 150, 150, 3)

lable_batch shape (20,)

建立卷积模型

计算机视觉大部分模型都是使用卷积神经网络(CNN)def model_demo():

model = Sequential()

model.add(Conv2D(32, (3, 3), activation='relu', input_shape=(150, 150, 3)))

model.add(MaxPooling2D((2, 2)))

model.add(Conv2D(64, (3, 3), activation='relu'))

model.add(MaxPooling2D((2, 2)))

model.add(Conv2D(128, (3, 3), activation='relu'))

model.add(MaxPooling2D((2, 2)))

model.add(Conv2D(128, (3, 3), activation='relu'))

model.add(MaxPooling2D((2, 2)))

model.add(Flatten())

model.add(Dense(512, activation='relu'))

model.add(Dense(1, activation='sigmoid')) # 二分类,最后一层使用 sigmoid

return model

model = model_demo()

model.summary()# 模型输出结果

_________________________________________________________________

Layer (type) Output Shape Param #

=================================================================

conv2d_1 (Conv2D) (None, 148, 148, 32) 896

_________________________________________________________________

max_pooling2d_1 (MaxPooling2 (None, 74, 74, 32) 0

_________________________________________________________________

conv2d_2 (Conv2D) (None, 72, 72, 64) 18496

_________________________________________________________________

max_pooling2d_2 (MaxPooling2 (None, 36, 36, 64) 0

_________________________________________________________________

conv2d_3 (Conv2D) (None, 34, 34, 128) 73856

_________________________________________________________________

max_pooling2d_3 (MaxPooling2 (None, 17, 17, 128) 0

_________________________________________________________________

conv2d_4 (Conv2D) (None, 15, 15, 128) 147584

_________________________________________________________________

max_pooling2d_4 (MaxPooling2 (None, 7, 7, 128) 0

_________________________________________________________________

flatten_1 (Flatten) (None, 6272) 0

_________________________________________________________________

dense_1 (Dense) (None, 512) 3211776

_________________________________________________________________

dense_2 (Dense) (None, 1) 513

=================================================================

Total params: 3,453,121

Trainable params: 3,453,121

Non-trainable params: 0

_________________________________________________________________

编译模型fromkeras import optimizers

model.compile(optimizer=optimizers.RMSprop(lr=1e-4), # 直接使用 RmSprop 是稳妥的。

loss=keras.losses.binary_crossentropy, metrics=['acc']) # 二分类所以使用二元交叉熵作为损失函数

利用批量生成器拟合模型# 得出的结果是训练集和验证集上的损失和精度

history= model.fit_generator(generator=train_generator,

steps_per_epoch=100,

epochs=30, # 训练 30 轮

validation_data=validation_generator,

validation_steps=50

)

这段程序运行的时间会有的久,若同学们不想运行,我已经将训练好的模型保存起来,供你们使用

保存模型# 保存模型,是开发的一种习惯

model.save('cats_and_dogs_small_1.h5')

模型预测# 读取测试集中的数据

test_dir= './img_data/small_datasets/test/'

test_datagen = ImageDataGenerator(rescale=1./255) # 归一化

# 所有图像调整为 (150,150) # 因为使用了 binary_crossentropy损失,所以需要用二进制标签 # 批量大小为 20

test_generator = test_datagen.flow_from_directory(test_dir,

target_size=(150, 150),

batch_size=20,

class_mode='binary')# 输出

Found 1000 images belonging to 2 classes.# 可视化部分图像,看图像与标签是否相符

fordata_batch, labels_batch in test_generator:

x = data_batch[1]

y = labels_batch[1]

print("data_batch shape", data_batch.shape)

print("labels_batch shape", labels_batch.shape)

break

plt.imshow(image.array_to_img(x))

plt.title(str('cat'if y == 0 else 'dog'))

plt.show()# 输出结果

data_batch shape (20, 150, 150, 3)

labels_batch shape (20,)

对训练集进行预测# 对训练集进行预测,查看一下模型在训练集上的效果,若效果很差,说明模型没有训练好

model_load.evaluate_generator(train_generator, steps=20)

对测试集进行预测from keras.models import load_model

model_load = load_model("./cats_and_dogs_small_1.h5")

model_load.evaluate(data_batch, labels_batch, batch_size=20, verbose=1) model_load.evaluate_generator(test_generator, steps=20)

结果可视化# 绘制结果,这一部分的结果见下面

importmatplotlib.pyplot as plt

defplot_acc_err(history):

acc = history.history['acc']

val_acc = history.history['val_acc']

loss = history.history['loss']

val_loss = history.history['val_loss']

epochs = range(1, len(acc) + 1)

plt.plot(epochs, acc, 'bo', label='Training acc')

plt.plot(epochs, val_acc, 'b', label='Validation acc')

plt.title('Training and validation accuracy')

plt.legend()

plt.figure() # 在另一个图像绘制

plt.plot(epochs, loss, 'bo', label='Training loss')

plt.plot(epochs, val_loss, 'b', label='Validation loss')

plt.title('Training and validation loss')

plt.legend()

plt.show()

plot_acc_err(history)

处理保存的模型和训练历史

本模块是将训练好的精度和损失保存下来,方便下一次进行分析# 读取训练数据

withopen("history.json", 'r') as f:

history_load = f.readlines()

history_load = json.loads(history_load[0])

acc= history_load['acc']

val_acc = history_load['val_acc']

loss = history_load['loss']

val_loss = history_load['val_loss']

epochs = range(1, len(acc) + 1)

plt.plot(epochs, acc, 'bo', label='Training acc')

plt.plot(epochs, val_acc, 'b', label='Validation acc')

plt.title('Training and validation accuracy')

plt.legend()

plt.figure() # 在另一个图像绘制

plt.plot(epochs, loss, 'bo', label='Training loss')

plt.plot(epochs, val_loss, 'b', label='Validation loss')

plt.title('Training and validation loss')

plt.legend()

plt.show()

结果分析

训练精度随时间线性增加,而验证精度停留在 70% 左右,验证损失仅在 10 轮后就达到最小值,然后保持不变,而训练损失则一直线性下降,直到接近于 0。

过拟合的原因主要是因为训练样本相对较少(猫狗各 2000 个)

结语

我在学习的过程中,发现使用 Keras 自带的样本迭代器来训练时速度很慢,主要原因是:每次训练的时候,时间大部分消耗在 CPU 读取数据上,而真正训练的时间并不是很长,之后会介绍几种方法,不仅能提升训练精度,也能让训练的时间可能的短,即使你没有 GPU 来加速

在本公众号回复 机器学习 即可获取猫狗大战的程序、数据集、模型、训练数据等!

后台回复 效率 获取提升效率的软件!

推荐个朋友

Python高效编程专注于Python 实战教程,分享 Python 进阶知识、PyQt5 图形界面系列文章以及个人学习经验

还时不时设计一些实用的 Python 脚本,欢迎关注!

别忘了爱自己

别忘了热爱生活,代码敲累了,就出去走走,健健身,生活总是美好的~

个人站点:

Github: https://github.com/FLyingLSJ

CSDN : https://blog.csdn.net/LSJ944830401

BLOG: https://flyinglsj.github.io/

python猫狗大战讲解_机器学习 | 猫狗大战相关推荐

  1. python猫狗大战讲解_tensorflow实现猫狗大战(分类算法)

    from __future__ importabsolute_importfrom __future__ importdivisionfrom __future__ importprint_funct ...

  2. python猫狗大战讲解_Kaggle入门-猫狗大战

    学习kaggle一篇讲的很好的kernel,但是准确率一般般,后面再学习一篇准确度接近最好的kernel. 原kernel链接 首先,简单介绍了一下卷积神经网络,卷积神经网络主要用于图片分类,或者在图 ...

  3. r语言和python的区别_机器学习怎样开始比较好?Python还是R语言?

    全文共3077字,预计学习时长11分钟 图源:unsplash 机器学习是近几年来最热门的技术之一,也许你对机器学习很感兴趣,但却不知从何处下手.别担心,兴趣是最好的老师这里有你开启该领域职业生涯的完 ...

  4. python pca降维_机器学习的降维打击

    文章发布于公号[数智物语] (ID:decision_engine),关注公号不错过每一篇干货. 来源 | SAMshare(id:SAMshare) 作者 | samshare "本次主要 ...

  5. python pca降维_机器学习之sklearn中的降维算法

    1. PCA与SVD sklearn中降维算法都被包括在模块decomposition中,这个模块本质是一个矩阵分解模块.在过去的十年中,如果要讨论算法进步的先锋,矩阵分解可以说是独树一帜.矩阵分解可 ...

  6. python回归算法_机器学习算法之回归详解

    导语 回归:从一组数据出发,确定某些变量之间的定量关系式:即建立数学模型并估计未知参数. 回归的目的是预测数值型的目标值,它的目标是接受连续数据,寻找最适合数据的方程,并能够对特定值进行预测.这个方程 ...

  7. python数据分析实况_机器学习竞赛分享:通用的团队竞技类的数据分析挖掘方法...

    前言 该篇分享来源于NFL竞赛官方的R语言版本,我做的主要是翻译为Python版本: 分享中用到的技巧.构建的特征.展示数据的方式都可以应用到其他领域,比如篮球.足球.LOL.双人羽毛球等等,只要是团 ...

  8. python机械编程_机器学习编程作业3——多类分类(Python版)

    本次编程作业的实现环境是Python3.Anaconda3(64-bit).Jupyter Notebook.是在深度之眼"机器学习训练营"作业基础上完成的,个别代码有修改,供交流 ...

  9. python递归函数讲解_带你深入学习Python——Python递归详解!

    一.递归 递归:在调用一个函数的过程中,直接或间接地调用了函数本身这个就叫递归 注:Python在递归中没有像别的语言对递归进行优化,所以他的每一次调用都会基于上一次的调用进行,并且他设置了最大的递归 ...

最新文章

  1. lambda中的钩子函数
  2. python基础 协程
  3. 获取微信的access_tokey,处理json格式的数据
  4. Maven POM 浅析
  5. DEVC编译器快捷键大全
  6. win10安装SqlServer2005教程
  7. 项目经理(甲方)推行ERP,需要做些什么?
  8. 2021年韩国经济发展研究报告
  9. 上市公司融资需要哪些条件
  10. 细数红帽linux系统下的各个文件夹作用
  11. java和javaweb的区别_java和javaweb有什么关系吗?它们之间的区别是什么?
  12. matlab在电力电子的应用,MATLAB在电力电子技术中的应用
  13. 山大计算机学院陈竹敏年龄,第十八届全国自然语言处理青年学者研讨会在山东青岛顺利召开...
  14. Hadoop项目结构及其主要作用
  15. 软考考试多少分可以拿到证书?
  16. linux搭建filebrowser教程,使用filebrowser搭建私人云盘
  17. php判断三角形类型,判断三角形类型
  18. 吾尝终日而思矣,不如须臾之所学也
  19. 计算机程序设计基础结课报告,《计算机程序设计基础》课程地位及教学探讨
  20. 【深度分析】生鲜行业盈利困难,数字化转型迫在眉睫

热门文章

  1. 生活需要仪式感,欧蓝德幸福照相馆带你发现身边的幸福
  2. 智慧油田-三维管网可视化信息平台
  3. js如何删除数组的倒数第n个及后面元素
  4. teamviewer v_p_n+xp v_p_n服务实现在家访问公司内部局域网
  5. 安卓逆向之JAVA层静态分析(愤怒的小鸟去广告,充值破解)
  6. 【转】咱们这好吃的..武汉小吃
  7. 计算机知识忘记开机密码,电脑忘记开机密码怎么办?如何解锁?
  8. BZOJ1143祭祀river
  9. BZOJ-1143 [CTSC2008]祭祀
  10. 金融风控场景下:数据分析、模型与策略。