TensorFlow:分类任务

任务1:手写数字的识别任务(分类)

基于mnist数据集开展的手写数字识别任务,本质上是一个分类任务

说明

每个图像都是28*28*1的矩阵(大小为28*28,灰度图,色彩为1),那么该图像的特征就是784,相当于输入784个数据

 

①读取数据集

数据下载:

链接:https://pan.baidu.com/s/1XUHsGVgD9wP5d21k5xq18w?pwd=cpxg
提取码:cpxg

复制代码
%matplotlib inline

from pathlib import Path

DATA_PATH=Path('data')
PATH=DATA_PATH/'mnist'FILENAME='mnist.pkl.gz'
import pickle
import gzip
with gzip.open((PATH/FILENAME).as_posix(),'rb')as f:
    ((x_train,y_train),(x_valid,y_valid),_)=pickle.load(f,encoding='latin-1')
复制代码

显示

import matplotlib.pyplot as plt
import numpy as np
plt.imshow(x_train[0].reshape((28,28)),cmap='gray')
print(x_train.shape)
(50000, 784)

②搭建网络模型

复制代码
import tensorflow as tf
from tensorflow.keras import layers

model=tf.keras.Sequential()
model.add(layers.Dense(32,activation='relu'))
model.add(layers.Dense(32,activation='relu'))

#回归问题,最后得到某个值,所以得到一个结果
#分类问题,最后得到所有类别的概率值,结果数应该与类别数相同
model.add(layers.Dense(10,activation='softmax'))
复制代码

不同损失函数,训练的效果也不同,谨慎分析和选取

③配置优化器和损失函数

model.compile(optimizer=tf.keras.optimizers.Adam(0.001),
             loss=tf.keras.losses.SparseCategoricalCrossentropy(),
             metrics=[tf.keras.metrics.SparseCategoricalAccuracy()])

④训练

model.fit(x_train,y_train,epochs=5,batch_size=64,validation_data=(x_valid,y_valid))

⑤预测

 

 

任务2、服装图像识别任务

基于fashion-mnist数据集进行的分类任务,目的是将各种服装图像分到指定类别中。

①读取数据集

#直接从网络下载
from tensorflow import keras
fashion_mnist=keras.datasets.fashion_mnist
(train_images,train_labels),(test_images,test_lables)=fashion_mnist.load_data()

这里给出网盘资源:

链接:https://pan.baidu.com/s/1wicIfuZ_-vXDl4OMu_oGcQ?pwd=86gd
提取码:86gd

图片的属性

复制代码
#类别
class_names=['T-shirt/top','Trouser','Pullover','Dress',
        'Coat','Sandal','Shirt','Sneaker','Bag','Ankle boot']

#训练集图片的个数和大小
train_images.shape
(60000, 28, 28)

#训练集标签个数
len(train_labels)
60000

#测试集图片的个数和大小
test_images.shape
(10000, 28, 28)
复制代码

显示

import matplotlib.pyplot as plt
plt.figure()
plt.imshow(train_images[0])
plt.colorbar()
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.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')
])#第一层Flatten的作用是,将图片由二维变成一维,展平


model.compile(optimizer='adam',loss='sparse_categorical_crossentropy',
        metrics=['accuracy'])
复制代码

③训练神经网络

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

④评估模型优劣

test_labels=test_lables
test_loss,test_acc=model.evaluate(test_images,test_labels,verbose=2)
print('\nTest Accuracy:',test_acc)

313/313 - 1s - loss: 0.3343 - accuracy: 0.8857 - 1s/epoch - 4ms/step

Test Accuracy: 0.885699987411499

⑤预测

predictions=model.predict(test_images)

预测结果的大小

复制代码
#预测结果的大小,10000指预测对象的大小,10指每个分类的得分
predictions.shape
(10000, 10)

#预测集中第一个图片的预测结果,array中存放各类的得分
predictions[0]
array([7.3799254e-07, 2.4234815e-08, 8.2334903e-09, 2.1089032e-10,
       1.2211213e-07, 5.2809822e-03, 1.3404284e-07, 2.1948023e-02,
       1.0496128e-07, 9.7276986e-01], dtype=float32)
复制代码

预测结果可视化

1)编写两个用于将预测结果可视化的函数plot_image、plot_value_array

复制代码
#四个参数i,predictions_array,true_label,img
#i:第几幅图像的预测
#predictions_array:该图像进行预测后各个分类的得分array
#true_label:所有的标签
#img:所有的图像

#plot_image的目的,绘制出参与预测的图像,标记出最高得分和实际分类
def plot_image(i,predictions_array,true_label,img):
    predictions_array,true_label,img=predictions_array,true_label[i],img[i]
    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)
    
#plot_value_array的目的,绘制该参与预测的图像的各个类别得分柱状图
def plot_value_array(i,predictions_array,true_label):
    predictions_array,true_label=predictions_array,true_label[i]
    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')
复制代码

2)先看看几幅图像的预测结果

前一幅是正确分类,后一幅是错误分类。

i=0
plt.figure(figsize=(6,3))
plt.subplot(1,2,1)
plot_image(i,predictions[i],test_labels,test_images)
plt.subplot(1,2,2)
plot_value_array(i,predictions[i],test_labels)
plt.show()

i=12
plt.figure(figsize=(6,3))
plt.subplot(1,2,1)
plot_image(i,predictions[i],test_labels,test_images)
plt.subplot(1,2,2)
plot_value_array(i,predictions[i],test_labels)
plt.show()

 

 

⑥训练模型的保存与加载

保存网络模型

复制代码
#保存模型
model.save('fashion_model.h5')

#加载模型
model=keras.models.load_model('fashion_model.h5')

#保存为json文件
config=model.to_json()
#写入Json文件中
with open('config.json','w') as f:
    f.write(config)
复制代码

 

从Json中读取网络信息

import json
with open('config.json','r') as f:
    json_config=f.read()
#从Json中读取网络信息
model=keras.models.model_from_json(json_config)
model.summary()

 

 

权重参数的保存与读取

#获取权重
weights=model.get_weights()

#保存权重
model.save_weights('weight.h5')

#加载权重
model.load_weights('weight.h5')

 

⑦加载之前的模型并用于预测

1)加载模型

import tensorflow as tf
from tensorflow.keras import layers
from tensorflow import keras
model=keras.models.load_model('fashion_model.h5')

2)加载数据

fashaion_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

3)预测与显示

复制代码
predictions=model.predict(test_images)
predictions.shape

rows=5
cols=3
num_images=rows*cols
plt.figure(figsize=(2*2*cols,2*rows))
for i in range(num_images):
    plt.subplot(rows,2*cols,2*i+1)
    plot_image(i,predictions[i],test_labels,test_images)
    plt.subplot(rows,2*cols,2*i+2)
    plot_value_array(i,predictions[i],test_labels)
plt.tight_layout()
plt.show()
复制代码

 

posted @   ShineLe  阅读(97)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
点击右上角即可分享
微信分享提示