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()
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性