Pytorch袖珍手册之二

pytorch pocket reference

原书下载地址:
我用阿里云盘分享了「OReilly.PyTorch.Pocket.R...odels.149209000X.pdf」,你可以不限速下载🚀
复制这段内容打开「阿里云盘」App 即可获取
链接:https://www.aliyundrive.com/s/NZvnGbTYr6C

第一章 Pytorch简介

从近几年来,Pytorch越来越受到研究者或工程应用人群的喜爱。

在本章节里,作者简要介绍什么是Pytorch及为什么它能受到如此广泛的使用(make it popular)。同时在本章节里也将介绍使用在云端或本地电脑安装使用Pytorch。最终我们将学会如何验证Pytorch是否正确安装和运行一个简单的Pytorch应用程序。

Pytorch是Facebook的人工智能研究实验室(FAIR)免费开源出来的人工智能框架,至今已有1700多名贡献者。

  • 易于数组结构类型的运算
  • 创建动态神经网络
  • 基于GPU加速的自动求解微分
  • 简单灵活的接口,便于实验测试(加载数据,调用数据转换,创建模型,同时可以自己很容易构建训练,验证,测试模式)
  • 生态圈的活跃度也高,如高校或知名大企业
    正是基于一些特性,Pytorch的使用者越来越多,他们当中有的人用于张量计算加速,有的则是用于深度学习开发。

Many developers and researchers use PyTorch to accelerate deep learning research experimentation and prototyping. Its simple Python API, GPU support, and flexibility make it a popular choice among academic and commercial research organizations.

随着使用人群及场景不断丰富,Pytorch的更新迭代也是很快,同时也迎合了不同设备的使用需求(云服务器和移动终端平台)。

一个好的AI框架能为我们在做人工智能应用研究带来诸多便利:加载数据,预处理,模型设计,训练及部署等环节。

A deep learning framework makes it easy to perform common tasks such data loading, preprocessing, model design, training, and deployment.

Pytorch几大优势

  • 不管是在高校圈还是在工程领域,Pytorch都是十分受欢迎的
  • Pytorch支持市面上大部分主流的云平台(AWS,GCP,Azure,阿里云)。
  • Pytorch支持谷歌的Colab及Kaggle比赛
  • Pytorch成熟及稳定(现在版本1.8,最新应该是为1.9)
  • Pytorch支持CPU,GPU,TPU及并行处理
  • Pytorch支持分布式训练
  • Pytorch应用容易部署到云端服务器(TorchScript, TorchServe)
  • Pytorch开始支持移动端设备部署应用(安卓,iOS)
  • Pytorch有较好的生态圈及相关补充优化包(NLP,CV)
  • Pytorch支持C++前端接口
  • Pytorch支持ONNX(Open Neural Network Exchange)
  • Pytorch社区活跃度高,用户众多

Pytorch安装与使用

该部分现在网上资源很多,在这笔记里我就不多记录了

主要是介绍了Pytorch在Google Colaboratory的使用,在云服务器的安装使用及本地电脑安装使用。
详细可参阅官方安装页面引导。
https://pytorch.org/get-started/locally/

import torch

# 查看版本号
print(torch.__version__)
# 参看是否支持GPU加速
print(torch.cuda.is_available())

一个有趣的例子

书中是直接通过urllib包对网上的一个张图片进行下载,鉴于国内网络问题,这里直接下载保存下来作为后续样例使用。

样例图片下载地址:https://www.aliyundrive.com/s/LqmvEpYgWMy

%matplotlib inline
import matplotlib.pyplot as plt
from PIL import Image

fpath = 'coffee.jpg'

img = Image.open(fpath)
plt.imshow(img)

# SIZE
print(img.size)
# CHANNELS  ('R', 'G', 'B')
print(img.getbands())
# RGB
print(img.mode)
coffee.png

从上面程序中我们可以得到该图片的尺寸是(1107 * 827),接下来我们通过Pytorch来对其进行一些图片预处理操作并转换为合适的格式,使其符合Pytorch的神经网络模型的数据类型需求(tensor)。

import torch
from torchvision import transforms

transform = transforms.Compose([
    transforms.Resize(256),
    transforms.CenterCrop(224),
    transforms.ToTensor(),
    transforms.Normalize(
            mean=[0.485, 0.456, 0.406],
            std=[0.229, 0.224, 0.225]
        )
])
# 将PIL Image转换为 tensor
img_tensor = transform(img)
print(type(img_tensor), img_tensor.shape)
# <class 'torch.Tensor'> torch.Size([3, 224, 224])

# 将tensor转换为PIL Image
# image = img_tensor.cpu().clone()
# image = image.squeeze(0) # 压缩一维
image = transforms.ToPILImage()(img_tensor) # 自动转换为0-255

plt.imshow(image)
transform

对比一下transform前后图片效果:

plt.figure(figsize=(8, 8)) 
plt.subplot(1, 2, 1)
plt.imshow(img)
plt.subplot(1, 2, 2)
plt.imshow(image)
plt.tight_layout()
plt.show()
after transform

在上面的例子中我们发现是通过Compose()方法对图片进行转换,且在这个过程中定义了一系列的转换器(a series of transforms),如resize,crop,totensor及归一化处理。

Normalizing the image improves the accuracy of the classifier.

基于已训练好的模型(AlexNet)进行图片分类预测

我们知道高效的机器学习处理过程,基本上都是基于批量(batches),所以对于我们刚加载进来的单张图片数据结构,需要做一些“加批量”维度处理。
在pytorch中我们调用unsqueeze()方法即可对单张图片数据增加一个维度作为批量值,即整个数据结构变为[1, 3, 224, 224],其中1表示批量值为1,3为RGB三个通道,224*224为图片输入尺寸大小。

样例中ImageNet的labels数据文件下载地址:https://www.aliyundrive.com/s/NoLcfzUeXLv

batch = img_tensor.unsqueeze(0)
print(batch.shape)
# torch.Size([1, 3, 224, 224])

接下来就是调用AlexNet模型对图片进行推理预测。
AlexNet作为经典的分类模型,这里也不做过多介绍,大家可以自己百度了解相关内容。

%matplotlib inline
import matplotlib.pyplot as plt
from PIL import Image
import torch
from torchvision import transforms, models

# 定义device,便于后面程序使用
device = 'cuda' if torch.cuda.is_available() else 'cpu'

# 图片地址及imagenet的类别文件地址
image_path = 'coffee.jpg'
imagenet_labels_path = 'imagenet_class_labels.txt'

# 读取图片
img = Image.open(image_path)
# 显示图片
# plt.imshow(img)

# 定义转换器
transform = transforms.Compose([
    transforms.Resize(256),
    transforms.CenterCrop(224),
    transforms.ToTensor(),
    transforms.Normalize(
            mean=[0.485, 0.456, 0.406],
            std=[0.229, 0.224, 0.225]
        )
])

# 转换为tensor
img_tensor = transform(img)

# 将tensor转换为PIL Image格式
image_trans = transforms.ToPILImage()(img_tensor) # 自动转换为0-255

# plt.imshow(image_trans)
# transform前后图片对比
plt.figure(figsize=(8, 8)) 
plt.subplot(1, 2, 1)
plt.imshow(img)
plt.subplot(1, 2, 2)
plt.imshow(image_trans)
plt.tight_layout()
plt.show()

# 构建batch形式的单张图片结构[batch-size, channels, width, height]
batch = img_tensor.unsqueeze(0)
print(batch.shape) 
# torch.Size([1, 3, 224, 224])

# 加载alexnet模型,pretrained=True,表示带训练好的参数模型
model = models.alexnet(pretrained=True)

# eval()表示模型仅用于推理或预测,并不对相关参数进行更新操作。
model.eval()
model.to(device)
y = model(batch.to(device))
# print(y.shape)
# torch.Size([1, 1000])

y_max, index = torch.max(y, 1)
# print(index, y_max)
# tensor([967], device='cuda:0') tensor([21.9117], device='cuda:0', grad_fn=<MaxBackward0>)
# 与分类名及索引对应起来
with open('imagenet_class_labels.txt') as f:
    classes = [line.strip() for line in f.readlines()]
# print(classes[967])
# 967: 'espresso'

prob = torch.nn.functional.softmax(y, dim=1)[0] * 100
print(classes[index[0]], prob[index[0]].item())
# 967: 'espresso', 86.61658477783203

# 查看前面几个分值
_, indices = torch.sort(y, descending=True)
print('查看前面几个分值及类别:')
for idx in indices[0][:5]:
    print(classes[idx], prob[idx].item())

prediction

从上图中,我们可以看出预测的结果还是比较可信的(espresso,浓缩咖啡)。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,941评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,397评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,345评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,851评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,868评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,688评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,414评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,319评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,775评论 1 315
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,945评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,096评论 1 350
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,789评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,437评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,993评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,107评论 1 271
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,308评论 3 372
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,037评论 2 355

推荐阅读更多精彩内容