Press "Enter" to skip to content

【keras】2. CIFAR-10图像识别

 

参考:《Tensorflow和keras-深度学习人工智能实践应用》

 

第9、10章

 

GitHub:点我

 

部分封装函数请看文章:【keras】1. MNIST手写数据集识别(重要)_myaijarvis notebook-CSDN博客

 

数据集

 

 

数据预处理

 

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
np.random.seed(10)

 

下载数据

 

文章:keras离线下载cifar数据集_lsh呵呵-CSDN博客

 

from keras.datasets import cifar10 
# 第一次下载时间消耗可能会比较长,建议自己下载然后放到默认目录下(压缩包改名为cifar-10-batches-py.tar.gz) 
# https://www.cs.toronto.edu/~kriz/cifar-10-python.tar.gz
(x_train_image,y_train_label),\
(x_test_image,y_test_label) = cifar10.load_data() # 默认路径C:\Users\Jarvis\.keras\datasets

 

 

显示图像

 

# y_train_label的结构
label_dict={
 0:'airplane',1:'automobile',2:'bird',3:'cat',4:'deer',5:'dog',6:'frog',7:'horse',8:'ship',9:'truck'}
# 批量显示
# 查看多条数据的images与label
# idx是起始数据下标 总共有idx+num个数据
def plot_images_labels_prediction(images,labels,prediction,idx,num=10):
    fig=plt.gcf()
    fig.set_size_inches(12,14)
    if num>25: num=25 # 最多显示25个
    for i in range(0,num):
        ax=plt.subplot(5,5,1+i) # 5*5=25个 最多显示25个
        ax.imshow(images[idx],cmap='binary')
        title=str(i)+','+label_dict[labels[i][0]]
        if len(prediction)>0: # 如果传入预测数据
            title+="=>"+label_dict[prediction[i]]
        ax.set_title(title,fontsize=10)
        ax.set_xticks([]) # 设置坐标轴为空
        ax.set_yticks([])
        idx+=1
    plt.show()
plot_images_labels_prediction(x_train_image,y_train_label,[],0)

 

 

标准化

 

x_Train_normalize=x_train_image/255
x_Test_normalize=x_test_image/255

 

独热编码

 

from keras.utils import np_utils
y_TrainOneHot=np_utils.to_categorical(y_train_label)
y_TestOneHot=np_utils.to_categorical(y_test_label)

 

 

建立模型

 

from tensorflow.python.keras.models import Sequential
from tensorflow.python.keras.layers import Dense,Dropout,Flatten,Activation
from tensorflow.python.keras.layers import Conv2D,MaxPooling2D,ZeroPadding2D
model=Sequential()
model.add(Conv2D(filters=32,kernel_size=(3,3)
                 ,padding='SAME'
                 ,input_shape=(32,32,3) # 宽,高,通道数
                 ,activation='relu'))
model.add(Dropout(0.25))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Conv2D(filters=64,kernel_size=(3,3),padding='SAME',activation='relu'))
model.add(Dropout(0.25))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Flatten())
model.add(Dropout(0.25))
model.add(Dense(1024,activation='relu'))
model.add(Dropout(0.25))
model.add(Dense(10,activation='softmax')) # 十分类
model.summary()

 

10轮笔记本比较吃力,建议2轮先试试看

 

model.compile(loss='categorical_crossentropy',optimizer='adam',metrics=['accuracy'])
train_history=model.fit(x=x_Train_normalize # 经过标准化处理的图像
                        ,y=y_TrainOneHot # 经过独热编码的标签
                        ,validation_split=0.2
                        ,epochs=10
                        ,batch_size=128
                        ,verbose=1)

 

训练准确率

 

show_train_history(train_history,'accuracy','val_accuracy')

 

训练误差

 

show_train_history(train_history,'loss','val_loss')

 

scores=model.evaluate(x_Test_normalize,y_TestOneHot) 
print('Test loss:', scores[0])
print('Test accuracy:', scores[1])

 

这里注意

 

# prediction=model.predict_classes(x_Test_normalize)# predict_classes返回的是类别,打印出来的值就是类别值
# predict_classes 在2.6 被删除了
predict=model.predict(x_Test_normalize)
predict=np.argmax(predict,axis=1)

 


把认错的拿出来

 

to_show_x=x_test_image[y_test_label!=predict]
to_show_y=y_test_label[y_test_label!=predict]
to_show_p=prediction[y_test_label!=predict]
plot_images_labels_predict(to_show_x,to_show_y,to_show_p,idx=0)

 

 

查看每一种的预测概率

 

Predicted_Probability = model.predict(x_Test_normalize)
def show_Predicted_Probability(y,prediction,x_img,Predicted_Probability,i):
    print('label:',label_dict[y[i][0]],'predict:',label_dict[prediction[i]])
    plt.figure(figsize=(2,2))
    plt.imshow(np.reshape(x_img[i],(32,32,3)))
    plt.show()
    for j in range(10):
        print(label_dict[j]+', Probability:%1.9f'%(Predicted_Probability[i][j]))
show_Predicted_Probability(y_test_label,predict,x_test_image,Predicted_Probability,0)

 

 

显示混淆矩阵

 

pd.crosstab(y_test_label.reshape(-1) # 二维转一维
            ,predict
            ,rownames=['label'] # 行名
            ,colnames=['predict'] # 列名
           )

 

三次的卷积运算网络

 

model=Sequential()
model.add(Conv2D(filters=32,kernel_size=(3,3),padding='SAME',input_shape=(32,32,3),activation='relu'))
model.add(Dropout(0.3))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Conv2D(filters=64,kernel_size=(3,3),padding='SAME',activation='relu'))
model.add(Dropout(0.3))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Conv2D(filters=128,kernel_size=(3,3),padding='SAME',activation='relu'))
model.add(Dropout(0.3))
model.add(Conv2D(filters=128,kernel_size=(3,3),padding='SAME',activation='relu'))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Flatten())
model.add(Dropout(0.3))
model.add(Dense(2500,activation='relu'))
model.add(Dropout(0.3))
model.add(Dense(1500,activation='relu'))
model.add(Dropout(0.3))
model.add(Dense(10,activation='softmax'))
model.summary()

 

模型保存与加载

 

model.save_weights("cifarCnnModel.h5")
print("Save OK!")
try:
    model.load_weights('cifarCnnModel.h5')
    print('Load OK!')
except:
    print('Load Failed!')

 

文章:Keras ModelCheckpoint 保存训练过程中的最佳模型权重_庆志的小徒弟-CSDN博客_keras训练过程中保存模型

 

from keras.callbacks import ModelCheckpoint, TensorBoard
#记录所有训练过程,每隔一定步数记录最大值
log_dir='logs/'
tensorboard = TensorBoard(log_dir=log_dir)
checkpoint = ModelCheckpoint(log_dir + "best_weights.h5",
                                 monitor="val_loss",
                                 mode='min',
                                 save_weights_only=True, # 只保留权重信息
                                 save_best_only=True, 
                                 verbose=1,
                                 period=1)
 
callback_lists=[tensorboard,checkpoint]
train_history=model.fit(x=x_Train_normalize # 经过标准化处理的图像
                        ,y=y_TrainOneHot # 经过独热编码的标签
                        ,validation_split=0.2
                        ,epochs=3
                        ,batch_size=32
                        ,callbacks=callback_lists
                        ,verbose=1)

 

 

文章:Keras中使用ModelCheckpoint对训练完成的模型进行保存及载入_小龙蜀黍的博客-CSDN博客

 

参数:

 

6.save_weights_only:若设置为True,占用内存小(只保存模型权重),但下次想调用的话,需要搭建和训练时一样的网络。若设置为False,占用内存大(包括了模型结构和配置信息),下次调用可以直接载入,不需要再次搭建神经网络结构。

 

False:
model=load_model('xxx.h5')
#  model.fit() # 可以继续训练
True:
model.load_weights('xxx.h5')
model.fit()

Be First to Comment

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注