上一主题 下一主题
ScriptCat,新一代的脚本管理器脚本站,与全世界分享你的用户脚本油猴脚本开发指南教程目录
返回列表 发新帖

cifar10 分类预测

[复制链接]
  • TA的每日心情

    2025-8-16 01:57
  • 签到天数: 196 天

    [LV.7]常住居民III

    760

    主题

    6734

    回帖

    7382

    积分

    管理员

    非物质文化遗产社会摇传承人

    积分
    7382

    荣誉开发者油中2周年生态建设者

    发表于 2 小时前 | 显示全部楼层 | 阅读模式

    直接根据上一次稍微改一下

    # 导入必要的库和模块
    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
    图片.png
    但是看其他人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')
    
    混的人。
    ------------------------------------------
    進撃!永遠の帝国の破壊虎---李恒道

    入驻了爱发电https://afdian.com/a/lihengdao666

    发表回复

    本版积分规则

    快速回复 返回顶部 返回列表