当前位置:   article > 正文

深度学习基于Resnet18的图像多分类--训练自己的数据集(超详细 含源码)

resnet18

1.ResNet18原理

2.文件存储 一个样本存放的文件夹为dataset 下两个文件夹 train和test文件(训练和预测)

3.训练和测试的文件要相同。下面都分别放了 crane (鹤)、elephant(大象)、leopard(豹子)

4.编写预测的Python文件:code.py 跟dataset是同级路径。

5.code.py 训练模型源代码

6. 测试代码使用豹子的图像进行分类,复制自己的绝对路径。

7.预测结果达到了99.95%

图片素材链接:https://pan.baidu.com/s/1_l0IhiXFm83f1gb_YEOVtw
提取码:8888

1.ResNet18原理

        ResNet18是一个经典的深度卷积神经网络模型,由微软亚洲研究院提出,用于参加2015年的ImageNet图像分类比赛。ResNet18的名称来源于网络中包含的18个卷积层。

ResNet18的基本结构如下:

    输入层:接收大小为224x224的RGB图像。
    卷积层:共4个卷积层,每个卷积层使用3x3的卷积核和ReLU激活函数,提取图像的局部特征。
    残差块:共8个残差块,每个残差块由两个卷积层和一条跳跃连接构成,用于解决深度卷积神经网络中梯度消失和梯度爆炸问题。
    全局平均池化层:对特征图进行全局平均池化,将特征图转化为一维

    向量。
    全连接层:包含一个大小为1000的全连接层,用于分类输出。
    输出层:使用softmax激活函数,生成1000个类别的概率分布。

2.文件存储 一个样本存放的文件夹为dataset 下两个文件夹 train和test文件(训练和预测)

3.训练和测试的文件要相同。下面都分别放了 crane (鹤)、elephant(大象)、leopard(豹子)

4.编写预测的Python文件:code.py 跟dataset是同级路径。

5.code.py 训练模型源代码

  1. import os
  2. import torch
  3. import torchvision
  4. import torch.nn as nn
  5. import torch.nn.functional as F
  6. import torch.optim as optim
  7. from torchvision import models, datasets, transforms
  8. import torch.utils.data as tud
  9. import numpy as np
  10. from torch.utils.data import Dataset, DataLoader, SubsetRandomSampler
  11. from PIL import Image
  12. import matplotlib.pyplot as plt
  13. import warnings
  14. warnings.filterwarnings("ignore")
  15. device = torch.device("cuda:0" if torch.cuda.is_available() else 'cpu')
  16. n_classes = 3 # 几种分类的
  17. preteain = False # 是否下载使用训练参数 有网true 没网false
  18. epoches = 4 # 训练的轮次
  19. traindataset = datasets.ImageFolder(root='./dataset/train/', transform=transforms.Compose([
  20. transforms.RandomResizedCrop(224),
  21. transforms.RandomHorizontalFlip(),
  22. transforms.ToTensor(),
  23. transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])
  24. ]))
  25. testdataset = datasets.ImageFolder(root='./dataset/test/', transform=transforms.Compose([
  26. transforms.RandomResizedCrop(224),
  27. transforms.RandomHorizontalFlip(),
  28. transforms.ToTensor(),
  29. transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])
  30. ]))
  31. classes = testdataset.classes
  32. print(classes)
  33. model = models.resnet18(pretrained=preteain)
  34. if preteain == True:
  35. for param in model.parameters():
  36. param.requires_grad = False
  37. model.fc = nn.Linear(in_features=512, out_features=n_classes, bias=True)
  38. model = model.to(device)
  39. def train_model(model, train_loader, loss_fn, optimizer, epoch):
  40. model.train()
  41. total_loss = 0.
  42. total_corrects = 0.
  43. total = 0.
  44. for idx, (inputs, labels) in enumerate(train_loader):
  45. inputs = inputs.to(device)
  46. labels = labels.to(device)
  47. outputs = model(inputs)
  48. loss = loss_fn(outputs, labels)
  49. optimizer.zero_grad()
  50. loss.backward()
  51. optimizer.step()
  52. preds = outputs.argmax(dim=1)
  53. total_corrects += torch.sum(preds.eq(labels))
  54. total_loss += loss.item() * inputs.size(0)
  55. total += labels.size(0)
  56. total_loss = total_loss / total
  57. acc = 100 * total_corrects / total
  58. print("轮次:%4d|训练集损失:%.5f|训练集准确率:%6.2f%%" % (epoch + 1, total_loss, acc))
  59. return total_loss, acc
  60. def test_model(model, test_loader, loss_fn, optimizer, epoch):
  61. model.train()
  62. total_loss = 0.
  63. total_corrects = 0.
  64. total = 0.
  65. with torch.no_grad():
  66. for idx, (inputs, labels) in enumerate(test_loader):
  67. inputs = inputs.to(device)
  68. labels = labels.to(device)
  69. outputs = model(inputs)
  70. loss = loss_fn(outputs, labels)
  71. preds = outputs.argmax(dim=1)
  72. total += labels.size(0)
  73. total_loss += loss.item() * inputs.size(0)
  74. total_corrects += torch.sum(preds.eq(labels))
  75. loss = total_loss / total
  76. accuracy = 100 * total_corrects / total
  77. print("轮次:%4d|训练集损失:%.5f|训练集准确率:%6.2f%%" % (epoch + 1, loss, accuracy))
  78. return loss, accuracy
  79. loss_fn = nn.CrossEntropyLoss().to(device)
  80. optimizer = optim.Adam(model.parameters(), lr=0.0001)
  81. train_loader = DataLoader(traindataset, batch_size=32, shuffle=True)
  82. test_loader = DataLoader(testdataset, batch_size=32, shuffle=True)
  83. for epoch in range(0, epoches):
  84. loss1, acc1 = train_model(model, train_loader, loss_fn, optimizer, epoch)
  85. loss2, acc2 = test_model(model, test_loader, loss_fn, optimizer, epoch)
  86. classes = testdataset.classes
  87. transform = transforms.Compose([
  88. transforms.Resize((224, 224)),
  89. transforms.ToTensor(),
  90. transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])
  91. ])
  92. path = r'C:\Users\Administrator\Desktop\动物\dataset\test\leopard\img_test_850.jpg' # 测试图片路径
  93. model.eval()
  94. img = Image.open(path)
  95. img_p = transform(img).unsqueeze(0).to(device)
  96. output = model(img_p)
  97. pred = output.argmax(dim=1).item()
  98. plt.imshow(img)
  99. plt.show()
  100. p = 100 * nn.Softmax(dim=1)(output).detach().cpu().numpy()[0]
  101. print('该图像预测类别为:', classes[pred])
  102. # 三分类
  103. print('类别{}的概率为{:.2f}%,类别{}的概率为{:.2f}%,类别{}的概率为{:.2f}%'.format(classes[0], p[0], classes[1], p[1], classes[2], p[2]))

 6. 测试代码使用豹子的图像进行分类,复制自己的绝对路径。

7.预测结果达到了99.95%

如果自己的分类不止三种那么需要修改。我这里训练的是三种图像。根据自己实际情况填写。

还需修改,如果是四分类的话 多加一个 “类别{}的概率为{:.2f}%” 和 classes[3], p[3] ,因为索引是从0开始的 所以四分类的下标就为3。

  1. # 三分类
  2. print('类别{}的概率为{:.2f}%,类别{}的概率为{:.2f}%,类别{}的概率为{:.2f}%'.format(classes[0], p[0], classes[1], p[1], classes[2], p[2]))

制作不易 希望大家多多支持!

有问题可以联系我。添加备注 CSDN图像分类谢谢。QQ

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/686431
推荐阅读
相关标签
  

闽ICP备14008679号