深度学习(1):基于ResNet架构的一个识别小猪图像的预训练模型

1.什么是与训练模型:

下面截取了一位博主的博文,完整博文请看:https://blog.51cto.com/u_14013325/3239223
在这里插入图片描述

2.需要识别的图像:little_pig.jpeg

在这里插入图片描述

3.预训练代码:

import torch
from torchvision import models
from torchvision import transforms
from PIL import Image

# 对输入图像进行预处理,使其大小正确、值(颜色)大致处于相同的数值范围
preprocess = transforms.Compose([
    transforms.Resize(256),       # 将输入图像缩放到256 x 256
    transforms.CenterCrop(224),   # 围绕中心裁剪为224 x 224
    transforms.ToTensor(),        # 转换成张量(RGB颜色、宽度、高度)
    transforms.Normalize(         # 进行归一化处理
        mean = [0.485, 0.456, 0.406],    # 均值
        std = [0.229, 0.224, 0.225])     # 标准差
])
# 导入图像
img = Image.open("F:/Python_Deep_Learning/img/little_pig.jpeg")
img.show()

# 预处理管道传递图像
img_t = preprocess(img)

# 按照网络期望的方式对输入的张量进行重塑、裁剪和归一化处理
batch_t = torch.unsqueeze(img_t, 0)    # 0:数据为行方向扩,1:列方向扩

# resnet.eval() 是保证BN(批标准化)层能够用全部训练数据的均值和方差,即测试过程中要保证BN层的均值和方差不变
# 运行模型(测试),在 resnet(test)之前,需要加上resnet.eval(),否则,有输入数据,即使不训练,它也会改变权值。这是resnet中含有 BN 层和 Dropout 所带来的的性质。
# pretrained = True:指示函数下载resnet101在ImageNet数据集上训练好的权重
resnet = models.resnet101(pretrained = True)
resnet.eval()

# 如果不这么做,那么一些预先训练过的模型,如归一化和Dropout将不会产生有意义的答案。设置好eval,准备推理
# 可以打印查看神经网络的构建模块
print("############神经网络模块################")
print(resnet)

#######################################################################
# 先运行上面部分,接着加上下面部分运行(推理)
print("############ resnet(数据) ################")
out = resnet(batch_t)
print(out)
print("############ 训练后得到的结果的数据结构(1行1000列)################")
print(out.shape)

# 加载一个预测标签的列表,按照训练中呈现给网络的顺序列出标签,然后从网络中产生最高得分的索引挑选标签
with open("data/imagenet_classes.txt") as f :
    labels = [line.strip() for line in f.readlines()]     # 将f的内容全部放到lable中;按行读取f,strip:并将空格、分隔符都去掉;readlines:读行;
# 获得的out张量中最大值及对应的索引,即可对应标签(0:同一列中找出最大值,指出对应的行数; 1:同一行中找出最大值,指出对应的列数)
_, index = torch.max(out, 1)      # (0:列,1:行).  _,:具体的value,index:value所在的index

# 对n维输入张量运用Softmax函数,将张量的每个元素根据本身大小按比例缩放到(0,1)区间且和为1。
percentage = torch.nn.functional.softmax(out, dim=1) [0] * 100
print(labels[index[0]])
print("#########################")
print(percentage[index[0]].item())
print("#########################")

print("###########将所有预测以及概率的都显示##############")
_, indices = torch.sort(out, descending=True)   # True:递减排序
for idx in indices[0][:5]:
    print("idx: ", idx, "预测物体:", labels[idx], "预测概率:", percentage[idx])


预训练识别的结果:

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值