关于tensorflow2.0的注意事项以及使用cnn完成Fashion MNIST分类的demo

引言

提到tensorflow2.0,我不知道读者最先想到的是什么,我最先想到的是——”版本“,没错,就是版本,tensorflow2.0相比1.x版本有非常大的变化,加上python是一个版本并不兼容的环境(即使是3.5和3.7,也会有部分不兼容),这给许多初学者和环境搭建以及mnist的cnn测试造成了很多困难,这里我想和大家有一个直观的解释。

tensorflow2.0

开始之前,我必须提前与读者说明,也是希望初学者应该牢牢记住的几点:

(1)程序报错的时候不要急着去问,先看看红色报错英文的意思,在调试显得越来越重要的时代,编译器给出的error解释其实是非常详细的。

(2)当你遇到几下一个surprise的时候(我凭记忆写的,可能不是很相符,但大概意思差不多)
AttributeError: module ‘tensorflow’ has no attribute ‘Session’

ImportError:can not find moudle six/numpy

RuntimeError: implement_array_function method already has a docstring
如果你确实安装了但是还是有以上之类的错误,不要怀疑,一定是版本问题。版本与代码的不匹配,不同包之间版本的不匹配,python与不同库的不匹配是最直接的原因。

(3)最好的各种测试代码一定是tensorflow官网上的测试代码,学会看官方文档,这,很重要。

(4)不要一直尝试绿色的三角符号,有时候terminal终端调试其实更简洁,也更高效。

(5)当网上最新版的代码很少很难运行成功时,尝试安装低版本的tensorflow和Python是一个不错的解决方法,

(6)pip install之类的命令有问题时,学会从镜像源,具体包在硬盘中的存储位置看错误问题,记住常用的终端命令,另外,不要怀疑编译器会出错,一定是自己的配置问题。

(7)实在不行时,与其从网上查找各种杂七乱八的问题解决方法,重启,删除,重装是更有效率的方式。因为,很多时候,每台计算机的问题都是不同的,你并不一定能从csdn找到解决方法。

Fashion MNIST

FashionMNIST 是一个替代 MNIST 手写数字集的图像数据集。它是由 Zalando(一家德国的时尚科技公司)旗下的研究部门提供。其涵盖了来自 10 种类别的共 7 万个不同商品的正面图片。其中包含 60000 个训练样本和 10000 个测试样本,其中的样本都来自日常穿着的衣裤鞋包,每个都是 28×28 的灰度图像,每张图像都有各自的标签。
在这里插入图片描述
关于这个数据集的介绍网上有很多,这里也不过多叙述

CNN Fashion MNIST demo

注:这其实是tensorflow上的一个官方示例:
https://tensorflow.google.cn/tutorials/keras/classification/

使用tensorflow.keras(高级API)在TensorFlow中构建和训练模型。
(1)搭建tensorflow+keras框架,这里不再介绍,网上有很多不错的教程,但一定要记住:大道至简,最好的教程一定不是最复杂的,搭建完成后,通过如下代码进行测试:

import tensorflow as tf
from tensorflow import keras

import numpy as np
import matplotlib.pyplot as plt

print(tf.version)
得到输出结果2.0.0,可以看到框架搭建完成(这里要特别注意版本和代码的匹配问题)
(2)导入Fashion MNIST数据集
数据集可以从地址中下载成文件,也可以在tensorflow的dataset数据包中导入:
fashion_mnist = keras.datasets.fashion_mnist

(train_images, train_labels), (test_images, test_labels) = fashion_mnist.load_data()
可以从运行框中看到数据从地址中进行加载,最后返回四个NumPy数组
train_images,train_labels,test_images,test_labels
每个图像都映射到一个标签。由于类名不包含在数据集中,因此将它们存储在此处以供以后在绘制图像时使用:
class_names = [‘T-shirt/top’, ‘Trouser’, ‘Pullover’, ‘Dress’, ‘Coat’,
‘Sandal’, ‘Shirt’, ‘Sneaker’, ‘Bag’, ‘Ankle boot’]
(3)检查四个NumPy数组,并观察数据集的一些性质:
在这里插入图片描述显示了训练集中有60,000张图像,每张图像表示为28 x 28像素:
在这里插入图片描述训练集中有60,000个标签
在这里插入图片描述每个标签都是0到9之间的整数
测试集也是相同情况,这里不再赘述。
(4)预处理数据
在训练网络之前,必须对数据进行预处理。如果检查训练集中的第一张图像,您将看到像素值落在0到255的范围内,在将它们输入神经网络模型之前,将这些值缩放到0到1的范围。为此,将值除以255。以相同的方式预处理训练集和测试集非常重要。
train_images = train_images / 255.0

test_images = test_images / 255.0
处理后再看图像,可以看到图像变成了灰度图像:
在这里插入图片描述(5) 建立模型
 设置图层
神经网络的基本组成部分是层。图层从输入到其中的数据中提取表示。希望这些表示对于当前的问题有意义。
深度学习的大部分内容是将简单的层链接在一起。大多数层(利润tf.keras.layers.Dense)具有在训练期间学习的参数。
model = keras.Sequential([
keras.layers.Flatten(input_shape=(28, 28)),
keras.layers.Dense(128, activation=‘relu’),
keras.layers.Dense(10, activation=‘softmax’)
])
该网络的第一层tf.keras.layers.Flatten将图像的格式从二维数组(28 x 28像素)转换为一维数组(28 * 28 = 784像素)。可以将这一层看作是堆叠图像中的像素行并对齐它们。该层没有学习参数。它只会重新格式化数据。

像素变平后,网络由tf.keras.layers.Dense两层序列组成。这些是紧密连接或完全连接的神经层。第一Dense层有128个节点(或神经元)。第二层(也是最后一层)是一个10节点的softmax层,该层返回10个总和为1的概率分数的数组。每个节点都包含一个分数,该分数指示当前图像属于10个类别之一的概率。
 编译模型
在准备训练模型之前,需要进行一些其他设置。这些是在模型的编译步骤中添加的:
损失函数 -衡量训练期间模型的准确性。您希望最小化此功能,以在正确的方向上“引导”模型。
优化器 -这是基于模型看到的数据及其损失函数来更新模型的方式。
指标 -用于监视培训和测试步骤。以下示例使用precision,即正确分类的图像比例。
model.compile(optimizer=‘adam’,
loss=‘sparse_categorical_crossentropy’,
metrics=[‘accuracy’])
(6) 训练模型
要开始训练,请调用该model.fit方法,之所以这么称呼是因为该方法使模型“适合”训练数据:
model.fit(train_images, train_labels, epochs=10)
可以在运行区中显示的损失函数和准确性指标:
刚开始训练时可以看到准确率逐渐升高:
在这里插入图片描述趋于稳定后,可以看到有一个不错的准确率:
在这里插入图片描述(7) 评估准确性
接下来,比较模型在测试数据集上的表现:
test_loss, test_acc = model.evaluate(test_images, test_labels, verbose=2)

print(’\nTest accuracy:’, test_acc)
在这里插入图片描述事实证明,测试数据集的准确性略低于训练数据集的准确性。训练准确性和测试准确性之间的差距代表过度拟合。过度拟合是指机器学习模型在新的,以前看不见的输入上的表现比训练数据上的表现差的情况。
(8) 可视化
我们以图形方式查看完整的10个类预测。
首先让我们看一下第1张图片,预测和预测数组。正确的预测标签为蓝色,错误的预测标签为红色。该数字给出了预测标签的百分比(满分为100)。
在这里插入图片描述全部的预测正确率如下:
在这里插入图片描述可见大部分还是以非常高的预测准确率出现,只有一个的预测效果比较差。

附:完整代码:

from __future__ import absolute_import, division, print_function, unicode_literals

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

# Helper libraries
import numpy as np
import matplotlib.pyplot as plt

print(tf.__version__)
fashion_mnist = keras.datasets.fashion_mnist

(train_images, train_labels), (test_images, test_labels) = fashion_mnist.load_data()
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()
train_images = train_images / 255.0

test_images = test_images / 255.0
plt.figure(figsize=(10,10))
for i in range(25):
    plt.subplot(5,5,i+1)
    plt.xticks([])
    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='relu'),
    keras.layers.Dense(10, activation='softmax')
])
model.compile(optimizer='adam',
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])
model.fit(train_images, train_labels, epochs=10)
test_loss, test_acc = model.evaluate(test_images,  test_labels, verbose=2)

print('\nTest accuracy:', test_acc)
predictions = model.predict(test_images)
def plot_image(i, predictions_array, true_label, img):
  predictions_array, true_label, img = predictions_array, true_label[i], img[i]
  plt.grid(False)
  plt.xticks([])
  plt.yticks([])

  plt.imshow(img, cmap=plt.cm.binary)

  predicted_label = np.argmax(predictions_array)
  if predicted_label == true_label:
    color = 'blue'
  else:
    color = 'red'

  plt.xlabel("{} {:2.0f}% ({})".format(class_names[predicted_label],
                                100*np.max(predictions_array),
                                class_names[true_label]),
                                color=color)

def plot_value_array(i, predictions_array, true_label):
  predictions_array, true_label = predictions_array, true_label[i]
  plt.grid(False)
  plt.xticks(range(10))
  plt.yticks([])
  thisplot = plt.bar(range(10), predictions_array, color="#777777")
  plt.ylim([0, 1])
  predicted_label = np.argmax(predictions_array)

  thisplot[predicted_label].set_color('red')
  thisplot[true_label].set_color('blue')

# Plot the first X test images, their predicted labels, and the true labels.
# Color correct predictions in blue and incorrect predictions in red.
num_rows = 5
num_cols = 3
num_images = num_rows*num_cols
plt.figure(figsize=(2*2*num_cols, 2*num_rows))
for i in range(num_images):
  plt.subplot(num_rows, 2*num_cols, 2*i+1)
  plot_image(i, predictions[i], test_labels, test_images)
  plt.subplot(num_rows, 2*num_cols, 2*i+2)
  plot_value_array(i, predictions[i], test_labels)
plt.tight_layout()
plt.show()

看完上面这么多,我想你能看到这份代码中最核心的部分,也是对结果影响最大的部分,就是神经网络层的搭建和选择每一层的内容:

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

我们可以尝试一个最简单的改变:

model = keras.Sequential([
    keras.layers.Flatten(input_shape=(28, 28)),
    keras.layers.Dense(256, activation='relu'),  # 隐藏层2
    keras.layers.Dense(128, activation='relu'),
    keras.layers.Dense(64, activation='relu'),
    keras.layers.Dense(32, activation='relu'),
    keras.layers.Dense(10, activation='softmax')
])

再次运行,我们可以看到一个略显提高的准确率:
10000/1 - 1s - loss: 0.2667 - accuracy: 0.8894
Test accuracy: 0.8894

当然,如果你对神经网络有一个更加深入的了解,可以自己修改模型每层的参数,自己增删网络,可能得到一个更好的准确率的结果。

未完待续!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章