卷积神经网络实现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

构建网络模型

  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

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

总结

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

  • 0
    点赞
  • 48
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
Cifar-10数据集是一个用于图像识别的数据集,包含了10种不同类别的图像,每个类别有6000张32*32像素的彩色图像。在这个任务中,我们将使用卷积神经网络对这些图像进行分类数据集分析: 首先,我们可以使用Python中的numpy和matplotlib库来加载和可视化数据集。下面是一个简单的代码片段: ```python import numpy as np import matplotlib.pyplot as plt import pickle # 加载数据集 with open('cifar-10-batches-py/data_batch_1', 'rb') as f: data = pickle.load(f, encoding='bytes') # 解析数据 X = data[b'data'] Y = data[b'labels'] labels = ['airplane', 'automobile', 'bird', 'cat', 'deer', 'dog', 'frog', 'horse', 'ship', 'truck'] # 可视化数据 fig, axes = plt.subplots(5, 10, figsize=(10, 5)) for i, ax in enumerate(axes.flat): ax.imshow(X[i].reshape(3, 32, 32).transpose([1, 2, 0])) ax.set_xticks([]) ax.set_yticks([]) ax.set_title(labels[Y[i]]) plt.show() ``` 这段代码将加载数据集中的第一个批次,并将前50个图像可视化。可以看到,这些图像包含了不同的物体,例如汽车、狗和鸟等。 数据集预处理: 在进行训练之前,我们需要对数据集进行一些预处理。首先,我们需要将像素值归一化到0到1之间。其次,我们需要将图像从32*32*3的形状转换为合适的形状,以便它们可以被输入到卷积神经网络中。 ```python # 数据预处理 X = X.astype('float32') / 255.0 X = X.reshape(-1, 3, 32, 32).transpose([0, 2, 3, 1]) Y = np.array(Y) ``` 这段代码将像素值归一化到0到1之间,并将图像从32*32*3的形状转换为32*32*3的形状。现在,我们已经完成了数据集的预处理,可以开始构建卷积神经网络模型进行训练。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值