首先,你已經(jīng)安裝好anaconda3、創(chuàng)建好環(huán)境、下載好TensorFlow2模塊并且下載好jupyter了,那么我們就直接打開(kāi)jupyter開(kāi)始進(jìn)行CIFAR10數(shù)據(jù)集的訓(xùn)練。
第一步:下載CIFAR10數(shù)據(jù)集
下載網(wǎng)址:http://www.cs.toronto.edu/~kriz/cifar-10-python.tar.gz
將數(shù)據(jù)集下載到合適的路徑,方便模型訓(xùn)練的時(shí)候調(diào)用
第二步:導(dǎo)入該導(dǎo)的庫(kù)
# tensorflow1.x
import tensorflow as tf
import numpy as np
import os
from matplotlib import pyplot as plt
第三步:加載剛剛下載的數(shù)據(jù)集,如果你下載了?cifar-10-python.tar.gz那么就先解壓這個(gè)壓縮包,將里面的文件放入一個(gè)文件夾,我這里放在為cifar-10-batches-py目錄下,所有文件如圖
?然后加載該數(shù)據(jù)集
import pickle
def unpickle(file):
with open(file, 'rb') as fo:
dict = pickle.load(fo, encoding='bytes')
return dict
def load_data(path):
# 讀取訓(xùn)練數(shù)據(jù)
train_images = []
train_labels = []
for i in range(1, 6):
file = path + "/data_batch_{}".format(i)
data = unpickle(file)
train_images.append(data[b"data"])
train_labels.append(data[b"labels"])
train_images = np.concatenate(train_images)
train_labels = np.concatenate(train_labels)
# 讀取測(cè)試數(shù)據(jù)
file = path + "/test_batch"
data = unpickle(file)
test_images = data[b"data"]
test_labels = np.array(data[b"labels"])
# 轉(zhuǎn)換數(shù)據(jù)類(lèi)型
train_images = train_images.astype(np.float32)
test_images = test_images.astype(np.float32)
y_train = np.array(train_labels)
y_test = np.array(test_labels)
# 將像素值縮放到[0, 1]范圍內(nèi)
x_train = train_images/255.0
x_test = test_images/255.0
# 將標(biāo)簽數(shù)據(jù)轉(zhuǎn)換為one-hot編碼
# train_labels = tf.keras.utils.to_categorical(train_labels, num_classes=10)
# test_labels = tf.keras.utils.to_categorical(test_labels, num_classes=10)
return (x_train, y_train), (x_test, y_test)
# 加載數(shù)據(jù)集
(train_images, train_labels), (test_images, test_labels) = load_data("../cifar_data/cifar-10-batches-py")
train_images = train_images.reshape(50000, 32, 32, 3)
test_images = test_images.reshape(10000, 32, 32, 3)
當(dāng)然還有更簡(jiǎn)單的方法那就是使用TensorFlow內(nèi)部模塊下載數(shù)據(jù)集,如下
# 下載數(shù)據(jù)集
cifar10=tf.keras.datasets.cifar10
(x_train,y_train),(x_test,y_test)=cifar10.load_data()
x_train[0][0][0]
# 對(duì)圖像images進(jìn)行數(shù)字標(biāo)準(zhǔn)化
x_train=x_train.astype('float32')/255.0
x_test = x_test.astype('float32')/ 255.0
第四步:數(shù)據(jù)集本來(lái)的標(biāo)簽是數(shù)字,我們可以將它轉(zhuǎn)化成對(duì)應(yīng)的類(lèi)型名
label_dict={0:"airplane",1:"automobile",2:"bird",3:"cat",4:"deer",5:"dog", 6:"frog", 7:"horse", 8:"ship", 9:"truck"}
第五步:開(kāi)始構(gòu)建神經(jīng)網(wǎng)絡(luò)模型,這里我就簡(jiǎn)單構(gòu)建一個(gè)類(lèi)似AlexNet的卷積神網(wǎng)絡(luò)模型
# 建立卷積神經(jīng)網(wǎng)絡(luò)CNN模型AlexNet
#建立Sequential線(xiàn)性堆疊模型
'''
Conv2D(filters=,kernel_size=,strides=,padding=,activation=,input_shape=,)
filters:卷積核數(shù)量,即輸出的特征圖數(shù)量。
kernel_size:卷積核大小,可以是一個(gè)整數(shù)或者一個(gè)元組,例如(3, 3)。
strides:卷積步長(zhǎng),可以是一個(gè)整數(shù)或者一個(gè)元組,例如(1, 1)。
padding:填充方式,可以是'same'或'valid'。'same'表示在輸入圖像四周填充0,保證輸出特征圖大小與輸入圖像大小相同;
'valid'表示不填充,直接進(jìn)行卷積運(yùn)算。
activation:激活函數(shù),可以是一個(gè)字符串、一個(gè)函數(shù)或者一個(gè)可調(diào)用對(duì)象。
input_shape:輸入圖像的形狀
'''
'''
MaxPooling2D(pool_size=,strides=,padding=,)
pool_size:池化窗口大小,可以是一個(gè)整數(shù)或者一個(gè)元組,例如(2, 2)表示2x2的池化窗口。
'''
#this is a noe model,you just have to choose one or the other
def creatAlexNet():
model = tf.keras.models.Sequential()#第1個(gè)卷積層
model.add(tf.keras.layers.Conv2D(filters=32,
kernel_size=(3,3),
input_shape=(32,32,3),
activation='relu', padding='same'))
# 防止過(guò)擬合
model.add(tf.keras.layers.Dropout(rate=0.3))
#第1個(gè)池化層
model.add(tf.keras.layers.MaxPooling2D(pool_size=(2,2)))
#第2個(gè)卷積層
model.add(tf.keras.layers.Conv2D(filters = 64,kernel_size=(3,3), activation='relu', padding ='same'))
# 防止過(guò)擬合
model.add(tf.keras.layers.Dropout(rate=0.3))#第2個(gè)池化層
model.add(tf.keras.layers.MaxPooling2D(pool_size=(2,2)))# 平坦層
#第3個(gè)卷積層
model.add(tf.keras.layers.Conv2D(filters = 128,kernel_size=(3,3), activation='relu', padding ='same'))
# 防止過(guò)擬合
model.add(tf.keras.layers.Dropout(rate=0.3))#第3個(gè)池化層
model.add(tf.keras.layers.MaxPooling2D(pool_size=(2,2)))# 平坦層
model.add(tf.keras.layers.Flatten())# 添加輸出層
model.add(tf.keras.layers.Dense(10,activation='softmax'))
return model
第六步:開(kāi)始加載模型
執(zhí)行模型函數(shù)
model = creatAlexNet()
輸出摘要
model.summary()
摘要結(jié)果如下:?
?超參數(shù)定義及模型訓(xùn)練
'''
model.compile(optimizer =,loss=,metrics=)
optimizer:指定優(yōu)化器,可以傳入字符串標(biāo)識(shí)符(如'rmsprop'、'adam'等),也可以傳入Optimizer類(lèi)的實(shí)例。
loss:指定損失函數(shù),可以傳入字符串標(biāo)識(shí)符(如'mse'、'categorical_crossentropy'等),也可以傳入自定義的損失函數(shù)。
metrics:指定評(píng)估指標(biāo),可以傳入字符串標(biāo)識(shí)符(如'accuracy'、'mae'等),也可以傳入自定義的評(píng)估函數(shù)或函數(shù)列表
'''
'''
model.fit(x=,y=,batch_size=,epochs=,verbose=,validation_data=,validation_split=,shuffle=,callbacks=)
x:訓(xùn)練數(shù)據(jù),通常為一個(gè)形狀為(樣本數(shù), 特征數(shù))的numpy數(shù)組,也可以是一個(gè)包含多個(gè)numpy數(shù)組的列表。
y:標(biāo)簽,也是一個(gè)numpy數(shù)組或列表,長(zhǎng)度應(yīng)與x的第一維相同。
batch_size:批量大小,表示每次迭代訓(xùn)練的樣本數(shù),通常選擇2的冪次方,比如32、64、128等。
epochs:訓(xùn)練輪數(shù),一個(gè)輪數(shù)表示使用所有訓(xùn)練數(shù)據(jù)進(jìn)行了一次前向傳播和反向傳播,通常需要根據(jù)實(shí)際情況調(diào)整。
verbose:輸出詳細(xì)信息,0表示不輸出,1表示輸出進(jìn)度條,2表示每個(gè)epoch輸出一次。
validation_data:驗(yàn)證數(shù)據(jù),通常為一個(gè)形狀與x相同的numpy數(shù)組,也可以是一個(gè)包含多個(gè)numpy數(shù)組的列表。
validation_split:切分驗(yàn)證集,將訓(xùn)練數(shù)據(jù)的一部分用作驗(yàn)證數(shù)據(jù),取值范圍在0到1之間,表示將訓(xùn)練數(shù)據(jù)的一部分劃分為驗(yàn)證數(shù)據(jù)的比例。
shuffle:是否打亂訓(xùn)練數(shù)據(jù),True表示每個(gè)epoch之前打亂數(shù)據(jù),F(xiàn)alse表示不打亂數(shù)據(jù)。
callbacks:回調(diào)函數(shù),用于在訓(xùn)練過(guò)程中定期保存模型、調(diào)整學(xué)習(xí)率等操作,
常用的回調(diào)函數(shù)包括ModelCheckpoint、EarlyStopping、ReduceLROnPlateau等。
'''
# 設(shè)置訓(xùn)練參數(shù)
train_epochs=10#訓(xùn)練輪數(shù)
batch_size=100#單次訓(xùn)練樣本數(shù)(批次大?。?
# 定義訓(xùn)練模式
model.compile(optimizer ='adam',#優(yōu)化器
loss='sparse_categorical_crossentropy',#損失函數(shù)
metrics=['accuracy'])#評(píng)估模型的方式
#訓(xùn)練模型
train_history = model.fit(x_train,y_train,validation_split = 0.2, epochs = train_epochs,
batch_size = batch_size)
訓(xùn)練過(guò)程如下:
第七步:訓(xùn)練的損失率和成功率的可視化圖
# 定義訓(xùn)練過(guò)程可視化函數(shù)
def visu_train_history(train_history,train_metric,validation_metric):
plt.plot(train_history.history[train_metric])
plt.plot(train_history.history[validation_metric])
plt.title('Train History')
plt.ylabel(train_metric)
plt.xlabel('epoch')
plt.legend(['train','validation'],loc='upper left')
plt.show()
?損失率可視化
visu_train_history(train_history,'loss','val_loss')
?
成功率可視化?
visu_train_history(train_history,'accuracy','val_accuracy')
?
第八步:模型測(cè)試及評(píng)估
用測(cè)試集評(píng)估模型
# 評(píng)估模型
test_loss, test_acc = model.evaluate(x_test, y_test, verbose=2)
print('Test accuracy:', test_acc)
?模型測(cè)試,可視化測(cè)試
#model test
preds = model.predict(x_test)
可視化函數(shù)
# 定義顯示圖像數(shù)據(jù)及其對(duì)應(yīng)標(biāo)簽的函數(shù)
# 圖像列表
def plot_images_labels_prediction(images,# 標(biāo)簽列表
labels,
preds,#預(yù)測(cè)值列表
index,#從第index個(gè)開(kāi)始顯示
num = 5): # 缺省一次顯示5幅
fig=plt.gcf()#獲取當(dāng)前圖表,Get Current Figure
fig.set_size_inches(12,6)#1英寸等于2.54cm
if num > 10:#最多顯示10個(gè)子圖
num = 10
for i in range(0, num):
ax = plt.subplot(2,5,i+1)#獲取當(dāng)前要處理的子圖
plt.tight_layout()
ax.imshow(images[index])
title=str(i)+','+label_dict[labels[index][0]]#構(gòu)建該圖上要顯示的title信息
if len(preds)>0:
title +='=>' + label_dict[np.argmax(preds[index])]
ax.set_title(title,fontsize=10)#顯示圖上的title信息
index += 1
plt.show()
執(zhí)行可視化函數(shù)
plot_images_labels_prediction(x_test,y_test, preds,15,30)
?結(jié)果如下:
第九步:模型保存及模型使用,測(cè)試外部圖片
保存模型
# 保存模型
model_filename ='models/cifarCNNModel.h5'
model.save(model_filename)
加載模型,測(cè)試模型
方法一:使用TensorFlow內(nèi)部模塊加載圖片,將dog.jpg路徑換成你的圖片路徑
# 加載模型
loaded_model = tf.keras.models.load_model('models/cifarCNNModel.h5')
type = ("airplane", "automobile", "bird", "cat", "deer", "dog", "frog", "horse", "ship", "truck")
label_dict={0:"airplane",1:"automobile",2:"bird",3:"cat",4:"deer",5:"dog", 6:"frog", 7:"horse", 8:"ship", 9:"truck"}
# 加載外來(lái)圖片
img = tf.keras.preprocessing.image.load_img(
'dog.jpg', target_size=(32, 32)
)
# 轉(zhuǎn)化為numpy數(shù)組
img_array = tf.keras.preprocessing.image.img_to_array(img)
# 歸一化數(shù)據(jù)
img_array = img_array / 255.0
# 維度擴(kuò)展
img_array = np.expand_dims(img_array, axis=0)
# 預(yù)測(cè)類(lèi)別
predictions = loaded_model.predict(img_array)
pre_label = np.argmax(predictions)
plt.title("type:{}, pre_label:{}".format(label_dict[pre_label],pre_label))
plt.imshow(img, cmap=plt.get_cmap('gray'))
?結(jié)果如下,預(yù)測(cè)結(jié)果是正確的,我這里在瀏覽器下載的確實(shí)是一張狗的圖片?
方法二:使用PIL的庫(kù)加載圖片進(jìn)行預(yù)測(cè)?
from PIL import Image
import numpy as np
img = Image.open('./cat.jpg')
img = img.resize((32, 32))
img_arr = np.array(img) / 255.0
img_arr = img_arr.reshape(1, 32, 32, 3)
pred = model.predict(img_arr)
class_idx = np.argmax(pred)
plt.title("type:{}, pre_label:{}".format(label_dict[class_idx],class_idx))
plt.imshow(img, cmap=plt.get_cmap('gray'))
結(jié)果如下,也是正確的,我這張圖片確實(shí)是一張貓的圖片
?
?方法三:從網(wǎng)絡(luò)上加載圖片進(jìn)行預(yù)測(cè),將下面的網(wǎng)址換成你想要預(yù)測(cè)的圖片網(wǎng)址
# 加載模型
loaded_model = tf.keras.models.load_model('models/cifarCNNModel.h5')
# 使用模型預(yù)測(cè)瀏覽器上的一張圖片
type = ("airplane", "automobile", "bird", "cat", "deer", "dog", "frog", "horse", "ship", "truck")
label_dict={0:"airplane",1:"automobile",2:"bird",3:"cat",4:"deer",5:"dog", 6:"frog", 7:"horse", 8:"ship", 9:"truck"}
url = 'https://img1.baidu.com/it/u=1284172325,1569939558&fm=253&fmt=auto&app=138&f=JPEG?w=500&h=580'
with urllib.request.urlopen(url) as url_response:
img_array = np.asarray(bytearray(url_response.read()), dtype=np.uint8)
img = cv2.imdecode(img_array, cv2.IMREAD_COLOR)
img_array = cv2.resize(img, (32, 32))
img_array = img_array / 255.0
img_array = np.expand_dims(img_array, axis=0)
predict_label = np.argmax(loaded_model.predict(img_array), axis=-1)[0]
plt.imshow(img, cmap=plt.get_cmap('gray'))
plt.title("Predict: {},Predict_label: {}".format(type[predict_label],predict_label))
plt.xticks([])
plt.yticks([])
結(jié)果如下, 這張就預(yù)測(cè)錯(cuò)了,明明是狗,預(yù)測(cè)成鳥(niǎo)(bird)去了
?
完整代碼如下:文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-478981.html
import tensorflow as tf
import numpy as np
import os
import matplotlib.pyplot as plt
import urllib
import cv2
# 下載數(shù)據(jù)集
cifar10=tf.keras.datasets.cifar10
(x_train,y_train),(x_test,y_test)=cifar10.load_data()
x_train[0][0][0]
# 對(duì)圖像images進(jìn)行數(shù)字標(biāo)準(zhǔn)化
x_train=x_train.astype('float32')/255.0
x_test = x_test.astype('float32')/ 255.0
label_dict={0:"airplane",1:"automobile",2:"bird",3:"cat",4:"deer",5:"dog", 6:"frog", 7:"horse", 8:"ship", 9:"truck"}
# 建立卷積神經(jīng)網(wǎng)絡(luò)CNN模型AlexNet
#建立Sequential線(xiàn)性堆疊模型
'''
Conv2D(filters=,kernel_size=,strides=,padding=,activation=,input_shape=,)
filters:卷積核數(shù)量,即輸出的特征圖數(shù)量。
kernel_size:卷積核大小,可以是一個(gè)整數(shù)或者一個(gè)元組,例如(3, 3)。
strides:卷積步長(zhǎng),可以是一個(gè)整數(shù)或者一個(gè)元組,例如(1, 1)。
padding:填充方式,可以是'same'或'valid'。'same'表示在輸入圖像四周填充0,保證輸出特征圖大小與輸入圖像大小相同;
'valid'表示不填充,直接進(jìn)行卷積運(yùn)算。
activation:激活函數(shù),可以是一個(gè)字符串、一個(gè)函數(shù)或者一個(gè)可調(diào)用對(duì)象。
input_shape:輸入圖像的形狀
'''
'''
MaxPooling2D(pool_size=,strides=,padding=,)
pool_size:池化窗口大小,可以是一個(gè)整數(shù)或者一個(gè)元組,例如(2, 2)表示2x2的池化窗口。
'''
#this is a noe model,you just have to choose one or the other
def creatAlexNet():
model = tf.keras.models.Sequential()#第1個(gè)卷積層
model.add(tf.keras.layers.Conv2D(filters=32,
kernel_size=(3,3),
input_shape=(32,32,3),
activation='relu', padding='same'))
# 防止過(guò)擬合
model.add(tf.keras.layers.Dropout(rate=0.3))
#第1個(gè)池化層
model.add(tf.keras.layers.MaxPooling2D(pool_size=(2,2)))
#第2個(gè)卷積層
model.add(tf.keras.layers.Conv2D(filters = 64,kernel_size=(3,3), activation='relu', padding ='same'))
# 防止過(guò)擬合
model.add(tf.keras.layers.Dropout(rate=0.3))#第2個(gè)池化層
model.add(tf.keras.layers.MaxPooling2D(pool_size=(2,2)))# 平坦層
#第3個(gè)卷積層
model.add(tf.keras.layers.Conv2D(filters = 128,kernel_size=(3,3), activation='relu', padding ='same'))
# 防止過(guò)擬合
model.add(tf.keras.layers.Dropout(rate=0.3))#第3個(gè)池化層
model.add(tf.keras.layers.MaxPooling2D(pool_size=(2,2)))# 平坦層
model.add(tf.keras.layers.Flatten())# 添加輸出層
model.add(tf.keras.layers.Dense(10,activation='softmax'))
return model
model = creatAlexNet()
model.summary()
'''
model.compile(optimizer =,loss=,metrics=)
optimizer:指定優(yōu)化器,可以傳入字符串標(biāo)識(shí)符(如'rmsprop'、'adam'等),也可以傳入Optimizer類(lèi)的實(shí)例。
loss:指定損失函數(shù),可以傳入字符串標(biāo)識(shí)符(如'mse'、'categorical_crossentropy'等),也可以傳入自定義的損失函數(shù)。
metrics:指定評(píng)估指標(biāo),可以傳入字符串標(biāo)識(shí)符(如'accuracy'、'mae'等),也可以傳入自定義的評(píng)估函數(shù)或函數(shù)列表
'''
'''
model.fit(x=,y=,batch_size=,epochs=,verbose=,validation_data=,validation_split=,shuffle=,callbacks=)
x:訓(xùn)練數(shù)據(jù),通常為一個(gè)形狀為(樣本數(shù), 特征數(shù))的numpy數(shù)組,也可以是一個(gè)包含多個(gè)numpy數(shù)組的列表。
y:標(biāo)簽,也是一個(gè)numpy數(shù)組或列表,長(zhǎng)度應(yīng)與x的第一維相同。
batch_size:批量大小,表示每次迭代訓(xùn)練的樣本數(shù),通常選擇2的冪次方,比如32、64、128等。
epochs:訓(xùn)練輪數(shù),一個(gè)輪數(shù)表示使用所有訓(xùn)練數(shù)據(jù)進(jìn)行了一次前向傳播和反向傳播,通常需要根據(jù)實(shí)際情況調(diào)整。
verbose:輸出詳細(xì)信息,0表示不輸出,1表示輸出進(jìn)度條,2表示每個(gè)epoch輸出一次。
validation_data:驗(yàn)證數(shù)據(jù),通常為一個(gè)形狀與x相同的numpy數(shù)組,也可以是一個(gè)包含多個(gè)numpy數(shù)組的列表。
validation_split:切分驗(yàn)證集,將訓(xùn)練數(shù)據(jù)的一部分用作驗(yàn)證數(shù)據(jù),取值范圍在0到1之間,表示將訓(xùn)練數(shù)據(jù)的一部分劃分為驗(yàn)證數(shù)據(jù)的比例。
shuffle:是否打亂訓(xùn)練數(shù)據(jù),True表示每個(gè)epoch之前打亂數(shù)據(jù),F(xiàn)alse表示不打亂數(shù)據(jù)。
callbacks:回調(diào)函數(shù),用于在訓(xùn)練過(guò)程中定期保存模型、調(diào)整學(xué)習(xí)率等操作,
常用的回調(diào)函數(shù)包括ModelCheckpoint、EarlyStopping、ReduceLROnPlateau等。
'''
# 設(shè)置訓(xùn)練參數(shù)
train_epochs=10#訓(xùn)練輪數(shù)
batch_size=100#單次訓(xùn)練樣本數(shù)(批次大?。?
# 定義訓(xùn)練模式
model.compile(optimizer ='adam',#優(yōu)化器
loss='sparse_categorical_crossentropy',#損失函數(shù)
metrics=['accuracy'])#評(píng)估模型的方式
#訓(xùn)練模型
train_history = model.fit(x_train,y_train,validation_split = 0.2, epochs = train_epochs,
batch_size = batch_size)
# 定義訓(xùn)練過(guò)程可視化函數(shù)
def visu_train_history(train_history,train_metric,validation_metric):
plt.plot(train_history.history[train_metric])
plt.plot(train_history.history[validation_metric])
plt.title('Train History')
plt.ylabel(train_metric)
plt.xlabel('epoch')
plt.legend(['train','validation'],loc='upper left')
plt.show()
visu_train_history(train_history,'accuracy','val_accuracy')
# 評(píng)估模型
test_loss, test_acc = model.evaluate(x_test, y_test, verbose=2)
print('Test accuracy:', test_acc)
#model test
preds = model.predict(x_test)
np.argmax(preds[0])
# 定義顯示圖像數(shù)據(jù)及其對(duì)應(yīng)標(biāo)簽的函數(shù)
# 圖像列表
def plot_images_labels_prediction(images,# 標(biāo)簽列表
labels,
preds,#預(yù)測(cè)值列表
index,#從第index個(gè)開(kāi)始顯示
num = 5): # 缺省一次顯示5幅
fig=plt.gcf()#獲取當(dāng)前圖表,Get Current Figure
fig.set_size_inches(12,6)#1英寸等于2.54cm
if num > 10:#最多顯示10個(gè)子圖
num = 10
for i in range(0, num):
ax = plt.subplot(2,5,i+1)#獲取當(dāng)前要處理的子圖
plt.tight_layout()
ax.imshow(images[index])
title=str(i)+','+label_dict[labels[index][0]]#構(gòu)建該圖上要顯示的title信息
if len(preds)>0:
title +='=>' + label_dict[np.argmax(preds[index])]
ax.set_title(title,fontsize=10)#顯示圖上的title信息
index += 1
plt.show()
plot_images_labels_prediction(x_test,y_test, preds,15,30)
# 保存模型
model_filename ='models/cifarCNNModel.h5'
model.save(model_filename)
# 加載模型
loaded_model = tf.keras.models.load_model('models/cifarCNNModel.h5')
type = ("airplane", "automobile", "bird", "cat", "deer", "dog", "frog", "horse", "ship", "truck")
label_dict={0:"airplane",1:"automobile",2:"bird",3:"cat",4:"deer",5:"dog", 6:"frog", 7:"horse", 8:"ship", 9:"truck"}
# 加載外來(lái)圖片
img = tf.keras.preprocessing.image.load_img(
'dog.jpg', target_size=(32, 32)
)
# 轉(zhuǎn)化為numpy數(shù)組
img_array = tf.keras.preprocessing.image.img_to_array(img)
# 歸一化數(shù)據(jù)
img_array = img_array / 255.0
# 維度擴(kuò)展
img_array = np.expand_dims(img_array, axis=0)
# 預(yù)測(cè)類(lèi)別
predictions = loaded_model.predict(img_array)
pre_label = np.argmax(predictions)
plt.title("type:{}, pre_label:{}".format(label_dict[pre_label],pre_label))
plt.imshow(img, cmap=plt.get_cmap('gray'))
#另一個(gè)加載圖片方法
from PIL import Image
import numpy as np
img = Image.open('./cat.jpg')
img = img.resize((32, 32))
img_arr = np.array(img) / 255.0
img_arr = img_arr.reshape(1, 32, 32, 3)
pred = model.predict(img_arr)
class_idx = np.argmax(pred)
plt.title("type:{}, pre_label:{}".format(label_dict[class_idx],class_idx))
plt.imshow(img, cmap=plt.get_cmap('gray'))
# 加載模型
loaded_model = tf.keras.models.load_model('models/cifarCNNModel.h5')
# 使用模型預(yù)測(cè)瀏覽器上的一張圖片
type = ("airplane", "automobile", "bird", "cat", "deer", "dog", "frog", "horse", "ship", "truck")
label_dict={0:"airplane",1:"automobile",2:"bird",3:"cat",4:"deer",5:"dog", 6:"frog", 7:"horse", 8:"ship", 9:"truck"}
url = 'https://img1.baidu.com/it/u=1284172325,1569939558&fm=253&fmt=auto&app=138&f=JPEG?w=500&h=580'
with urllib.request.urlopen(url) as url_response:
img_array = np.asarray(bytearray(url_response.read()), dtype=np.uint8)
img = cv2.imdecode(img_array, cv2.IMREAD_COLOR)
img_array = cv2.resize(img, (32, 32))
img_array = img_array / 255.0
img_array = np.expand_dims(img_array, axis=0)
predict_label = np.argmax(loaded_model.predict(img_array), axis=-1)[0]
plt.imshow(img, cmap=plt.get_cmap('gray'))
plt.title("Predict: {},Predict_label: {}".format(type[predict_label],predict_label))
plt.xticks([])
plt.yticks([])
那么本篇文章CIFAR10數(shù)據(jù)集分類(lèi)模型訓(xùn)練就到此結(jié)束,感謝大家的繼續(xù)支持!文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-478981.html
到了這里,關(guān)于TensorFlow2進(jìn)行CIFAR-10數(shù)據(jù)集動(dòng)物識(shí)別,保存模型并且進(jìn)行外部下載圖片測(cè)試的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!