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()函数就可以在线下载,要保证网络连接正常,下载需要一定的时间,需要耐心的等待

在Keras中使用CNN进行人类活动识别_深度学习

数据集处理
# 归一化,将像素值都转化到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)

在Keras中使用CNN进行人类活动识别_深度学习_02

建立网络
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张,输出日志
测试

在Keras中使用CNN进行人类活动识别_神经网络_03

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次,虽然网络很浅,但是在训练集上的结果还是不错,但是在验证集和测试集上的效果都不好,结果是高方差的,已经过拟合了。
  • 不要慌,慢慢来,将来我们就会学会如何防止过拟合,如何解决高方差和高偏差的问题,如何改进模型,尝试新的比较流行的网络结构了。