tensorflow学习笔记二——图像分类

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

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

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

完整代码:
#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()

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)

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

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

在2部分代码的下方附加以下代码
test_loss,test_acc=model.evaluate(test_images,test_labels)
print("Test accuracy:",test_acc)

训练完的神经网络在测试集上的准确率为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])])

这里测试集图像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()

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

猜你喜欢

转载自blog.csdn.net/weixin_39517996/article/details/81002231
今日推荐