TensorFlow2.0学习(二)BasicClassify

之前的helloworld用的是mnist作为数据集,今天真正意义上的第一个tf2.0程序,用得是官方准备的服装数据集。https://tensorflow.google.cn/tutorials/keras/basic_classification

from __future__ import absolute_import, division, print_function, unicode_literals

# 导入TensorFlow和tf.keras
import tensorflow as tf
from tensorflow import keras

# 导入辅助库
import numpy as np
import matplotlib.pyplot as plt

代码使用Fashion MNIST 数据集,其中包含了10个类别中共70,000张灰度图像。图像包含了低分辨率(28 x 28像素)的单个服装物品。

代码使用60,000张图像来训练网络和10,000张图像来训练和测试模型。导入图片集代码如下:

fashion_mnist = keras.datasets.fashion_mnist

(train_images, train_labels), (test_images, test_labels) = fashion_mnist.load_data()

train_images和train_labels是训练用数据,其后两个是测试数据。

图像是28x28 NumPy数组,像素值介于0到255之间。labels是一个整数数组,数值介于0到9之间。这对应了图像所代表的服装的类别。

把图像的类别存储下来备用:

class_names = ['T-shirt/top', 'Trouser', 'Pullover', 'Dress', 'Coat',
               'Sandal', 'Shirt', 'Sneaker', 'Bag', 'Ankle boot']

数据预处理(不能不说大厂就是机智,还搞预处理):

plt.figure()
plt.imshow(train_images[0])
plt.colorbar()
plt.grid(False)
plt.show()

我们把训练集的第一张图片拿出来看一下,结果如下:

png

我们可以看到,图片的灰度值是在0到255之间,这会减慢梯度下降法的运行速度,所以我们把灰度值除以255来加速(否则连准确率都会受到很大的影响,大概就是不归一化的话,正确率十分之一,和猜没有区别):

train_images = train_images / 255.0  # 不过这种语法确实神奇

test_images = test_images / 255.0

显示前25张图片及其label,确定我们的读入没有问题:

plt.figure(figsize=(10,10))
for i in range(25):
    plt.subplot(5,5,i+1)  # 将画图划分出5*5的区域
    plt.xticks([])  # x坐标轴设为空,即不显示
    plt.yticks([])
    plt.grid(False)
    plt.imshow(train_images[i], cmap=plt.cm.binary)
    plt.xlabel(class_names[train_labels[i]])
plt.show()

接下来我们开始构建模型

model = keras.Sequential([
    keras.layers.Flatten(input_shape=(28, 28)),
    keras.layers.Dense(128, activation=tf.nn.relu),
    keras.layers.Dense(10, activation=tf.nn.softmax)
])

网络中的第一层 tf.keras.layers.Flatten 将图像格式从一个二维数组(包含着28x28个像素)转换成为一个包含着28 * 28 = 784个像素的一维数组。可以将这个网络层视为它将图像中未堆叠的像素排列在一起。这个网络层没有需要学习的参数;它仅仅对数据进行格式化。

在像素被展平之后,网络由一个包含有两个tf.keras.layers.Dense网络层的序列组成。他们被称作稠密链接层或全连接层。 第一个Dense网络层包含有128个节点(或被称为神经元)。第二个(也是最后一个)网络层是一个包含10个节点的softmax层—它将返回包含10个概率分数的数组,总和为1。每个节点包含一个分数,表示当前图像属于10个类别之一的概率。

编译模型:

通过编译,我们可以设定训练的以下属性:

  • 损失函数 —这可以衡量模型在培训过程中的准确程度。 我们希望将此函数最小化以"驱使"模型朝正确的方向拟合。
  • 优化器 —这就是模型根据它看到的数据及其损失函数进行更新的方式。
  • 评价方式 —用于监控训练和测试步骤。以下示例使用准确率(accuracy),即正确分类的图像的分数。

训练模型:

1.将训练数据提供给模型 - 在本案例中,他们是train_imagestrain_labels数组。

2.模型学习如何将图像与其标签关联

3.使用模型对测试集进行预测, 在本案例中为test_images数组。我们验证预测结果是否匹配test_labels数组中保存的标签。

通过调用model.fit方法来训练模型 — 模型对训练数据进行"拟合":

model.fit(train_images, train_labels, epochs=5)

接着,我们可以测试模型

test_loss, test_acc = model.evaluate(test_images, test_labels)

print('Test accuracy:', test_acc)

最后,我们还可以通过训练好的模型对某几张我们感兴趣的图片进行预测:

predictions = model.predict(test_images)

需要注意的是,单张图片的格式为[28, 28],所以我们如果想单独测试一张网上找到的照片,需要把它存成一个序列:

img = test_images[0]
img = (np.expand_dims(img,0))

predictions_single = model.predict(img)
print(predictions_single)

prediction_result = np.argmax(predictions_single[0])  # 用argmax获得更直观的结果
print(prediction_result)

最后的测试效果还可以吧:

   32/10000 [..............................] - ETA: 9s - loss: 0.2578 - accuracy: 0.9375
  800/10000 [=>............................] - ETA: 0s - loss: 0.3455 - accuracy: 0.8838
 1696/10000 [====>.........................] - ETA: 0s - loss: 0.3303 - accuracy: 0.8774
 2592/10000 [======>.......................] - ETA: 0s - loss: 0.3262 - accuracy: 0.8789
 3552/10000 [=========>....................] - ETA: 0s - loss: 0.3477 - accuracy: 0.8727
 4384/10000 [============>.................] - ETA: 0s - loss: 0.3481 - accuracy: 0.8716
 5248/10000 [==============>...............] - ETA: 0s - loss: 0.3513 - accuracy: 0.8723
 6208/10000 [=================>............] - ETA: 0s - loss: 0.3555 - accuracy: 0.8711
 7168/10000 [====================>.........] - ETA: 0s - loss: 0.3531 - accuracy: 0.8723
 8032/10000 [=======================>......] - ETA: 0s - loss: 0.3462 - accuracy: 0.8748
 8960/10000 [=========================>....] - ETA: 0s - loss: 0.3491 - accuracy: 0.8740
 9888/10000 [============================>.] - ETA: 0s - loss: 0.3451 - accuracy: 0.8749
10000/10000 [==============================] - 1s 65us/sample - loss: 0.3450 - accuracy: 0.8749
Test accuracy: 0.8749

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值