本文基于tensorflow官网教程(https://tensorflow.google.cn/tutorials/keras/basic_classification),
配置环境为ubuntu14.04+tensorflow1.8.0+matplotlib
完整代码的github地址:https:///AnkangH/tensorflow/tree/classification_fashion_mnist

1.fashion-mnist数据集简介及显示

fashion_mnist数据集为不同衣服的图片,分为训练集和测试集,每个图片大小为28x28,标签为0-9,对应关系见下图:


tensorflow2 图片训练_tensorflow


完整代码:


#coding=utf-8


#指定中文注释字符编码


import tensorflow as tf


from tensorflow import keras


import numpy as np


#使用matplotlib画图


import matplotlib.pyplot as plt


#读取fashion_mnist数据集


#分为训练集数据+标签,测试集数据+标签


fashion_mnist=keras.datasets.fashion_mnist


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


#定义分类


#数据的标签为0-9的数字,对应不同的衣物种类


class_names = ['T-shirt/top', 'Trouser', 'Pullover', 'Dress', 'Coat',


               'Sandal', 'Shirt', 'Sneaker', 'Bag', 'Ankle boot']


#利用matplotlib画图


#将一个图像分为5x5,显示25张训练集图像并在下方显示其标签对应的分类


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()


tensorflow2 图片训练_tensorflow_02


2.神经网络模型

tensorflow1.8.0的keras模块对神经网络进行了封装,使用时只需要简单的代码指定神经网络的模型即可,主要分为三步:

建立模型→编译模型→训练模型

建立模型:指定输入输出层的参数以及隐藏层的个数和参数,如节点个数、层间节点的连接情况、激活函数

编译模型:指定网络训练的参数,如采用的优化器、损失函数和评价指标

训练模型:指定训练数据和训练阶段个数

代码如下:(包含上文中出现的包含语句和数据集载入语句)

#coding=utf-8

#指定中文注释字符编码

import tensorflow as tf

from tensorflow import keras

import numpy as np

#使用matplotlib画图

import matplotlib.pyplot as plt

#读取fashion_mnist数据集

#分为训练集数据+标签,测试集数据+标签

fashion_mnist=keras.datasets.fashion_mnist

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

#归一化处理,注意必须进行归一化操作,否则准确率非常低

train_images=train_images/255.0

test_images=test_images/255.0

#建立神经网络模型

#输入层-隐藏层(全连接层)-输出层(全连接层)

#输入层有28x28个节点

#隐藏层有128个节点,采用relu激活函数

#输出层有10个节点,采用softmax为激活函数,

#输出每张图片对应分类0-9的概率分布

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)

])

#编译神经网络模型

#指定损失函数,优化器和参数(评价器)

model.compile(optimizer=tf.train.AdamOptimizer(),

loss='sparse_categorical_crossentropy',

metrics=['accuracy'])

#训练模型

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

tensorflow2 图片训练_tensorflow_03


利用训练集训练完神经网络在训练集上的准确率在0.8左右

3.利用验证集测试神经网络准确度

在2部分代码的下方附加以下代码

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

print("Test accuracy:",test_acc)

tensorflow2 图片训练_神经网络_04


训练完的神经网络在测试集上的准确率为0.87

4.利用训练好的神经网络进行图像分类

经过第2步训练好的神经网络,可以对输入的图像进行分类预测,以测试集图像的第一张为例:

#利用训练好的神经网络进行图像分类预测

#对所有测试集图像进行分类预测

prediction=model.predict(test_images)

#显示测试集图像0的预测

print("prediction of test_images[0] ")

print(prediction[0])

#显示测试集图像0可能性最大的分类索引

print("argmax prediction of test_images[0]")

print(np.argmax(prediction[0]))

#显示测试集图像0可能性最大的分类

print("class of test_images[0]")

print(class_names[np.argmax(prediction[0])])

tensorflow2 图片训练_神经网络_05


这里测试集图像0,对应分类索引9即ankle boot的概率最大,即神经网络将图像0分类为ankle boot。

结合matplotlib,显示测试集的前25张图像的预测分类以及真实分类:

#对测试集前25张图像进行预测,显示其图像、神经网络对其

#的预测分类以及其真实分类

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(test_images[i],cmap=plt.cm.binary)

    #预测分类索引    

    predicted_label=np.argmax(prediction[i])

    #真实分类索引    

    true_label=test_labels[i]

    #预测和真实相同,绿色显示,否则红色显示    

    if predicted_label==true_label:

        color='green'

    else:

        color='red'

    plt.xlabel("{} ({})".format(class_names[predicted_label],

class_names[true_label]),color=color)

plt.show()

tensorflow2 图片训练_tensorflow2 图片训练_06


绿色部分为神经网络正确的分类,红色部分为错误的分类。