一、cifar100数据集简介
cifar100是一个基准的图像分类数据集,其中有100个类别,每个类别都有600张32×32大小的彩色图像。这些图像被分成了训练集和测试集,各有50000张和10000张。
该数据集相对于其他数据集的优点在于:图像质量高、规模适中、类别丰富。而与之相对的缺点在于:图像大小较小、类别数相对较少。
不过,由于该数据集的难度要远高于MNIST和CIFAR-10,因此有很多基于cifar100的深度学习模型,包括ResNet、DenseNet、Inception等。
二、数据预处理
cifar100数据集通常需要进行预处理,以便模型可以对其进行学习。以下是一些可能采取的预处理步骤:
1、图像缩放:将图像稍微放大一些,以增加分辨率和对细节的感知。
import cv2 import numpy as np def load_image(file_name): img = cv2.imread(file_name) img = cv2.resize(img, (48, 48)) img = img.astype(np.float32) / 255.0 return img
2、数据增强:通过在图像上进行一些微小的随机变换(如旋转、平移、反转等),可以生成更多的训练样本。
from keras.preprocessing.image import ImageDataGenerator datagen = ImageDataGenerator( rotation_range=20, width_shift_range=0.1, height_shift_range=0.1, zoom_range=0.1, horizontal_flip=True, vertical_flip=False)
三、模型训练
在Keras中训练一个cifar100分类器模型非常简单,可以选择使用许多不同的模型架构和训练配置。以下是一个简单的代码示例,你可以基于此修改成你的特定模型。
1、定义模型架构
from keras.models import Sequential from keras.layers import Conv2D, MaxPooling2D, Dense, Flatten model = Sequential() model.add(Conv2D(32, (3, 3), activation='relu', padding='same', input_shape=(32, 32, 3))) model.add(MaxPooling2D((2, 2))) model.add(Conv2D(64, (3, 3), activation='relu', padding='same')) model.add(MaxPooling2D((2, 2))) model.add(Conv2D(128, (3, 3), activation='relu', padding='same')) model.add(MaxPooling2D((2, 2))) model.add(Flatten()) model.add(Dense(128, activation='relu')) model.add(Dense(100, activation='softmax'))
2、指定编译器和学习配置
model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])
3、准备数据并开始训练
from keras.datasets import cifar100 from keras.utils import to_categorical (train_images, train_labels), (test_images, test_labels) = cifar100.load_data() train_images = train_images.astype('float32') / 255 test_images = test_images.astype('float32') / 255 train_labels = to_categorical(train_labels) test_labels = to_categorical(test_labels) history = model.fit(train_images, train_labels, epochs=20, batch_size=64, validation_data=(test_images, test_labels))
四、结果分析
通过训练和测试,我们可以获取一些有用的结果,以评估模型的性能。以下是一些可能的结果分析方法:
1、学习曲线:绘制出模型在训练和验证集上的损失函数和准确性,以查看它是如何随着时间(即训练周期)改变的。
import matplotlib.pyplot as plt acc = history.history['accuracy'] val_acc = history.history['val_accuracy'] loss = history.history['loss'] val_loss = history.history['val_loss'] epochs_range = range(epochs) plt.figure(figsize=(16, 8)) plt.subplot(1, 2, 1) plt.plot(epochs_range, acc, label='Training Accuracy') plt.plot(epochs_range, val_acc, label='Validation Accuracy') plt.legend(loc='lower right') plt.title('Training and Validation Accuracy') plt.subplot(1, 2, 2) plt.plot(epochs_range, loss, label='Training Loss') plt.plot(epochs_range, val_loss, label='Validation Loss') plt.legend(loc='upper right') plt.title('Training and Validation Loss') plt.show()
2、混淆矩阵:计算混淆矩阵,以查看模型在不同类别上的性能如何。
from sklearn.metrics import confusion_matrix predictions = model.predict(test_images) test_pred = np.argmax(predictions, axis=1) test_true = np.argmax(test_labels, axis=1) confusion = confusion_matrix(test_true, test_pred) print(confusion)
3、准确性分布:绘制出测试集上每个类别的准确性分布,以了解哪些类别更难识别。
class_acc = [0.0]*100 class_samples = [0]*100 for i in range(0, len(test_images)): prediction = np.argmax(predictions[i]) truth = np.argmax(test_labels[i]) class_samples[truth] += 1 if prediction == truth: class_acc[truth] += 1 for i in range (0, 100): print("Class ", i, ":", class_acc[i] / class_samples[i], "\tSamples:", class_samples[i])
通过以上方法,我们可以更好地了解cifar100数据集和深度学习模型的性能,以使我们能够不断提高我们的模型的性能。