卷积神经网络实现CIFAR100数据集分类
CIFAR100数据集介绍
CIFAR100数据集有100个类别,每个类别包含600张图片,且每个类别中各有500张训练图片和100张测试图片。CIFAR100数据集的100个类别被分为20个超类。每个图像都有一个"精细"标签(它所属的类)和一个"粗糙"标签(它所属的超类)。
代码实现
读取数据集
# 导入数据集 from tensorflow.python.keras.datasets import cifar100 class CNNMnist(object): def __init__(self): # 读取数据集 (self.train,self.train_label),(self.test,self.test_label) = cifar100.load_data() # 对数据集进行归一化处理 self.train = self.train.reshape(-1,32,32,3) / 255.0 self.test = self.test.reshape(-1,32,32,3) / 255.0
构建网络模型
- 卷积层:32个5*5的卷积核,步长设置为1,激活函数采用relu
- 池化层:池化大小为2,步长设置为2
- 卷积层:64个5*5的卷积核,步长设置为1,激活函数采用relu
- 池化层:池化大小为2,步长设置为2
- 全连接层:设置1024个神经元,激活函数为relu
- 全连接层:设置100个神经元,激活函数为softmax
# 导入必要的包 from tensorflow.python.keras import layers,losses,optimizers from tensorflow.python.keras.models import Sequential import tensorflow as tf class CNNMnist(object): model = Sequential([ layers.Conv2D(32,kernel_size=5,strides=1,padding=same,data_format=channels_last,activation=tf.nn.relu), layers.MaxPool2D(pool_size=2,strides=2,padding=same), layers.Conv2D(64,kernel_size=5,strides=1,padding=same,data_format=channels_last,activation=tf.nn.relu), layers.MaxPool2D(pool_size=2,strides=2,padding=same), layers.Flatten(), layers.Dense(1024,activation=tf.nn.relu), layers.Dense(100,activation=tf.nn.softmax) ])
网络模型编译
class CNNMnist(object): def compile(self): CNNMnist.model.compile(optimizer=optimizers.adam_v2.Adam(), loss=losses.sparse_categorical_crossentropy, metrics=[accuracy]) return None
模型训练
class CNNMnist(object): def fit(self): CNNMnist.model.fit(self.train,self.train_label,epochs=1,batch_size=32) return None
模型评估
class CNNMnist(object): def evaluate(self): train_loss,train_acc = CNNMnist.model.evaluate(self.train,self.train_label) test_loss,test_acc = CNNMnist.model.evaluate(self.test,self.test_label) print("train_loss:",train_loss) print("train_acc:",train_acc) print("test_loss:",test_loss) print("test_acc:",test_acc) return None
模型运行
if __name__ == __main__: cnn = CNNMnist() cnn.compile() cnn.fit() cnn.evaluate()
模型运行结果
1563/1563 [==============================] - 199s 126ms/step - loss: 3.5098 - accuracy: 0.1748 1563/1563 [==============================] - 56s 35ms/step - loss: 2.8101 - accuracy: 0.3094 313/313 [==============================] - 11s 33ms/step - loss: 2.9732 - accuracy: 0.2672 train_loss: 2.81014084815979 train_acc: 0.3094399869441986 test_loss: 2.9731905460357666 test_acc: 0.2671999931335449
从结果中可以看到,所得到的准确率还是比较低的。因为卷积神经网络损失的下降并没有全连接神经网络那么快,并且上述代码只迭代了一次。但是卷积神经网络相对于全连接神经网络来说,减少了训练的参数,可以降低对设备算力及性能的要求,因此在模式识别、物体检测等方面有着广泛的应用。
总结
本文的侧重点是介绍如何搭建卷积神经网络模型,没有对模型进行必要的改进。 注:本文的代码资源来自黑马程序员课程
上一篇:
JS实现多线程数据分片下载