[深度学习] Pytorch学习(二)—— torch.nn 实践:训练分类器(含多GPU训练CPU加载预测的使用方法)

Learn From:

Pytroch 官方Tutorials
Pytorch 官方文档

环境:python3.6 CUDA10 pytorch1.3 vscode+jupyter扩展

#%%
#%%
# 1.Loading and normalizing CIFAR10

import torch
import torchvision
import torchvision.transforms as transforms

batch_size = 16

transform = transforms.Compose( [transforms.ToTensor(),
    transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))] )
# 对图像的预处理,用在加载数据时,当作函数传给transform参数

trainset = torchvision.datasets.CIFAR10(root='./data', train=True,
                                download=True, transform=transform)
trainloader = torch.utils.data.DataLoader(trainset, batch_size=batch_size,
                                shuffle=True, num_workers=0)
testset = torchvision.datasets.CIFAR10(root='./data', train=False,
                                download=True, transform=transform)
testloader = torch.utils.data.DataLoader(testset, batch_size=batch_size,
                                shuffle=False, num_workers=0)
classes = ('plane', 'car', 'bird', 'cat',
           'deer', 'dog', 'frog', 'horse', 'ship', 'truck')

#%%
import matplotlib.pyplot as plt
import numpy as np
# functions to show an image
def imshow(img):
    img = img / 2 + 0.5     # unnormalize
    npimg = img.numpy()
    print( npimg.shape )
    plt.imshow(np.transpose(npimg, (1, 2, 0)))
    print( np.transpose( npimg, (1, 2, 0) ).shape )
    plt.show()
# get some random training images
dataiter = iter(trainloader)
# images torch.Size([16, 3, 32, 32]). labels torch.Size([16])
images, labels = dataiter.next()
# show images
imshow(torchvision.utils.make_grid(images))
# print labels
print(' '.join('%5s' % classes[labels[j]] for j in range(batch_size)))

#%%
# 2.Define a Convolutional Neural Network

import torch.nn as nn
import torch.nn.functional as F

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

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

net = Net()
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
net = nn.DataParallel(net)  # 多GPU
net.to(device)  #GPU

#%%
# 3.Define a Loss Function and optimizer

import torch.optim as optim
criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(net.parameters(), lr=0.001, momentum=0.9)

#%%
# 4.Train the network

for epoch in range(2):
    running_loss = 0.0
    for i, data in enumerate(trainloader, 0):
        inputs, labels = data   # torch.Size([16, 3, 32, 32])
        # GPU
        inputs, labels = inputs.to(device), labels.to(device)
        # zero the parameter gradients
        optimizer.zero_grad()
        # forward + backward + optimize
        outputs = net(inputs)
        loss = criterion(outputs, labels)
        loss.backward()
        optimizer.step()

        running_loss += loss.item()
        if i % 500 == 499:
            print('[%d ,%5d] loss: %.3f' %
                    (epoch+1, i+1, running_loss/2000))
            running_loss = 0.0
print("Finished Training")
# save trained model:
PATH = 'cifar_net.pth'
torch.save(net.module.state_dict(), PATH)
# 这样保存到模型就可以在CPU下运行

#%%
# 5.Test the network on the test data
# 为了练习多GPU训练模型,单CPU环境测试、运行模型,以下测试都是CPU的使用方法
dataiter = iter(testloader)
images, labels = dataiter.next()
imshow(torchvision.utils.make_grid(images))
print('GroundTruth: ',
        ''.join('%5s' % classes[labels[j]] for j in range(batch_size)))

net = Net()
net.load_state_dict(torch.load(PATH))    # 加载 CPU模型
# 输出的是能量能量越大的 是这个类的可能性越大
outputs = net(images)
# 按行取最大值
_, predicted = torch.max(outputs, 1)
print('Predicted: ',
        ''.join('%5s' % classes[predicted[j]] for j in range(batch_size)))

# Let us look at how the network performs on the whole dataset
correct = 0
total = 0
with torch.no_grad():
    for data in testloader:
        images, labels = data
        # GPU
        # images, labels = images.to(device), labels.to(device)
        outputs = net(images)
        _, predicted = torch.max(outputs.data, 1)
        total += labels.size(0)
        correct += (predicted == labels).sum().item()
print('Accuracy of the network on the 10000 test images: %d %%'
    % (100 * correct / total))

# what are the classes that performed well,
# and the classes that did not perform well
class_correct = list(0. for i in range(10))
class_total = list(0. for i in range(10))
with torch.no_grad():
    for data in testloader:
        images, labels = data
        # images, labels = images.to(device), labels.to(device)
        outputs = net(images)
        _, predicted = torch.max(outputs, 1)
        c = (predicted == labels).squeeze()
        for i in range(batch_size):
            label = labels[i]
            class_correct[label] += c[i].item()
            class_total[label] += 1

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

结果:



原文地址:https://www.cnblogs.com/importGPX/p/11706720.html

时间: 2024-10-03 22:15:03

[深度学习] Pytorch学习(二)—— torch.nn 实践:训练分类器(含多GPU训练CPU加载预测的使用方法)的相关文章

深入java虚拟机(二)——类的生命周期(上)类的加载和连接

类加载器,顾名思义,类加载器(class loader)用来加载 Java 类到 Java 虚拟机中.一般来说,Java 虚拟机使用 Java 类的方式如下:Java 源程序(.java 文件)在经过 Java 编译器编译之后就被转换成 Java 字节代码(.class 文件).类加载器负责读取 Java 字节代码,并转换成 java.lang.Class类的一个实例.每个这样的实例用来表示一个 Java 类.通过此实例的 newInstance()方法就可以创建出该类的一个对象.实际的情况可能

Torch7学习笔记(二)nn Package

神经网络Package [目前还属于草稿版,等我整个学习玩以后会重新整理] 模块Module module定义了训练神经网络需要的所有基础方法,并且是可以序列化的抽象类. module有两种状态变量:output和gradInput [output] forward(input) 利用input对象计算其对应的output.通常input和output都是Tensor类型的.有时候会有例外例如table layers(Tensor的子类).Forward之后,output变量应该被更新为新的值了

PyTorch里面的torch.nn.Parameter()

在刷官方Tutorial的时候发现了一个用法self.v = torch.nn.Parameter(torch.FloatTensor(hidden_size)),看了官方教程里面的解释也是云里雾里,于是在栈溢网看到了一篇解释,并做了几个实验才算完全理解了这个函数.首先可以把这个函数理解为类型转换函数,将一个不可训练的类型Tensor转换成可以训练的类型parameter并将这个parameter绑定到这个module里面(net.parameter()中就有这个绑定的parameter,所以在

神经网络学习--PyTorch学习03 搭建模型

torch.nn (1)用于搭建网络结构的序列容器:torch.nn.Sequential models = torch.nn.Sequential( torch.nn.Linear(input_data, hidden_layer), torch.nn.ReLU(), torch.nn.Linear(hidden_layer, output_data) ) from collections import OrderedDict # 使用有序字典 使模块有自定义的名次 models2 = tor

vue学习指南:第十二篇(详细) - Vue的 路由 第二篇 ( 路由按需加载(懒加载))

各位朋友 因 最近工作繁忙,小编停更了一段时间,快过年了,小编祝愿 大家 事业有成 学业有成 快乐健康 2020开心过好每一天.从今天开始 我会抽时间把 Vue 的知识点补充完整,以及后期会带给大家更完善的知识体系!!! 路由的按需加载(懒加载) 我们都知道 vue的路由是我们必学的,也是不可分离的一部分,我们传统引入路由的方式是这样的, import Home from '@/components/home/Home' 但是在真正项目的开发中,这种现象是杜绝的,是不建议使用这种传统方式引入的.

【Java EE 学习第47天】【Hibernate学习第四天】【sesion】【一级缓存】【懒加载】

一.Session概述 1.Session 接口是 Hibernate 向应用程序提供的操纵对数据库的最主要的接口, 它提供了基本的保存, 更新, 删除和加载Java 对象的方法. 2.理解Session的缓存 使用缓存的目的:尽量减少访问数据库的频率 (1)在 Session 接口的实现中包含一系列的 Java 集合, 这些 Java 集合构成了 Session 缓存. 只要 Session 实例没有结束生命周期, 存放在它缓存中的对象也不会结束生命周期 (2)当session的save()方

读书笔记(二)—— 浅析浏览器渲染过程和html中的文件加载

在构建页面时,我们会在html中载入一个或多个css和js文件.或许大家都已经习惯了"最佳实践"中,css文件应该放在<head>标签中引入,而js文件则是放在</body>关闭标签前引入的原则,但其中的原因,很多人可能像我之前一样,不是了解得很清楚.在查阅了书籍和资料后,稍微了解的其中的原由. 让我们先看一看浏览器中的渲染流程: 主流程: 详细流程: 当浏览器获得一个html文件时,会"自上而下"加载,并在加载过程中进行解析渲染.     

zookeeper学习系列:二、api实践

上一章我们知道zookeeper的简介,启动,设置节点以及结构性能.本小节我们来玩玩api,获取下数据. 读一下:http://zookeeper.apache.org/doc/trunk/javaExample.html 然后我说 what the fuck it is? 我就想读个数据,需要这么复杂么... 动手改一下 版本1:  只获取数据,不管别的: import org.apache.zookeeper.KeeperException; import org.apache.zookee

(Object-C)学习笔记 --OC的懒加载和单例方法

OC的懒加载 什么是懒加载: 懒加载——也称为延迟加载,即在需要的时候才加载(效率低,占用内存小).所谓懒加载,写的是其get方法. 注意:如果是懒加载的话则一定要注意先判断是否已经有了,如果没有那么再去进行实例化. 懒加载的好处 (1)不必将创建对象的代码全部写在viewDidLoad方法中,代码的可读性更强 (2)每个控件的getter方法中分别负责各自的实例化处理,代码彼此之间的独立性强,松耦合 懒加载的例子: #import "MusicTableViewController.h&quo