TensorFlow 学习(六)时尚(衣服、鞋、包等) Fashion MNIST识别

使用 jupyter notebook 笔记,导入需要的包

# TensorFlow and tf.keras
import tensorflow as tf
from tensorflow import keras

import numpy as np

import numpy as np
import matplotlib.pyplot as plt
import gzip
import os
import matplotlib

使用Fashion MNIST数据集,其中包含10个类别的70000个灰度图像。如图所示,这些图片显示的是每件衣服的低分辨率(28×28像素)

Fashion MNIST的目标是作为经典MNIST数据的替换——通常被用作计算机视觉机器学习程序的“Hello, World”。MNIST数据集包含手写数字(0,1,2等)的图像,格式与我们将在这里使用的衣服相同

使用了时尚MNIST的多样性,因为它是一个比常规MNIST稍微更具挑战性的问题。这两个数据集都相对较小,用于验证算法是否按预期工作。它们是测试和调试代码的好起点

我们将使用6万张图片来训练网络和1万张图片来评估网络对图片的分类有多精确。

准备好数据集

因为数据集需要科学上网才能下载,所以可以先下载下来地址:Fashion MNIST数据集
主要下载下面四个压缩文件和中文字体,  'train-labels-idx1-ubyte.gz',  'train-images-idx3-ubyte.gz',  't10k-labels-idx1-ubyte.gz', 't10k-images-idx3-ubyte.gz' 和中文字体 'SimHei-windows.ttf '。

# 下载中文支持字体。后面画图需要
zhfont = matplotlib.font_manager.FontProperties(fname='./fashion_mnist_data/SimHei-windows.ttf')


# 解析解压得到四个训练的数据
def read_data():
    files = [
      'train-labels-idx1-ubyte.gz', 'train-images-idx3-ubyte.gz',
      't10k-labels-idx1-ubyte.gz', 't10k-images-idx3-ubyte.gz'
    ]
    # 我在当前的目录下创建文件夹,里面放入上面的四个压缩文件
    current = './fashion_mnist_data'
    paths = []
    for i in range(len(files)):
         paths.append('./fashion_mnist_data/'+ files[i])
    
    with gzip.open(paths[0], 'rb') as lbpath:
        y_train = np.frombuffer(lbpath.read(), np.uint8, offset=8)

    with gzip.open(paths[1], 'rb') as imgpath:
        x_train = np.frombuffer(
            imgpath.read(), np.uint8, offset=16).reshape(len(y_train), 28, 28)

    with gzip.open(paths[2], 'rb') as lbpath:
        y_test = np.frombuffer(lbpath.read(), np.uint8, offset=8)

    with gzip.open(paths[3], 'rb') as imgpath:
        x_test = np.frombuffer(
            imgpath.read(), np.uint8, offset=16).reshape(len(y_test), 28, 28)
        
    return (x_train, y_train), (x_test, y_test)

读取数据

# 分别得到训练数据集和测试数据集
(train_images, train_labels), (test_images, test_labels) = read_data()

这些图像是28x28的NumPy数组,像素值在0到255之间。标签是一个整数数组,范围从0到9。这些与形象所代表的服装类别相对应                        

标签 所代表的意思
0 短袖圆领T恤
1 裤子
2 套衫
3 连衣裙
4 外套
5 凉鞋
6 衬衫
7 运动鞋
8
9 短靴

每个图像映射到一个标签。由于类名不包含在数据集中,因此将它们存储在这里,方便后面绘制图像时使用

class_names = ['短袖圆领T恤', '裤子', '套衫', '连衣裙', '外套',
              '凉鞋', '衬衫', '运动鞋','包', '短靴']

在训练之前,必须对数据进行预处理。如果查看训练集中的第一张图像,可以看到像素值在0到255之间,可以尝试画出来

# 创建一个新图形
plt.figure()

# 显示一张图片在二维的数据上 train_images[0] 第一张图
plt.imshow(train_images[0])

# 在图中添加颜色条
plt.colorbar()

# 是否显示网格线条,True: 显示,False: 不显示
plt.grid(False)

在jupyter notebook 运行得出结果鞋子:

但是在给神经网络模型提供数据之前,我们需要将这些值缩放到0到1的范围。为此,将图像组件的数据类型从整数转换为浮点数,并除以255。这才是预处理图像的函数

# 训练图像缩放255,在0 和 1 的范围
train_images = train_images / 255.0

# 测试图像缩放
test_images = test_images / 255.0

显示来自训练集的前25个图像,并在每个图像下面显示类名。验证数据的格式是否正确,我们准备构建和训练网络。

# 保存画布的图形,宽度为 10 , 长度为10
plt.figure(figsize=(10,10))

# 显示训练集的 25 张图像
for i in range(25):
    # 创建分布 5 * 5 个图形
    plt.subplot(5, 5, i+1)
    plt.xticks([])
    plt.yticks([])
    plt.grid(False)
    # 显示照片,以cm 为单位。
    plt.imshow(train_images[i], cmap=plt.cm.binary)

    # 此处就引用到上面的中文字体,显示指定中文,对应下方的图片意思,以证明是否正确
    plt.xlabel(class_names[train_labels[i]], fontproperties = zhfont)

运行结果:

建立模型

当像素处理后,神经网络由两个 tf.keras.layer 序列组成。致密层。它们是紧密相连的,或者说完全相连的神经层。第一个致密层有128个节点(或神经元)。第二个(也是最后一个)层是10个节点的 softmax 层——它返回一个10个概率分数的数组,其和为1。每个节点包含一个分数,表示当前图像属于这10个类之一的概率。

# 建立模型
def build_model():
    # 线性叠加
    model = tf.keras.models.Sequential()
    # 改变平缓输入 
    model.add(tf.keras.layers.Flatten(input_shape=(28, 28)))
    # 第一层紧密连接128神经元
    model.add(tf.keras.layers.Dense(128, activation=tf.nn.relu))
    # 第二层分10 个类别
    model.add(tf.keras.layers.Dense(10, activation=tf.nn.softmax))
    return model

编译模型

# 编译模型
model = build_model()
model.compile(optimizer=tf.train.AdamOptimizer(), 
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])
  • optimizer:   模型如何更新基于它看到的数据和它的损失函数。tf.train.AdamOptimizer(), 使用Adam梯度下降优化方法,降低损失。
  • loss : 用来测量模型在训练过程中的精确度。最小化这个函数来“引导”模型向正确的方向。‘sparse_categorical_crossentropy’ : 稀疏多分类交叉熵损失。
  • metrics: 用于监视培训和测试步骤。使用了 'accuracy',精确分类的图像的比例。

API接口描述

compile(self,

        optimizer,

        loss=None,

        metrics=None,
 
        loss_weights=None,

        sample_weight_mode=None,

        weighted_metrics=None,

        target_tensors=None,

        distribute=None,

        **kwargs):

作用:配置参数,主要用于训练的模型

参数描述:

  • optimizer: optimizer的名称字符串,或者optimizer的类。
  • loss: 损失目标函数的名称字符串,或者目标函数
  • metrics: 模型评估的指标列表,在评估训练和测试模型。一般 metrics = ['accuracy']
  • loss_weights: 标量的列表或字典,系数(Python 浮点数)衡量不同模型的损失权重。
  • sample_weight_mode: 样品权重模式
  • weighted_metrics: 训练和测试模型期间,将根据样本权重或类权重进行评估和加权的指标列表
  • target_tensors: keras为模型的目标值创建占位符,在训练期间,fed目标数据。
  • distribute: 我们想要用来分发模型训练(DistributionStrategy实例类)
  • **kwargs: 这些参数转递给会话 'tf.Session.run'

训练模型

# 训练模型
model.fit(train_images, train_labels, epochs=5)

6000份训练集分 5 批次,依次训练。图像目标值:train_images,  标签:train_labels

运行结果:下面损失和精度指标显示。该模型对训练数据的准确率约为0.89 (89%)

该API接口参数描述

参数

fit (self,

    x=None,

    y=None,

    batch_size=None,

    epochs=1,

    verbose=1,

    callbacks=None,

    validation_split=0.,

    validation_data=None,

    shuffle=True,

    class_weight=None,

    sample_weight=None,

    initial_epoch=0,

    steps_per_epoch=None,

    validation_steps=None,

    max_queue_size=10,

    workers=1,

    use_multiprocessing=False,

    **kwargs):

作用:指定数量次数迭代(数据集依次迭代)训练模型
主要介绍下面部分参数:

  • x: 输入数据,特征
  • y: 目标数据,标签
  • batch_size: 每次梯度更新的样本数量大小
  • epochs: 训练模型的次数
  • verbose: 冗长的模式, 0,1,或者 2; 0表示无,1表示进度显示, 2表示每次一行
  • callbacks: 'keras.callbacks.Callback'的类,训练模型时的回调函数列表

 

评估模型

比较测试集与训练集这两个的情况,是否会出现过拟合或者欠拟合的情况

# 评估模型(主要是测试数据集)
test_loss, test_acc = model.evaluate(test_images, test_labels)

print('测试损失:%f 测试准确率: %f' % (test_loss, test_acc))

运行结果:

可以从上面训练模型中的训练数据集的损失为 0.2967, 准确率约为 89%。

这里的测试数据集的损失为 0.3536, 准确率约为 87%

可以看出,测试数据集的准确率略低于训练数据集的准确率。

它们之间的差距就是过度拟合的一个例子。过度拟合是指机器学习模型在新数据上的表现不如在训练数据上的表现。

API接口描述:

evaluate( self,

         x=None,

         y=None,

         batch_size=None,

         verbose=1,

         sample_weight=None,

         steps=None,

         max_queue_size=10,

         workers=1,

         use_multiprocessing=False):

作用:返回模型下的测试数据集的损失值和准确率,评估模型
主要介绍下面部分参数:

  • x: 测试特征数据集
  • y: 测试标签数据集
  • batch_size:  每次梯度更新的样本数量大小
  • verbose: 冗长的模式, 0,1,或者 2; 0表示无,1表示进度显示, 2表示每次一行
  • sample_weight: 测试样本权重的numpy数组
  • steps: 步长总数

 

使用模型做预测

predictions = model.predict(test_images)
# 提取20个数据集,进行预测判断是否正确
for i in range(25):
    pre = class_names[np.argmax(predictions[i])]
    tar = class_names[test_labels[i]]
    print("预测:%s   实际:%s" % (pre, tar))

运行结果:可以看出25个数据中,有三个预测出现错误了。较少的出错概率

也可以画图出来

# 保存画布的图形,宽度为 10 , 长度为10
plt.figure(figsize=(10,10))

# 预测 25 张图像是否准确,不准确为红色。准确为蓝色
for i in range(25):
    # 创建分布 5 * 5 个图形
    plt.subplot(5, 5, i+1)
    plt.xticks([])
    plt.yticks([])
    plt.grid(False)
    # 显示照片,以cm 为单位。
    plt.imshow(test_images[i], cmap=plt.cm.binary)
    
    # 预测的图片是否正确,黑色底表示预测正确,红色底表示预测失败
    predicted_label = np.argmax(predictions[i])
    true_label = test_labels[i]
    if predicted_label == true_label:
        color = 'black'
    else:
        color = 'red'
    plt.xlabel("{} ({})".format(class_names[predicted_label],
                                class_names[true_label]),
                                color=color,
                                fontproperties = zhfont)
plt.show()

运行结果:黑色底表示预测正确,红色底表示预测失败

发布了30 篇原创文章 · 获赞 14 · 访问量 1万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览