卷积神经网络实现CIFAR100数据集分类

文章目录

  • CIFAR100数据集介绍
  • 代码实现
    • 读取数据集
    • 构建网络模型
    • 网络模型编译
    • 模型训练
    • 模型评估
    • 模型运行
    • 模型运行结果
  • 总结

CIFAR100数据集介绍

CIFAR100数据集有100个类别,每个类别包含600张图片,且每个类别中各有500张训练图片和100张测试图片。CIFAR100数据集的100个类别被分为20个超类。每个图像都有一个"精细"标签(它所属的类)和一个"粗糙"标签(它所属的超类)。
卷积神经网络实现CIFAR100数据集分类_第1张图片

代码实现

读取数据集

# 导入数据集
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

构建网络模型

  1. 卷积层:32个5*5的卷积核,步长设置为1,激活函数采用relu
  2. 池化层:池化大小为2,步长设置为2
  3. 卷积层:64个5*5的卷积核,步长设置为1,激活函数采用relu
  4. 池化层:池化大小为2,步长设置为2
  5. 全连接层:设置1024个神经元,激活函数为relu
  6. 全连接层:设置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

从结果中可以看到,所得到的准确率还是比较低的。因为卷积神经网络损失的下降并没有全连接神经网络那么快,并且上述代码只迭代了一次。但是卷积神经网络相对于全连接神经网络来说,减少了训练的参数,可以降低对设备算力及性能的要求,因此在模式识别、物体检测等方面有着广泛的应用。

总结

本文的侧重点是介绍如何搭建卷积神经网络模型,没有对模型进行必要的改进。
注:本文的代码资源来自黑马程序员课程

你可能感兴趣的:(深度学习,卷积,神经网络,深度学习,tensorflow)