基于 PyTorch 的Cifar图像分类器代码实现(线性,全连接,卷积)

基于 PyTorch 的Cifar图像分类器代码实现

做实验的时候一共要求做三个实验分别是只使用线性层实现,通过全连接实现,通过卷积实现,代码也是参考了许多前人的代码,有一定程度的修改,然而准确度低的不成样子,望各位海涵。

同时本次的实验是在python 3.7 Jupyter上运行的,Cifar数据在py文件同级目录下的data文件中。由于我的显卡不支持CUDA因此都是直接用cpu搞定的。最长的100个epoch可能要跑一两个小时左右,基本上40个epoch就可以得出大概的结果

仅使用线性层实现图像分类  正确率百分之四十

import torch
import torch.nn as nn
import torchvision
import torchvision.transforms as transforms
import torchvision
import datetime

transform = transforms.Compose(
    [transforms.ToTensor(),
     transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))])
 
# 训练模型的超参数
input_size = 3072
output_size = 10
num_epochs = 50
batch_size = 64
learning_rate = 0.001
 

train_dataset = torchvision.datasets.CIFAR10(root='./data', train=True,
                                        download=True, transform=transform)

test_dataset = torchvision.datasets.CIFAR10(root='./data', train=False,
                                       download=True, transform=transform)
 
train_loader = torch.utils.data.DataLoader(dataset=train_dataset, 
                                           batch_size=batch_size, 
                                           shuffle=True)
 
test_loader = torch.utils.data.DataLoader(dataset=test_dataset, 
                                          batch_size=batch_size, 
                                          shuffle=False)

#线性层的建立
model = nn.Linear(input_size, output_size)
 
# 损失函数和优化算法
criterion = nn.CrossEntropyLoss()  
optimizer = torch.optim.SGD(model.parameters(), lr=learning_rate)  
 
# train_loader的大小,也就是含有多少个bach。
total_step = len(train_loader)
# 训练模型
# 在整个数据集上迭代的次数
for epoch in range(num_epochs):
    starttime = datetime.datetime.now()
    # 每次取一个bach进行训练。
    for i, (images, labels) in enumerate(train_loader):
        # 将数据reshape到模型需要的大小。
      
  • 7
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
好的,以下是一个使用PyTorch实现花朵分类的自定义卷积神经网络的示例代码: ```python import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms # 定义数据预处理 transform = transforms.Compose([ transforms.Resize(224), transforms.CenterCrop(224), transforms.ToTensor(), transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]) ]) # 加载数据 train_dataset = datasets.ImageFolder('./data/train', transform=transform) train_loader = torch.utils.data.DataLoader(train_dataset, batch_size=32, shuffle=True) test_dataset = datasets.ImageFolder('./data/test', transform=transform) test_loader = torch.utils.data.DataLoader(test_dataset, batch_size=32, shuffle=False) # 定义模型 class FlowerNet(nn.Module): def __init__(self): super(FlowerNet, self).__init__() self.conv1 = nn.Conv2d(3, 32, kernel_size=3, padding=1) self.bn1 = nn.BatchNorm2d(32) self.conv2 = nn.Conv2d(32, 64, kernel_size=3, padding=1) self.bn2 = nn.BatchNorm2d(64) self.conv3 = nn.Conv2d(64, 128, kernel_size=3, padding=1) self.bn3 = nn.BatchNorm2d(128) self.conv4 = nn.Conv2d(128, 256, kernel_size=3, padding=1) self.bn4 = nn.BatchNorm2d(256) self.fc1 = nn.Linear(256 * 7 * 7, 1024) self.fc2 = nn.Linear(1024, 5) self.dropout = nn.Dropout(0.5) def forward(self, x): x = nn.functional.relu(self.bn1(self.conv1(x))) x = nn.functional.max_pool2d(x, 2) x = nn.functional.relu(self.bn2(self.conv2(x))) x = nn.functional.max_pool2d(x, 2) x = nn.functional.relu(self.bn3(self.conv3(x))) x = nn.functional.max_pool2d(x, 2) x = nn.functional.relu(self.bn4(self.conv4(x))) x = nn.functional.max_pool2d(x, 2) x = x.view(-1, 256 * 7 * 7) x = nn.functional.relu(self.fc1(x)) x = self.dropout(x) x = self.fc2(x) return x model = FlowerNet() # 定义损失函数和优化 criterion = nn.CrossEntropyLoss() optimizer = optim.Adam(model.parameters(), lr=0.001) # 训练模型 for epoch in range(10): running_loss = 0.0 for i, (inputs, labels) in enumerate(train_loader): optimizer.zero_grad() outputs = model(inputs) loss = criterion(outputs, labels) loss.backward() optimizer.step() running_loss += loss.item() if i % 20 == 19: print('[%d, %d] loss: %.3f' % (epoch+1, i+1, running_loss/20)) running_loss = 0.0 # 在测试集上测试模型 correct = 0 total = 0 with torch.no_grad(): for inputs, labels in test_loader: outputs = model(inputs) _, predicted = torch.max(outputs.data, 1) total += labels.size(0) correct += (predicted == labels).sum().item() print('Accuracy on test set: %d %%' % (100 * correct / total)) ``` 这个示例代码中,我们定义了一个名为`FlowerNet`的类,继承自`nn.Module`,并在其中定义了一个包含卷积层、批量归一化层、线性层和Dropout层的卷积神经网络。我们使用`nn.functional`中的函数来定义网络的前向传播过程。在训练过程中,我们使用交叉熵损失函数和Adam优化来进行模型的优化。在测试过程中,我们使用测试集来测试模型的准确率。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值