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])
预训练识别的结果: