基于Keras深度学习框架的Cifar-10练习

时间:2022-07-25 14:02:18

徐海蛟教学


CIFAR-10数据集是由 Hinton 大牛人的两个大弟子 Alex Krizhevsky、Ilya Sutskever 收集的一个用于普适物体识别的数据集,它包含 60000 个32×32的彩色png图像,共有10类:airplane, automobile, bird, cat, deer, dog, frog, horse, ship, truck。前面5万幅png图片作训练集X_train,后面1万幅png图片作测试集X_test。


从toronto大学下载的数据集是压缩文件,分为5个训练块 batch 和1个测试块 batch ,每个块有10000个图像。测试块包含从每类随机选择的1000个图像。训练块以随机的顺序包含这些图像,但一些训练块可能比其它类包含更多的图像。训练块每类包含5000个图像。标签类间完全互斥,例如汽车类和卡车类没有重叠。又如“Automobile”只包含sedans, SUVs等等,“Truck”只包含大卡车。两者都不包含皮卡车。


下面我们使用 Keras深度学习库去完成这十类对象的识别练习,掌握Keras 深度学习库基本方法。

我们通过 Anaconda 快速安装好了 Python 3、Theano 以及 Keras包。安装全程没有难点。具体环境如下。

Python 3.6.0 |Anaconda 4.3.0 (64-bit)| (default, Dec 23 2016, 12:22:00)
[GCC 4.4.7 20120313 (Red Hat 4.4.7-1)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>


pip install theano -i <镜像网址>

提示:Successfully installed theano-0.8.2

pip install keras==1.2.0 -i <镜像网址>

提示:Successfully installed keras-1.2.0


注意:keras-1.2.1有 Bug,安装时候要指定安装 1.2.0版本,如下。

pip install keras==1.2.0 -i <镜像网址>

可考虑使用中科大或者豆瓣开源软件镜像网址,速度飞快。


python3 代码如下。

import sys
import time
from keras.datasets import cifar10
from keras.layers import Convolution2D, MaxPooling2D, AveragePooling2D
from keras.layers import Dense, Dropout, Activation, Flatten
from keras.models import Sequential
from keras.optimizers import SGD
from keras.utils import np_utils
from keras.utils.visualize_util import plot


# 开始下载数据集
t0 = time.time()  # 打开深度学习计时器
# CIFAR10 图片数据集
(X_train, Y_train), (X_test, Y_test) = cifar10.load_data()  # 32×32

X_train = X_train.astype('float32')  # uint8-->float32
X_test = X_test.astype('float32')
X_train /= 255  # 归一化到0~1区间
X_test /= 255
print('训练样例:', X_train.shape, Y_train.shape,
      ', 测试样例:', X_test.shape, Y_test.shape)


nb_classes = 10  # label为0~9共10个类别
# Convert class vectors to binary class matrices
Y_train = np_utils.to_categorical(Y_train, nb_classes)
Y_test = np_utils.to_categorical(Y_test, nb_classes)
print("取数据耗时: %.2f seconds【徐海蛟博士】 ..." % (time.time() - t0))


###################
# 1. 建立CNN模型
###################
print("开始建模CNN ...")
model = Sequential()  # 生成一个model
model.add(Convolution2D(
    32, 3, 3, border_mode='valid', input_shape=X_train.shape[1:]))  # C1 卷积层
model.add(Activation('relu'))  # 激活函数:relu, tanh, sigmoid

model.add(Convolution2D(32, 3, 3))  # C2 卷积层
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))  # S3 池化
model.add(Dropout(0.25))  # 


model.add(Convolution2D(64, 3, 3, border_mode='valid')) # C4
model.add(Activation('relu'))


model.add(Convolution2D(64, 3, 3)) # C5
model.add(Activation('relu'))
model.add(AveragePooling2D(pool_size=(2, 2)))  # S6
model.add(Dropout(0.25))


model.add(Flatten())  # bottleneck 瓶颈
model.add(Dense(512))  # F7 全连接层, 512个神经元
model.add(Activation('relu'))  # 
model.add(Dropout(0.5))


model.add(Dense(nb_classes))  # label为0~9共10个类别
model.add(Activation('softmax'))  # softmax 分类器
model.summary() # 模型小节
print("建模CNN完成 ...")




###################
# 2. 训练CNN模型
###################
sgd = SGD(lr=0.01, decay=1e-6, momentum=0.9, nesterov=True)
model.compile(
    loss='categorical_crossentropy', optimizer=sgd, metrics=['accuracy'])
plot(model, to_file='model1.png', show_shapes=True)  # 画模型图


model.fit(X_train, Y_train, batch_size=100, nb_epoch=50,
          validation_data=(X_test, Y_test))  # 81.34%, 224.08s
Y_pred = model.predict_proba(X_test, verbose=0)  # Keras预测概率Y_pred
print(Y_pred[:3, ])  # 取前三张图片的十类预测概率看看
score = model.evaluate(X_test, Y_test, verbose=0) # 评估测试集loss损失和精度acc
print('测试集 score(val_loss): %.4f' % score[0])  # loss损失
print('测试集 accuracy: %.4f' % score[1]) # 精度acc
print("耗时: %.2f seconds ..." % (time.time() - t0))