cifar10数据集介绍
- cifar10是一个图像识别的数据集,一共有6000张32x32像素的彩色图片(训练集:测试集=5:1);这些图片一共分为10类(飞机、汽车、鸟、猫、鹿、狗、青蛙、马、船、卡车)。
代码及解析
导入需要的库
import keras # 使用keras深度学习框架
import numpy as np # 数据处理
from keras.models import Sequential # 使用Sequential 创建模型实例
from keras.layers import Conv2D,MaxPooling2D,Dense,Dropout,Flatten # 构建网络需要的各种层(卷积层、池化层、全连接层等)
from keras.datasets import cifar10 # 与数据集cifar10 有关的
可选(控制GPU资源,动态申请显存)
import tensorflow as tf #
config = tf.compat.v1.ConfigProto(gpu_options=tf.compat.v1.GPUOptions(allow_growth=True))
sess = tf.compat.v1.Session(config=config)
- 这段代码不加,当显存不足时会出现问题
下载数据集
(x_train, y_train),(x_test, y_test) = cifar10.load_data()
#keras提供了在线下载数据集的方法,使用load_data()函数就可以在线下载,要保证网络连接正常,下载需要一定的时间,需要耐心的等待
数据集处理
# 归一化,将像素值都转化到0-1之间
x_train = x_train.astype('float32')/255.0 # 原本像素值都是在1-255之间的
x_test = x_test.astype('float32')/255.0
# one-hot 类似于这种形式[0,0,1,0,0,0,0,0,0,0]
from keras.utils import np_utils # 辅助函数库
y_train = np_utils.to_categorical(y_train)
y_test = np_utils.to_categorical(y_test)
建立网络
model = Sequential() # 创建序列模型实例,可以把它考虑成一个栈,要向这里面添加一个一个的层
model.add(Conv2D(filters=32, #卷积层 32个卷积核
kernel_size=(3,3), # 卷积核的尺寸
input_shape=(32,32,3), # 第一层的输入图片的大小 3为channel(RGB)
activation='relu', # 激活函数使用线性流函数relu
padding='same')) # 填充边界,保持图片尺寸大小不变
model.add(Dropout(0.25)) # 将25%的神经元职位0
model.add(MaxPooling2D(pool_size=(2,2))) # 池化层
model.add(Conv2D(filters=64, kernel_size=(3, 3),
activation='relu', padding='same'))
model.add(Dropout(0.25))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Conv2D(filters=128, kernel_size=(3, 3),
activation='relu', padding='same'))
model.add(Dropout(0.25))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Flatten()) # 将数据展平二维nx1
# model.add(Dropout(rate=0.50))
model.add(Dense(1024, activation='relu')) # 全连接层
# model.add(Dropout(rate=0.50))
model.add(Dense(10, activation='softmax'))
model.compile(loss='categorical_crossentropy',
optimizer='adam', metrics=['accuracy']) # 使用交叉熵计算损失,使用Adam作优化方法
train_history = model.fit(x_train, y_train, # 为模型提供训练数据
validation_split=0.2, # 训练集中20%作为验证集
epochs=20, batch_size=128, verbose=1) # 迭代20次,每批128张,输出日志
测试
scores = model.evaluate(x_test, y_test, verbose=0) #使用测试数据测试结果并输出
print(scores[1])
输出
loss: 0.1013 - accuracy: 0.9640 - val_loss: 0.8371 - val_accuracy: 0.7604
0.7523000240325928
- 虽然只迭代了20次,虽然网络很浅,但是在训练集上的结果还是不错,但是在验证集和测试集上的效果都不好,结果是高方差的,已经过拟合了。
- 不要慌,慢慢来,将来我们就会学会如何防止过拟合,如何解决高方差和高偏差的问题,如何改进模型,尝试新的比较流行的网络结构了。