VGG模型用于训练cifar数据集

本文介绍使用VGG模型训练CIFAR-10数据集的过程,包括数据预处理、模型构建与训练,并讨论了训练过程中的常见错误及解决方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

VGG模型用于训练cifar数据集

结果
训练集中
在这里插入图片描述
测试集中
在这里插入图片描述
感觉在测试集上的准确率还是挺低的,感觉剩下的可以通过调参实现;
然而我并不想调参,只是想了解一下通过其他模型对比不同模型之间对同一数据集的差异;
神经网络训练过程中,损失误差及准确率的变化;
在这里插入图片描述

在调用训练的那个history时,有时会出现莫名其妙的错误
比如:
报错信息之KeyError: ‘accuracy’
报错信息之KeyError: 'val_acc’和KeyError: ‘acc’

show_train_history(history,'loss','accuracy')

就是上面那个代码中的loss等,这主要是由于keras的版本不一样导致的,因此你可以自行调看自己的keras版本的history的关键字

print("H.histroy keys:", history.history.keys())

还有就是,在将测试集扔进去验证时,曾经出现过这个错误
Failed to find data adapter that can handle input: <class ‘numpy.ndarray’>,
<class ‘numpy.ndarray’> contain <class ‘int’>(差不多这个,后面半段是凭记忆编写的)
好像是类型不匹配造成的,然后添加下面这个类型转换才解决掉

test_image = np.array(test_image)
test_label = np.array(test_label)

读取数据代码

import pickle
import numpy as np

def load_cifar10_batch(cifar10_dataset_folder_path, batch_id):
    with open(cifar10_dataset_folder_path + '/data_batch_' + str(batch_id), mode='rb') as file:
        batch = pickle.load(file, encoding='latin1')
    # features and labels
    features = batch['data'].reshape((len(batch['data']), 3, 32, 32)).transpose(0, 2, 3, 1)
    labels = batch['labels']
    return features, labels
def load_data():
    # 加载所有数据
    cifar10_path = 'D:/Code/Python/data/cifar-10-batches-py'
    # 一共有5个batch的训练数据
    x_train, y_train = load_cifar10_batch(cifar10_path, 1)
    for i in range(2,5):
        features,labels = load_cifar10_batch(cifar10_path, i)
        x_train, y_train = np.concatenate([x_train, features]),np.concatenate([y_train, labels])
    # 加载测试数据
    with open(cifar10_path + '/test_batch', mode = 'rb') as file:
        batch = pickle.load(file, encoding='latin1')
        x_test = batch['data'].reshape((len(batch['data']),3,32,32)).transpose(0,2,3,1)
        y_test = batch['labels']
    return x_train,y_train,x_test,y_test

正文代码

import tensorflow as tf
import matplotlib.pyplot as plt
import numpy as np
import time
import math
import os
import keras
import cifar_load_data
max_steps = 3000
batch_size = 128
#***********************************载入数据************************************#
train_image,train_label,test_image,test_label = cifar_load_data.load_data()
#归一化处理
train_image = train_image.astype(np.float32) / 255.0  # 归一化处理
test_image = test_image.astype(np.float32) / 255.0

def build_model():
    vgg_model = keras.models.Sequential()
    vgg_model.add(keras.layers.Conv2D(32, (3,3), padding="same",activation="relu", input_shape=(32,32,3)))
    vgg_model.add(keras.layers.BatchNormalization(momentum=0.9))

    vgg_model.add(keras.layers.Conv2D(32, (3,3), padding="same",activation="relu"))
    vgg_model.add(keras.layers.BatchNormalization(momentum=0.9))

    vgg_model.add(keras.layers.MaxPool2D(pool_size=(2,2), padding="same"))
    vgg_model.add((keras.layers.Dropout(rate=0.25)))

    vgg_model.add(keras.layers.Conv2D(64, (3, 3), padding="same", activation="relu"))
    vgg_model.add(keras.layers.BatchNormalization(momentum=0.9))

    vgg_model.add(keras.layers.Conv2D(64, (3, 3), padding="same", activation="relu"))
    vgg_model.add(keras.layers.BatchNormalization(momentum=0.9))

    vgg_model.add(keras.layers.MaxPool2D(pool_size=(2, 2), padding="same"))
    vgg_model.add((keras.layers.Dropout(rate=0.25)))

    vgg_model.add(keras.layers.Flatten())
    vgg_model.add(keras.layers.Dense(512, activation="relu"))
    vgg_model.add(keras.layers.BatchNormalization(momentum=0.9))
    vgg_model.add((keras.layers.Dropout(rate=0.25)))

    vgg_model.add(keras.layers.Dense(10, activation="softmax"))
    return vgg_model

if os.path.exists('D:/Code/Python/module/cifar_module.h5'):
    module = keras.models.load_model('D:/Code/Python/module/cifar_module.h5')
else:
    module = build_model()
    module.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])
    history = module.fit(train_image, train_label, epochs=50)
    module.save('D:/Code/Python/module/cifar_module.h5')
test_image = np.array(test_image)
test_label = np.array(test_label)
result_loss,result_predition = module.evaluate(test_image,test_label,verbose=2)
def show_train_history(train_history,train,validation):
    plt.plot(train_history.history[train])#训练数据的执行结果
    plt.plot(train_history.history[validation])#验证数据的执行结果
    plt.ylabel(train)
    plt.xlabel('epoch')
    plt.legend(['loss','accuracy'],loc='upper left')
    plt.show()
print("验证集:",result_predition)
show_train_history(history,'loss','accuracy')
下面是一个使用PyTorch中的VGG模型CIFAR数据集进行分类的代码示例: ```python import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms from torchvision.models import vgg16 # 定义数据预处理的转换 transform = transforms.Compose([ transforms.Resize((224, 224)), transforms.ToTensor(), transforms.Normalize(mean=[0.5, 0.5, 0.5], std=[0.5, 0.5, 0.5]) ]) # 加载训练集和测试集 train_dataset = datasets.CIFAR10(root='./data', train=True, download=True, transform=transform) test_dataset = datasets.CIFAR10(root='./data', train=False, download=True, transform=transform) # 创建数据加载器 train_loader = torch.utils.data.DataLoader(train_dataset, batch_size=64, shuffle=True) test_loader = torch.utils.data.DataLoader(test_dataset, batch_size=64, shuffle=False) # 加载预训练VGG模型 model = vgg16(pretrained=True) # 修改最后一层全连接层的输出维度,使其适应CIFAR数据集的类别数(10个类别) num_features = model.classifier[6].in_features model.classifier[6] = nn.Linear(num_features, 10) # 定义损失函数和优化器 criterion = nn.CrossEntropyLoss() optimizer = optim.SGD(model.parameters(), lr=0.001, momentum=0.9) # 训练模型 device = torch.device("cuda" if torch.cuda.is_available() else "cpu") model.to(device) num_epochs = 10 for epoch in range(num_epochs): running_loss = 0.0 for images, labels in train_loader: images = images.to(device) labels = labels.to(device) optimizer.zero_grad() outputs = model(images) loss = criterion(outputs, labels) loss.backward() optimizer.step() running_loss += loss.item() print(f"Epoch {epoch+1} - Training loss: {running_loss / len(train_loader)}") # 在测试集上评估模型 model.eval() correct = 0 total = 0 with torch.no_grad(): for images, labels in test_loader: images = images.to(device) labels = labels.to(device) outputs = model(images) _, predicted = torch.max(outputs.data, 1) total += labels.size(0) correct += (predicted == labels).sum().item() accuracy = 100 * correct / total print(f"Accuracy on test set: {accuracy}%") ``` 在上述代码中,首先定义了数据预处理的转换,将图像调整大小为224x224并进行归一化处理。然后使用`datasets.CIFAR10`类加载CIFAR-10数据集。接着创建数据加载器,指定数据集和批次大小。 然后使用`torchvision.models.vgg16`加载预训练VGG模型,并修改最后一层全连接层的输出维度,以适应CIFAR数据集的类别数。定义损失函数和优化器。 接下来,将模型移动到GPU(如果可用),并进行训练训练过程中,迭代训练数据并计算损失,并进行反向传播和参数更新。 训练完成后,将模型设置为评估模式,并在测试集上进行评估。计算模型在测试集上的准确率并打印结果。 请确保已经安装了PyTorch和torchvision库,并将数据集下载到指定的路径(在上述代码中为'./data')。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值