直接根据上一次稍微改一下
# 导入必要的库和模块
import numpy as np # 用于数值计算和数组操作
import pandas as pd # 用于数据处理和分析
from keras.datasets import cifar10 # 加载MNIST手写数字数据集
from tensorflow.keras.utils import to_categorical # 将标签转换为分类格式
from keras import models # 神经网络模型类
from keras.layers import Dense, Dropout, Flatten, Conv2D, MaxPooling2D # 神经网络层类型
from PIL import Image
(X_train_image, y_train_lable), (X_test_image, y_test_lable) = cifar10.load_data()
# 数据预处理
# 将图像数据重塑为4D张量: (样本数, 高度, 宽度, 通道数)
# 添加通道维度1,表示灰度图像(如果是RGB图像则为3)
X_train = X_train_image.reshape(50000, 32, 32, 3)
X_test = X_test_image.reshape(10000, 32, 32, 3)
# 将标签转换为one-hot编码格式
# 例如: 数字3 -> [0,0,0,1,0,0,0,0,0,0]
# 数字7 -> [0,0,0,0,0,0,0,1,0,0]
y_train = to_categorical(y_train_lable, 10)
y_test = to_categorical(y_test_lable, 10)
# 创建Sequential顺序模型
model = models.Sequential()
# 添加第一个卷积层
# 32个3x3的卷积核,使用ReLU激活函数
# input_shape指定输入数据的维度: 28x28像素,1个通道(灰度)
model.add(Conv2D(32, (3, 3), activation='relu', input_shape=(32, 32, 3)))
# 添加最大池化层
# 使用2x2池化窗口,将特征图尺寸减半(28x28 -> 14x14)
# 减少参数数量,增强特征不变性
model.add(MaxPooling2D(pool_size=(2, 2)))
# 添加第二个卷积层
# 64个3x3的卷积核,提取更复杂的特征
model.add(Conv2D(64, (3, 3), activation='relu'))
# 添加第二个最大池化层
# 进一步减少特征图尺寸(14x14 -> 7x7)
model.add(MaxPooling2D(pool_size=(2, 2)))
# 添加Dropout层防止过拟合
# 在训练过程中随机丢弃25%的神经元连接
# 强制网络学习更鲁棒的特征表示
model.add(Dropout(0.25))
# 将多维特征图展平为一维向量
# 为全连接层准备输入数据
model.add(Flatten())
# 添加全连接层(密集层)
# 128个神经元,使用ReLU激活函数
# 进行高级特征组合和分类决策
model.add(Dense(128, activation='relu'))
# 添加第二个Dropout层
# 丢弃50%的神经元连接,进一步防止过拟合
# 同时可以加速训练过程
model.add(Dropout(0.5))
# 添加输出层
# 10个神经元对应10个数字类别(0-9)
# 使用softmax激活函数输出概率分布
model.add(Dense(10, activation='softmax'))
# 编译模型,配置训练过程
# optimizer: 使用rmsprop优化算法更新权重
# loss: 使用分类交叉熵损失函数,适用于多分类问题
# metrics: 监控准确率指标
model.compile(optimizer='rmsprop',
loss='categorical_crossentropy',
metrics=['accuracy'])
# 开始训练模型
# X_train, y_train: 训练数据和标签
# validation_split=0.3: 使用30%的训练数据作为验证集
# epochs=5: 整个训练集迭代5次
# batch_size=128: 每次使用128个样本更新权重
model.fit(X_train, y_train,
validation_split=0.3,
epochs=5,
batch_size=128)
# 在测试集上评估模型性能
# 返回损失值和准确率
score = model.evaluate(X_test, y_test)
# 打印测试集准确率
# score[0]是损失值,score[1]是准确率
print('测试集预测准确率:', score[1])
发现准确率很低,40%左右
查阅其他资料可知可以尝试归一化
X_train = X_train_image.astype('float32') / 255.0
X_test = X_test_image.astype('float32') / 255.0
然后提高训练次数
model.fit(X_train, y_train,
validation_split=0.3,
epochs=20,
batch_size=64)
因为时间比较长了,所以需要保留模型
model.save('cifar10_cnn_model.h5')
测试集预测准确率: 0.7026000022888184
跟我看的教程一致 https://www.heywhale.com/mw/project/63688e46d28b18529a5fd1f2

但是看其他人90%+
这个以后在再学习啦
完整代码
import numpy as np
import pandas as pd
from keras.datasets import cifar10
from tensorflow.keras.utils import to_categorical
import tensorflow as tf
from keras import models
from keras.layers import Dense, Dropout, Flatten, Conv2D, MaxPooling2D, BatchNormalization
from PIL import Image
(X_train_image, y_train_lable), (X_test_image, y_test_lable) = cifar10.load_data()
X_train = X_train_image.astype('float32') / 255.0
X_test = X_test_image.astype('float32') / 255.0
y_train = to_categorical(y_train_lable, 10)
y_test = to_categorical(y_test_lable, 10)
gpus = tf.config.list_physical_devices('GPU')
if gpus:
try:
for gpu in gpus:
tf.config.experimental.set_memory_growth(gpu, True)
print(f"Detected {len(gpus)} GPU(s). Enabling MirroredStrategy.")
except Exception as e:
print('Could not set memory growth:', e)
strategy = tf.distribute.MirroredStrategy()
else:
print('No GPU detected, using default strategy (CPU).')
strategy = tf.distribute.get_strategy()
with strategy.scope():
model = models.Sequential()
model.add(Conv2D(32, (3, 3), activation='relu', padding='same', input_shape=(32, 32, 3)))
model.add(BatchNormalization())
model.add(Conv2D(32, (3, 3), activation='relu', padding='same'))
model.add(BatchNormalization())
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))
model.add(Conv2D(64, (3, 3), activation='relu', padding='same'))
model.add(BatchNormalization())
model.add(Conv2D(64, (3, 3), activation='relu', padding='same'))
model.add(BatchNormalization())
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))
model.add(Conv2D(128, (3, 3), activation='relu', padding='same'))
model.add(BatchNormalization())
model.add(Conv2D(128, (3, 3), activation='relu', padding='same'))
model.add(BatchNormalization())
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))
model.add(Flatten())
model.add(Dense(512, activation='relu'))
model.add(BatchNormalization())
model.add(Dropout(0.5))
model.add(Dense(10, activation='softmax'))
model.compile(optimizer='rmsprop',
loss='categorical_crossentropy',
metrics=['accuracy'])
model.fit(X_train, y_train,
validation_split=0.3,
epochs=20,
batch_size=64)
score = model.evaluate(X_test, y_test)
print('测试集预测准确率:', score[1])
model.save('cifar10_cnn_model.h5')