图像分类入门,轻松拿下90%准确率 | 教你用Keras搞定Fashion-MNIST

2018 年 6 月 3 日 量子位
原作 Margaret Maynard-Reid
王小新 编译自 TensorFlow的Medium
量子位 出品 | 公众号 QbitAI

这篇教程会介绍如何用TensorFlow里的tf.keras函数,对Fashion-MNIST数据集进行图像分类。

只需几行代码,就可以定义和训练模型,甚至不需要太多优化,在该数据集上的分类准确率能轻松超过90%。

在进入正题之前,我们先介绍一下上面提到的两个名词:

Fashion-MNIST,是去年8月底德国研究机构Zalando Research发布的一个数据集,其中训练集包含60000个样本,测试集包含10000个样本,分为10类。样本都来自日常穿着的衣裤鞋包,每一个都是28×28的灰度图。

这个数据集致力于成为手写数字数据集MNIST的替代品,可用作机器学习算法的基准测试,也同样适合新手入门。

想深入了解这个数据集,推荐阅读量子位之前的报道:
连LeCun都推荐的Fashion-MNIST数据集,是这位华人博士的成果

或者去GitHub:
https://github.com/zalandoresearch/fashion-mnist

tf.keras是用来在TensorFlow中导入Keras的函数。Keras是个容易上手且深受欢迎的深度学习高级库,是一个独立开源项目。在TensorFlow中,可以使用tf.keras函数来编写Keras程序,这样就能充分利用动态图机制eager execution和tf.data函数。

下面可能还会遇到其他深度学习名词,我们就不提前介绍啦。进入正题,教你用tf.keras完成Fashion-MNIST数据集的图像分类~

运行环境

无需设置,只要使用Colab直接打开这个Jupyter Notebook链接,就能找到所有代码。

https://colab.research.google.com/github/margaretmz/deep-learning/blob/master/fashion_mnist_keras.ipynb

数据处理

Fashion-MNIST数据集中有十类样本,标签分别是:

  • T恤 0

  • 裤子 1

  • 套头衫 2

  • 裙子 3

  • 外套 4

  • 凉鞋 5

  • 衬衫 6

  • 运动鞋 7

  • 包 8

  • 踝靴 9

数据集导入

下面是数据集导入,为后面的训练、验证和测试做准备。

只需一行代码,就能用keras.datasets接口来加载fashion_mnist数据,再用另一行代码来载入训练集和测试集。

1# Note in Colab you can type "pip install" directly in the notebook
2!pip install -q -U tensorflow>=1.8.0
3import tensorflow as tf
4import numpy as np
5import matplotlib.pyplot as plt
6# Load the fashion-mnist pre-shuffled train data and test data
7(x_train, y_train), (x_test, y_test) = tf.keras.datasets.fashion_mnist.load_data()
8print("x_train shape:", x_train.shape, "y_train shape:", y_train.shape)

数据可视化

我喜欢用Jupyter Notebook来可视化,你也可以用matplotlib库中imshow函数来可视化训练集中的图像。要注意,每个图片都是大小为28x28的灰度图。

1# Show one of the images from the training dataset
2plt.imshow(x_train[img_index])

数据归一化

接着,进行数据归一化,使得样本值都处于0到1之间。

1x_train = x_train.astype('float32') / 255
2x_test = x_test.astype('float32') / 255

数据集划分

这个数据集一共包含60000个训练样本和10000个测试样本,我们会把训练样本进一步划分为训练集和验证集。下面是深度学习中三种数据的作用:

  • 训练数据,用来训练模型;

  • 验证数据,用来调整超参数和评估模型;

  • 测试数据,用来衡量最优模型的性能。

模型构建

下面是定义和训练模型。

模型结构

在Keras中,有两种模型定义方法,分别是序贯模型和功能函数。

在本教程中,我们使用序贯模型构建一个简单CNN模型,用了两个卷积层、两个池化层和一个Dropout层。

要注意,第一层要定义输入数据维度。最后一层为分类层,使用Softmax函数来分类这10种数据。

 1model = tf.keras.Sequential()
2# Must define the input shape in the first layer of the neural network
3model.add(tf.keras.layers.Conv2D(filters=64, kernel_size=2, padding='same', activation='relu', input_shape=(28,28,1)))
4model.add(tf.keras.layers.MaxPooling2D(pool_size=2))
5model.add(tf.keras.layers.Dropout(0.3))
6model.add(tf.keras.layers.Conv2D(filters=32, kernel_size=2, padding='same', activation='relu'))
7model.add(tf.keras.layers.MaxPooling2D(pool_size=2))
8model.add(tf.keras.layers.Dropout(0.3))
9model.add(tf.keras.layers.Flatten())
10model.add(tf.keras.layers.Dense(256, activation='relu'))
11model.add(tf.keras.layers.Dropout(0.5))
12model.add(tf.keras.layers.Dense(10, activation='softmax'))
13# Take a look at the model summary
14model.summary()

模型编译

在训练模型前,我们用model.compile函数来配置学习过程。在这里,要选择损失函数、优化器和训练测试时的评估指标。

1model.compile(loss='categorical_crossentropy',
2             optimizer='adam',
3             metrics=['accuracy'])

模型训练

训练模型时,Batch Size设为64,Epoch设为10。

1model.fit(x_train,
2         y_train,
3         batch_size=64,
4         epochs=10,
5         validation_data=(x_valid, y_valid),
6         callbacks=[checkpointer])

测试性能

训练得到的模型在测试集上的准确率超过了90%。

1# Evaluate the model on test set
2score = model.evaluate(x_test, y_test, verbose=0)
3# Print test accuracy
4print('\n', 'Test accuracy:', score[1])

预测可视化

我们通过datasetmodel.predict(x_test)函数,用训练好的模型对测试集进行预测并可视化预测结果。当标签为红色,则说明预测错误;当标签为绿色,则说明预测正确。下图为15个测试样本的预测结果。

相关链接

最后,在这篇普通的入门教程基础上,还有一些提升之路:

如果想深入了解本文使用的Google Colab,可以看这份官方介绍:
https://medium.com/tensorflow/colab-an-easy-way-to-learn-and-use-tensorflow-d74d1686e309

如果你是深度学习初学者,MNIST也应该了解一下。之前TensorFlow有一篇MNIST教程,可以拿来和本文比较一下,你就会发现,深度学习现在已经变得简单了很多:
https://www.tensorflow.org/versions/r1.1/get_started/mnist/beginners

本文用到的是Keras里的序贯模型,如果对功能函数感兴趣,可查看这篇用Keras功能函数和TensorFlow来预测葡萄酒价格的博文:
https://medium.com/tensorflow/predicting-the-price-of-wine-with-the-keras-functional-api-and-tensorflow-a95d1c2c1b03

诚挚招聘

量子位正在招募编辑/记者,工作地点在北京中关村。期待有才气、有热情的同学加入我们!相关细节,请在量子位公众号(QbitAI)对话界面,回复“招聘”两个字。

量子位 QbitAI · 头条号签约作者

վ'ᴗ' ի 追踪AI技术和产品新动态


登录查看更多
0

相关内容

FashionMNIST 是一个替代 MNIST 手写数字集的图像数据集。 它是由 Zalando(一家德国的时尚科技公司)旗下的研究部门提供。其涵盖了来自 10 种类别的共 7 万个不同商品的正面图片。FashionMNIST 的大小、格式和训练集/测试集划分与原始的 MNIST 完全一致。60000/10000 的训练测试数据划分,28x28 的灰度图片。你可以直接用它来测试你的机器学习和深度学习算法性能,且不需要改动任何的代码。
【干货】用BRET进行多标签文本分类(附代码)
专知会员服务
84+阅读 · 2019年12月27日
【书籍】深度学习框架:PyTorch入门与实践(附代码)
专知会员服务
163+阅读 · 2019年10月28日
Keras作者François Chollet推荐的开源图像搜索引擎项目Sis
专知会员服务
29+阅读 · 2019年10月17日
TensorFlow 2.0 学习资源汇总
专知会员服务
66+阅读 · 2019年10月9日
初学者的 Keras:实现卷积神经网络
Python程序员
24+阅读 · 2019年9月8日
100行Python代码,轻松搞定神经网络
大数据文摘
4+阅读 · 2019年5月2日
手把手教你用Python库Keras做预测(附代码)
数据派THU
14+阅读 · 2018年5月30日
[机器学习] 用KNN识别MNIST手写字符实战
机器学习和数学
4+阅读 · 2018年5月13日
ResNet告诉我,我是不是世界上最美的人?
大数据文摘
7+阅读 · 2018年4月24日
一个小例子带你轻松Keras图像分类入门
云栖社区
4+阅读 · 2018年1月24日
用深度学习keras的cnn做图像识别分类,准确率达97%
数据挖掘入门与实战
4+阅读 · 2017年12月17日
手把手教TensorFlow(附代码)
深度学习世界
15+阅读 · 2017年10月17日
Arxiv
8+阅读 · 2018年11月21日
Implicit Maximum Likelihood Estimation
Arxiv
7+阅读 · 2018年9月24日
Adversarial Reprogramming of Neural Networks
Arxiv
3+阅读 · 2018年6月28日
Arxiv
7+阅读 · 2018年3月22日
Arxiv
7+阅读 · 2018年1月24日
VIP会员
相关资讯
初学者的 Keras:实现卷积神经网络
Python程序员
24+阅读 · 2019年9月8日
100行Python代码,轻松搞定神经网络
大数据文摘
4+阅读 · 2019年5月2日
手把手教你用Python库Keras做预测(附代码)
数据派THU
14+阅读 · 2018年5月30日
[机器学习] 用KNN识别MNIST手写字符实战
机器学习和数学
4+阅读 · 2018年5月13日
ResNet告诉我,我是不是世界上最美的人?
大数据文摘
7+阅读 · 2018年4月24日
一个小例子带你轻松Keras图像分类入门
云栖社区
4+阅读 · 2018年1月24日
用深度学习keras的cnn做图像识别分类,准确率达97%
数据挖掘入门与实战
4+阅读 · 2017年12月17日
手把手教TensorFlow(附代码)
深度学习世界
15+阅读 · 2017年10月17日
相关论文
Arxiv
8+阅读 · 2018年11月21日
Implicit Maximum Likelihood Estimation
Arxiv
7+阅读 · 2018年9月24日
Adversarial Reprogramming of Neural Networks
Arxiv
3+阅读 · 2018年6月28日
Arxiv
7+阅读 · 2018年3月22日
Arxiv
7+阅读 · 2018年1月24日
Top
微信扫码咨询专知VIP会员