pytorch搭建卷积神经网络【第二课

pytorch搭建卷积神经网络【第二课,第1张

文章目录
  • 前言
  • 1. 导入模型管理模块
  • 2. 模型实例化
  • 3. 导入数据处理模块
  • 4. img数据转tensor 数据预处理
  • 5. 图像转tensor
  • 6. 评估设置
  • 7. tensor传入Net
  • 8. 标签加载
  • 9. 预测值排序
  • 10. 执行softmax 把预测值转换为百分比
  • 11. 对列表中元素排列 descending=True 为降序排列
  • 12. 降序排列前五个 第0维 bichsize
  • 总结


前言

但是如何快速搭建一个简单的神经网络而不是定义一个类再去调用,以及我们定义了一个网络并训练好,该如何在日后去调用这个网络去实现相应的功能。



源码路径:github:https://github.com/2012Netsky/pytorch_cnn/blob/main/1_making_sure_things_work.py


1. 导入模型管理模块
#!/usr/bin/env python
# coding: utf-8

# 1.导入模型管理模块
from torchvision import models

# 查看模型
# dir(models)
2. 模型实例化
# 2.模型实例化
alexnet = models.AlexNet()

# 2.模型实例化 属性为预测 下载权值
 resnet = models.resnet101(pretrained=True)
3. 导入数据处理模块
# 3.导入数据处理模块
from torchvision import transforms

4. img数据转tensor 数据预处理
# 4.img数据转tensor 数据预处理
# 缩放图像到256X256
# 围绕中心裁剪图像到224X224
# 将图像转换成一个张量
# 对RGB归一化处理使其具有定义定义均值和标准差(均值和标准差是另外方式计算的,在此直接利用即可)
preprocess = 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] )])


# 数据查看
from PIL import Image
img = Image.open("../data/p1ch2/bobby.jpg")

# img图像传入torch
img_t = preprocess(img)
5. 图像转tensor
# 导入核心模块
import torch
''' 5. 
先看torch.squeeze() 这个函数主要对数据的维度进行压缩,去掉维数为1的的维度,比如是一行或者一列这种,
一个一行三列(1,3)的数去掉第一个维数为一的维度之后就变成(3)行。


squeeze(a)就是将a中所有为1的维度删掉。


不为1的维度没有影响。


a.squeeze(N) 就是去掉a中指定的维数为一的维度。


还有一种形式就是b=torch.squeeze(a,N) a中去掉指定的定的维数为一的维度。


再看torch.unsqueeze()这个函数主要是对数据维度进行扩充。


给指定位置加上维数为一的维度,比如原本有个三行的数据(3), 在0的位置加了一维就变成一行三列(1,3)。


a.squeeze(N) 就是在a中指定位置N加上一个维数为1的维度。


还有一种形式就是b=torch.squeeze(a,N) a就是在a中指定位置N加上一个维数为1的维度 ''' batch_t = torch.unsqueeze(img_t, 0)

6. 评估设置
# 6. 在新数据上运行训练过的模型 称为推理inference 为了进行推理 需要把网络置于eval 之前把网络设置为pretraines=ture是为了获取权值
resnet.eval()
7. tensor传入Net
# 7. tensor传入resnet(tensor格式 batch—img—R—G—B 先把图像转tensor 然后再增减batch维度)
out = resnet(batch_t)
8. 标签加载
# Python strip() 方法用于移除字符串头尾指定的字符(默认为空格或换行符)或字符序列。


# 注意:该方法只能删除开头或是结尾的字符,不能删除中间部分的字符。


# 8. imagenet_classes.txt的每一行作为list的一个元素 with open('../data/p1ch2/imagenet_classes.txt') as f: labels = [line.strip() for line in f.readlines()]

9. 预测值排序
# 9. output = torch.max(input, dim)
# 在分类问题中,通常需要使用max()函数对softmax函数的输出值进行 *** 作,求出预测值索引,然后与标签进行比对,计算准确率。


# 下面讲解一下torch.max()函数的输入及输出值都是什么,便于我们理解该函数。


# input是softmax函数输出的一个tensor # dim是max函数索引的维度0/1,0是每列的最大值,1是每行的最大值 # 函数会返回两个tensor,第一个tensor是每行的最大值;第二个tensor是每行最大值的索引。


_, index = torch.max(out, 1)

10. 执行softmax 把预测值转换为百分比
# 10.执行softmax 把预测值转换为百分比
percentage = torch.nn.functional.softmax(out, dim=1)[0] * 100
labels[index[0]], percentage[index[0]].item()
# 官方文档解释.item()用法是:一个元素张量可以用x.item()得到元素值,我理解的就是一个是张量,一个是元素

# 第0个维度是bichsize 第一个维度是图像
torch.nn.functional.softmax(out, dim=1)
torch.nn.functional.softmax(out, dim=1)[0]
11. 对列表中元素排列 descending=True 为降序排列
# 11. 对列表中元素排列 descending=True 为降序排列
_, indices = torch.sort(out, descending=True)
12. 降序排列前五个 第0维 bichsize
# 12. 降序排列前五个 第0维 bichsize
[(labels[idx], percentage[idx].item()) for idx in indices[0][:5]]


总结

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/571409.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-09
下一篇 2022-04-09

发表评论

登录后才能评论

评论列表(0条)

保存