TensorFlow学习(六)时尚(⾐服、鞋、包
等)FashionMNIST识别
使⽤ 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万张图⽚来评估⽹络对图⽚的分类有多精确。
准备好数据集
因为数据集需要科学上⽹才能下载,所以可以先下载下来地址:
主要下载下⾯四个压缩⽂件和中⽂字体, '', '', '',
'' 和中⽂字体 'f '。
# 下载中⽂⽀持字体。后⾯画图需要
zhfont = matplotlib.font_manager.FontProperties(fname='./fashion_mnist_f')
# 解析解压得到四个训练的数据
def read_data():
files = [
'', '',
'', ''
]
# 我在当前的⽬录下创建⽂件夹,⾥⾯放⼊上⾯的四个压缩⽂件
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.ad(), np.uint8, offt=8)
with gzip.open(paths[1], 'rb') as imgpath:
x_train = np.frombuffer(
with gzip.open(paths[2], 'rb') as lbpath:
y_test = np.ad(), np.uint8, offt=8)
with gzip.open(paths[3], 'rb') as imgpath:
x_test = np.frombuffer(
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])
# 在图中添加颜⾊条
# 是否显⽰⽹格线条,True: 显⽰,Fal: 不显⽰
在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)
# 显⽰照⽚,以cm 为单位。
plt.imshow(train_images[i], binary)
# 此处就引⽤到上⾯的中⽂字体,显⽰指定中⽂,对应下⽅的图⽚意思,以证明是否正确
plt.xlabel(class_names[train_labels[i]], fontproperties = zhfont)
运⾏结果:
建⽴模型
当像素处理后,神经⽹络由两个 tf.keras.layer 序列组成。致密层。它们是紧密相连的,或者说完全相连的神经层。第⼀个致密层有128个节点(或神经元)。第⼆个(也是最后⼀个)层是10个节点的 softmax 层——它返回⼀个10个概率分数的数组,其和为1。每个节点包含⼀个分数,表⽰当前图像属于这10个类之⼀的概率。
# 建⽴模型
def build_model():
# 线性叠加
model = dels.Sequential()
# 改变平缓输⼊
model.add(tf.keras.layers.Flatten(input_shape=(28, 28)))
# 第⼀层紧密连接128神经元
model.add(tf.keras.layers.Den(128, lu))
# 第⼆层分10 个类别
model.add(tf.keras.layers.Den(10, softmax))
return model
编译模型
# 编译模型
model = build_model()
loss='spar_categorical_crosntropy',
metrics=['accuracy'])
optimizer: 模型如何更新基于它看到的数据和它的损失函数。tf.train.AdamOptimizer(), 使⽤Adam梯度下降优化⽅法,降低损失。
loss : ⽤来测量模型在训练过程中的精确度。最⼩化这个函数来“引导”模型向正确的⽅向。‘spar_categorical_crosntropy’: 稀疏多分类交叉熵损失。
metrics: ⽤于监视培训和测试步骤。使⽤了 'accuracy',精确分类的图像的⽐例。
API接⼝描述
compile(lf,
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%)