毕业设计记录-Pytorch学习-使用预训练好的VGG16网络训练

2021.12.7的记录


照着书把代码打了一遍 在这里插入图片描述
在这里插入图片描述
训练了10个epoch,可以说是没有啥下降的趋势。有问题。

2021.12.8的记录

检查了很多遍代码之后,发现代码部分有编写错误,输入输出通道数一点要算对。确定代码没有问题后训练,但是为什么它的损失一直是同一个值。我将学习率减小了一百倍,发现损失是在一直减小的。但其实验证精确率已经达到了100%。
个人推断可能是由于网络性能,训练效果只能这样了。由于图片也不是很多,再加上是用的预训练好的特征提取层,用之前的学习率训练一轮直接就达到了局部最小值。

在这里插入图片描述

一些代码和函数的理解

nn.CrossEntropyLoss()

这个函数算的是一个step里batch_size张图片的平均损失。
训练部分代码:

        Myvggc.train()
        for step, (b_x, b_y) in enumerate(train_data_loader):
            b_x = b_x.to(device)
            b_y = b_y.to(device)
            output = Myvggc(b_x)
            loss = loss_func(output, b_y)
            print(loss.data)
            pre_lab = torch.argmax(output, 1)
            optimizer.zero_grad()
            loss.backward()
            optimizer.step()
            train_loss_epoch += loss.item() * b_x.size(0)
            train_corrects += torch.sum(pre_lab == b_y.data)
        train_loss = train_loss_epoch / len(train_data.targets)
        train_acc = train_corrects.double() / len(train_data.targets)
        print("train_loss=%f,train_acc=%f" % (train_loss, train_acc))

也就是这里的 loss为什么要乘以batch_size的原因,然后再相加得到一个epoch的总损失(train_loss_epoch),但最后又除了训练样本数,也就是最后得到的损失(train_loss )是每一张图像的平均损失。
然后这里的训练集精度就跟吴恩达老师机器学习里教的一样。先将预测到的结果与label对比,算有多少个1(也就是有多少预测对了)然后除以label总个数,就得到了精准度了。
然后画图部分的代码

            image = b_x[ii, :, :, :].numpy().transpose((1, 2, 0))
            image = std * image + mean
            # np.clip(a,a_min,a_max,out=none)该函数的作用是将数组a中的所有数限定到范围a_min和a_max中
            image = np.clip(image, 0, 1)
            plt.imshow(image)

.transpose((1, 2, 0)) 目的是将image的维度变换。原本image经过处理之后的维度是(channel,h,w)经过transpose后变成了(h,w,channel)。为什么要变呢?因为plt.imshow()要求输入的格式是(h,w,channel)

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,首先我们需要安装PyTorch,可以通过以下命令安装: ``` pip install torch torchvision ``` 然后我们加载预训练的VGG-16模型,可以使用以下代码: ```python import torch import torch.nn as nn import torchvision.models as models # 加载预训练的VGG-16模型 vgg16 = models.vgg16(pretrained=True) ``` 接下来,我们需要对图像进行预处理,使其能够被VGG-16模型接受。VGG-16模型需要输入的图像大小为224x224,而且需要进行标准化处理。我们可以使用以下代码对图像进行预处理: ```python import torchvision.transforms as 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]) ]) ``` 接下来,我们可以使用预处理后的图像作为输入,通过VGG-16模型进行前向传播得到预测结果。我们可以使用以下代码: ```python from PIL import Image # 加载图像 image = Image.open("image.jpg") # 预处理图像 image = transform(image) # 增加一个维度 image = image.unsqueeze(0) # 前向传播 output = vgg16(image) # 输出预测结果 print(output) ``` 其中,"image.jpg"是我们要分类的图像,可以根据需要替换为其他图像的路径。输出的结果是一个向量,表示图像属于1000个类别中的每一个类别的概率。我们可以使用以下代码获取最终的预测结果: ```python # 加载标签 with open("imagenet_classes.txt", "r") as f: categories = [s.strip() for s in f.readlines()] # 获取概率最大的类别 probs, indices = torch.topk(output, 5) for i in indices[0]: print(categories[i]) ``` 其中,"imagenet_classes.txt"是包含1000个类别标签的文件,可以在https://gist.github.com/yrevar/942d3a0ac09ec9e5eb3a下载到。输出的结果是概率最大的5个类别,我们可以根据需要修改输出的数量。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

芃芃です

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值