cifar10的pytorch尝试

cifar10的pytorch尝试

根据官网教程
解决问题

```python
import torch
import torchvision
import torchvision.transforms as transforms
import matplotlib.pyplot as plt
import numpy as np
import os
import torch.nn as nn
import torch.nn.functional as F
import torch.optim as optim
from time import *


os.environ["KMP_DUPLICATE_LIB_OK"]="TRUE"
transform = transforms.Compose(
    [transforms.ToTensor(),
     transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))])
# range [0, 255] -> [0.0,1.0],channel=(channel-mean)/std(因为transforms.ToTensor()已经把数据处理成[0,1],那么(x-0.5)/0.5就是[-1.0, 1.0])


trainset = torchvision.datasets.CIFAR10(root='./data', train=True,
                                        download=True, transform=transform)
trainloader = torch.utils.data.DataLoader(trainset, batch_size=4,
                                          shuffle=True, num_workers=2)
#将shuffle参数设置为True,在装载的过程会将数据随机打乱顺序并进行打包。
#num_workers=2  每次提取数据多进进程为2

testset = torchvision.datasets.CIFAR10(root='./data', train=False,
                                       download=True, transform=transform)
testloader = torch.utils.data.DataLoader(testset, batch_size=8,
                                         shuffle=False, num_workers=2)

classes = ('plane', 'car', 'bird', 'cat', 'deer', 'dog', 'frog', 'horse', 'ship', 'truck')

class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        self.conv1 = nn.Conv2d(3, 6, 3)
        self.conv2 = nn.Conv2d(6, 10, 3)
        self.pool = nn.MaxPool2d(2,2)
        self.conv3 = nn.Conv2d(10, 16, 3)
        self.conv4 = nn.Conv2d(16, 32, 3)
        self.fc1 = nn.Linear(32 * 5 * 5, 120)
        self.fc2 = nn.Linear(120, 84)
        self.fc3 = nn.Linear(84, 10)

    def forward(self, x):
        x = self.conv1(x)
        x = F.relu(x)
        x = self.conv2(x)
        x = F.relu(x)
        x = self.pool(x)
        x = self.conv3(x)
        x = F.relu(x)
        x = self.conv4(x)
        x = F.relu(x)
        x = self.pool(x)
        x = x.view(-1, 32 * 5 * 5)
        x = F.relu(self.fc1(x))
        x = F.relu(self.fc2(x))
        x = self.fc3(x)
        return x

if __name__ == '__main__':
    begin_time = time()
    net = Net()
    criterion = nn.CrossEntropyLoss()#交叉熵损失函数
    optimizer = optim.SGD(net.parameters(), lr=0.001, momentum=0.9)
    for epoch in range(20):  # loop over the dataset multiple times
        running_loss = 0.0
        for i, data in enumerate(trainloader, 0):
            # get the inputs; data is a list of [inputs, labels]
            inputs, labels = data
            img_grid = torchvision.utils.make_grid(inputs)
            # forward + backward + optimize
            outputs = net(inputs)
            loss = criterion(outputs, labels)

            # zero the parameter gradients
            optimizer.zero_grad()
            loss.backward()
            optimizer.step()

            # print statistics
            running_loss += loss.item()
            if i % 2000 == 1999:  # print every 2000 mini-batches
                print('[%d, %5d] loss: %.3f' %(epoch + 1, i + 1, running_loss / 2000))
                running_loss = 0.0
            #i=10000/batch_size,每次从trainloader拿出batch_size,拿i次

    print('Finished Training')
    PATH = './cifar_net.pth'
    torch.save(net.state_dict(), PATH)


    for param_tensor in net.state_dict():
        print(param_tensor, '\t', net.state_dict()[param_tensor].size())

    dataiter = iter(testloader)
    images, labels = dataiter.next()
    net.load_state_dict(torch.load(PATH))


    #outputs = net(images)
   # predicted_num, predicted = torch.max(outputs, 1)
    #print('Predicted: ', ' '.join('%5s' % predicted[j] for j in range(8)))
    # outputs.data是一个8x10张量,将每一行的最大的那一列的值和序号各自组成一个一维张量返回,第一个是值的张量,第二个是序号的张量。
    #print('Predicted_class: ', ' '.join('%5s' % classes[predicted[j]]for j in range(8)))


    class_correct = list(0. for i in range(10))
    class_total = list(0. for i in range(10))
    with torch.no_grad():
        num_test = 1
        for data in testloader:
            print("nun_test", num_test)
            images, labels = data
            print("labels",labels)
            outputs = net(images)
            _, predicted = torch.max(outputs, 1)
            # outputs.data是一个batch_size * 10张量,将每一行的最大的那一列的值和序号各自组成一个一维张量返回,第一个是值的张量,第二个是序号的张量。
            print("predicted",predicted)
            c = (predicted == labels).squeeze()
            print("c",c)
            for i in range(8):
                label = labels[i]
                class_correct[label] += c[i].item()
                class_total[label] += 1

            num_test +=1


    classtotal_num = 0
    classcorrect_num=0
    for i in range(10):
        print('Accuracy of %5s : %2d %%' % (classes[i], 100 * class_correct[i] / class_total[i]))
        classtotal_num +=class_total[i]
        classcorrect_num +=class_correct[i]

    print('Accuracy',classcorrect_num/classtotal_num)

    end_time = time()
    print("run_time=",end_time-begin_time)

在这里插入图片描述

结果:
1、自己搭建的CNN
输入33232
第一层卷积nn.Conv2d(3, 6, 3),relu激活
第二层卷积nn.Conv2d(6, 10, 3),relu激活
池化nn.MaxPool2d(2,2)
第三层卷积nn.Conv2d(10, 16, 3),relu激活
第四层卷积nn.Conv2d(16, 32, 3),relu激活
池化nn.MaxPool2d(2,2)
全连接self.fc1 = nn.Linear(32 * 5 * 5, 120)
全连接self.fc2 = nn.Linear(120, 84)
全连接self.fc3 = nn.Linear(84, 10)
CPU
train:batch_size=4
test:batch_size=8
num_work=2
epoch=20
time=4718.630249977112
准确率65%
如下图
在这里插入图片描述

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值