CIFAR10模型代码详解——基于土堆教学的pytorch实现


前言

上传一下CIFAR10模型的pytorch代码,方便以后或者需要的人看。


一、CIFAR10模型结构

CIFAR10模型结构
(1)输入input是3个通道的32x32大小的数据,该模型输入为cifar10
(2)经过一个5x5的kernelsize的卷积,变成32通道的32x32的大小,通道变成32是因为用了32个3x5x5的卷积核,每一个卷积核生成一个输出通道,且每个输出通道由RGB三个通道的卷积核滑动输出值相加得到,就是说一个3x5x5的卷积核分别在输入数据的3个通道上滑动,输出的3个通道的值加起来,共1x32x32(没看懂慢慢细品)
(3)经过一个最大池化,尺寸减半为32通道的16x16大小(最大池化不改变通道数)
(4)再经过一次卷积,通道数和尺寸没变,还是32x16x16
(5)再经过一次最大池化,尺寸减半为32通道的8x8大小
(6)再经过一次卷积,通道数变为64,尺寸不变
(7)再经过一次最大池化,尺寸减半为64通道的4x4大小
(8)Flatten展开为64x4x4大小的64通道的1行(4x4方队变1行长队伍)
(9)通过全连接层把输出变为10(cifar10有10个类)

二、代码

1.model(网络结构)部分

代码如下:

import torch
from torch import nn


class Tudui(nn.Module):
    def __init__(self):
        super(Tudui,self).__init__()
        self.model=nn.Sequential(
            nn.Conv2d(3,32,5,1,2),
            nn.MaxPool2d(2),
            nn.Conv2d(32,32,5,1,2),
            nn.MaxPool2d(2),
            nn.Conv2d(32,64,5,1,2),
            nn.MaxPool2d(2),
            nn.Flatten(),
            nn.Linear(1024, 64),
            nn.Linear(64, 10)
        )
    def forward(self,x):
        x=self.model(x)
        return x


if __name__ == '__main__':
    tudui=Tudui()
    input=torch.ones(64,3,32,32)
    output=tudui(input)
    print(output.shape)

2.训练部分

代码如下:

import torch
import torchvision.datasets
from tensorboardX import SummaryWriter
from torch import nn
from torch.utils.data import DataLoader

from model import Tudui
import time

train_data=torchvision.datasets.CIFAR10(root="./data",train=True,transform=torchvision.transforms.ToTensor(),
                                        download=True)
test_data=torchvision.datasets.CIFAR10(root='./data',train=False,transform=torchvision.transforms.ToTensor(),
                                       download=True)
train_data_size=len(train_data)
test_data_size=len(test_data)
print("训练集的长度为:{}".format(train_data_size))
print("测试机的长度为:{}".format(test_data_size))

train_dataloader=DataLoader(train_data,batch_size=64)
test_dataloader=DataLoader(test_data,batch_size=64)

#创建网络模型
tudui=Tudui()

#损失函数
loss_fn=nn.CrossEntropyLoss()

#优化器
learning_rate=0.01
optimizer=torch.optim.SGD(tudui.parameters(),lr=learning_rate)

#设置训练网络的一些参数
#记录训练的次数
total_train_step=0
#记录测试的次数
total_test_step=0
#训练的轮数
epoch=10
#添加tensorboard
writer=SummaryWriter("log")

start_time=time.time()
for i in range(epoch):
    print("-----------------第{}轮训练开始---------".format(i+1))

    #训练步骤开始
    tudui.train()
    for data in train_dataloader:
        imgs,targets=data
        outputs=tudui(imgs)
        loss=loss_fn(outputs,targets)

        #优化器优化模型
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()

        total_train_step+=1
        if total_train_step%100==0:
            end_time=time.time()
            print(end_time-start_time)
            print("训练次数:{},loss:{}".format(total_train_step,loss.item()))
            writer.add_scalar("train_loss",loss.item(),total_train_step)

    #测试步骤开始
    tudui.eval()
    total_test_loss=0
    total_accuracy=0
    with torch.no_grad():
        for data in test_dataloader:
            imgs,targets=data
            outputs=tudui(imgs)
            loss=loss_fn(outputs,targets)
            total_test_loss=total_test_loss+loss.item()
            accuracy=(outputs.argmax(1)==targets).sum()
            total_accuracy=total_accuracy+accuracy
    print("整体测试集上的loss:{}".format(total_test_loss))
    print("整体测试集上的正确率:{}".format(total_accuracy/test_data_size))
    writer.add_scalar("test_loss",total_test_loss,total_test_step)
    total_test_step+=1

    torch.save(tudui,"tudui_{}.pth".format(i))
    #torch.save(tudui.state_dict(),"tudui_{}.pth".format(i))
    print("模型已保存")
writer.close()

把model代码建立一个python文件命名为model,再建立一个新的python文件存放训练部分,其中的from model import Tudui就可以调用model文件的类啦,然后直接运行训练部分文件即可。

3.训练部分(gpu)

训练默认使用cpu,可能有点慢,想快一点需要调用gpu那么代码需要做一些修改
代码如下:

import torch
import torchvision.datasets
from tensorboardX import SummaryWriter
from torch import nn
from torch.utils.data import DataLoader

from model import Tudui
import time

train_data=torchvision.datasets.CIFAR10(root="./data",train=True,transform=torchvision.transforms.ToTensor(),
                                        download=True)
test_data=torchvision.datasets.CIFAR10(root='./data',train=False,transform=torchvision.transforms.ToTensor(),
                                       download=True)
train_data_size=len(train_data)
test_data_size=len(test_data)
print("训练集的长度为:{}".format(train_data_size))
print("测试机的长度为:{}".format(test_data_size))

train_dataloader=DataLoader(train_data,batch_size=64)
test_dataloader=DataLoader(test_data,batch_size=64)

#创建网络模型
tudui=Tudui()
tudui=tudui.cuda()

#损失函数
loss_fn=nn.CrossEntropyLoss()

#优化器
learning_rate=0.01
optimizer=torch.optim.SGD(tudui.parameters(),lr=learning_rate)

#设置训练网络的一些参数
#记录训练的次数
total_train_step=0
#记录测试的次数
total_test_step=0
#训练的轮数
epoch=100
#添加tensorboard
writer=SummaryWriter("log")
start_time=time.time()
for i in range(epoch):
    print("-----------------第{}轮训练开始---------".format(i+1))

    #训练步骤开始
    tudui.train()
    for data in train_dataloader:
        imgs,targets=data
        imgs=imgs.cuda()
        targets=targets.cuda()
        outputs=tudui(imgs)
        loss=loss_fn(outputs,targets)

        #优化器优化模型
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()

        total_train_step+=1
        if total_train_step%100==0:
            end_time=time.time()
            print(end_time-start_time)
            print("训练次数:{},loss:{}".format(total_train_step,loss.item()))
            writer.add_scalar("train_loss",loss.item(),total_train_step)

    #测试步骤开始
    tudui.eval()
    total_test_loss=0
    total_accuracy=0
    with torch.no_grad():
        for data in test_dataloader:
            imgs,targets=data
            imgs=imgs.cuda()
            targets=targets.cuda()
            outputs=tudui(imgs)
            loss=loss_fn(outputs,targets)
            total_test_loss=total_test_loss+loss.item()
            accuracy=(outputs.argmax(1)==targets).sum()
            total_accuracy=total_accuracy+accuracy
    print("整体测试集上的loss:{}".format(total_test_loss))
    print("整体测试集上的正确率:{}".format(total_accuracy/test_data_size))
    writer.add_scalar("test_loss",total_test_loss,total_test_step)
    total_test_step+=1

    torch.save(tudui,"./pth/tudui_{}.pth".format(i))
    #torch.save(tudui.state_dict(),"tudui_{}.pth".format(i))
    print("模型已保存")
writer.close()



总结

本文详细介绍了CIFAR10模型结构及其pytorch实现代码,有问题欢迎评论或私信联系。

  • 6
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
下面是一个使用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')。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值