GoogLeNet 遥感场景分类 学习记录

该博客介绍了如何利用PyTorch和预训练的GoogLeNet模型对UC-Merced土地覆盖分类数据集进行图像分类。作者首先创建了一个自定义的Dataset类,处理数据集的读取和预处理。接着,通过去除GoogLeNet的最后一个全连接层并添加新的分类层,使其适应21类的分类任务。网络训练结果显示,经过多轮训练,模型在验证集上的准确率达到了90%以上。
摘要由CSDN通过智能技术生成

基于PyTorch,使用预训练的GoogLeNet实现UC-Merced数据集分类

数据集准备

数据集样本量不大:UC-Merced数据集及介绍
由于torchvision中并没有UC-Merced数据集,因此要自己提前下载,作为自己的数据集使用。

本文首先制作数据集的List文件(索引),然后用Dataset类导入。

import torch
import torch.nn as nn
import torch.utils as utils
from torch.utils.data import DataLoader, Dataset
from PIL import Image
import torchvision.models as models
import torchvision.transforms as transforms
class MyDataset(Dataset):
    def __init__(self, txt, transform=None, target_transform=None, loader=default_loader):
        super(MyDataset, self).__init__()
        fh = open(txt, 'r')
        imgs = []
        for line in fh:
            # 移除字符串首尾的换行符, 以tab为分隔符 将字符串分成
            line = line.strip('\n')
            words = line.split('\t')
            imgs.append((words[0], int(words[1]))) 
        self.imgs = imgs
        self.transform = transforms.Compose([transforms.Resize((image_size, image_size)),
                                             transform])
        self.target_transform = target_transform
        self.loader = loader

    def __getitem__(self, index):
        fn, label = self.imgs[index]
        # 调用定义的loader方法
        img = self.loader(fn)
        if self.transform is not None:
            img = self.transform(img)
        return img, label

    def __len__(self):
        return len(self.imgs)
        
train_dataset = MyDataset(txt=root + 'Train List.txt', transform=transforms.ToTensor())
test_dataset = MyDataset(txt=root + 'Test List.txt', transform=transforms.ToTensor())

这里一定要重写__getitem__(self, index),len(self)两个方法。
txt文件中记录了每个图片的存储地址(第一列)和标签(第二列)。

定义网络

使用自己写的CNN分类,效果不好,测试正确率仅30%左右!?调参未见提高。因此转而先用torchvision中自带的pre-trained网络来做。

加载预训练的模型,可以先print(net)查看网络的结构。
去除网络最后的那个全连接层,自己增加self.classifier部分,使得输出为21类,且便于部分训练。报错(mat1 与 mat2 不匹配等等),可以多print来改。

用PyTorch推荐的.to(device)将张量复制到GPU上。

class Net(nn.Module):
    def __init__(self, model):
        super(Net, self).__init__()
        self.GolN_layer = nn.Sequential(*list(model.children())[:-1])
        self.classifier = nn.Sequential(nn.Linear(in_features=1024, out_features=1024),
                                        nn.ReLU(inplace=True),
                                        nn.Linear(in_features=1024, out_features=21)
                                        )

    def forward(self, x):
#        print('before:', x.size())
        x = self.GolN_layer(x)
#        print('googled:', x.size())
        x = x.view(-1, 1024)
#        print('before claasified:', x.size())
        x = self.classifier(x)
        return x


gnet_pretrained = models.googlenet(pretrained=True)
mynet = Net(gnet_pretrained)
mynet = mynet.to(device)

使用GPU

在训练时,除上面定义实例,还要把张量迁移到GPU上。

    for batch_idx, (data, target) in enumerate(train_loader):
    	mynet.train()
        inp, label = data.to(device), target.to(device)
        optimizer.zero_grad()
        outp = mynet(inp)
        loss = criterion(outp, label)
        loss.backward()
        optimizer.step()

训练结果

训练周期: 15 [0/1784 (0%)]	Loss: 0.273342		训练正确率: 100.00%	校验正确率: 92.17%
训练周期: 15 [400/1784 (22%)]	Loss: 0.023752		训练正确率: 95.79%	校验正确率: 92.17%
训练周期: 15 [800/1784 (45%)]	Loss: 0.521515		训练正确率: 95.52%	校验正确率: 88.70%
训练周期: 15 [1200/1784 (67%)]	Loss: 0.958793		训练正确率: 95.35%	校验正确率: 93.04%
训练周期: 15 [1600/1784 (90%)]	Loss: 0.035471		训练正确率: 95.45%	校验正确率: 89.57%
Current Training epoch: 15,	Current Testing Acc: 95.50%
-----------------------------------
训练周期: 16 [0/1784 (0%)]	Loss: 0.037701		训练正确率: 100.00%	校验正确率: 90.43%
训练周期: 16 [400/1784 (22%)]	Loss: 0.143321		训练正确率: 96.04%	校验正确率: 93.04%
训练周期: 16 [800/1784 (45%)]	Loss: 0.045256		训练正确率: 96.02%	校验正确率: 93.04%
训练周期: 16 [1200/1784 (67%)]	Loss: 0.407427		训练正确率: 96.76%	校验正确率: 89.57%
训练周期: 16 [1600/1784 (90%)]	Loss: 0.040848		训练正确率: 96.82%	校验正确率: 95.65%
训练周期: 17 [0/1784 (0%)]	Loss: 0.104182		训练正确率: 100.00%	校验正确率: 93.04%
训练周期: 17 [400/1784 (22%)]	Loss: 0.457662		训练正确率: 95.79%	校验正确率: 90.43%
训练周期: 17 [800/1784 (45%)]	Loss: 0.293050		训练正确率: 96.52%	校验正确率: 89.57%
训练周期: 17 [1200/1784 (67%)]	Loss: 0.053018		训练正确率: 96.84%	校验正确率: 94.78%
训练周期: 17 [1600/1784 (90%)]	Loss: 0.067211		训练正确率: 96.51%	校验正确率: 88.70%
训练周期: 18 [0/1784 (0%)]	Loss: 0.022396		训练正确率: 100.00%	校验正确率: 93.04%
训练周期: 18 [400/1784 (22%)]	Loss: 0.780139		训练正确率: 97.77%	校验正确率: 92.17%
训练周期: 18 [800/1784 (45%)]	Loss: 1.022786		训练正确率: 97.26%	校验正确率: 89.57%
训练周期: 18 [1200/1784 (67%)]	Loss: 0.057382		训练正确率: 97.34%	校验正确率: 92.17%
训练周期: 18 [1600/1784 (90%)]	Loss: 0.026848		训练正确率: 97.13%	校验正确率: 90.43%
训练周期: 19 [0/1784 (0%)]	Loss: 0.106134		训练正确率: 100.00%	校验正确率: 87.83%
训练周期: 19 [400/1784 (22%)]	Loss: 0.646356		训练正确率: 97.77%	校验正确率: 90.43%
训练周期: 19 [800/1784 (45%)]	Loss: 0.143579		训练正确率: 98.26%	校验正确率: 94.78%
训练周期: 19 [1200/1784 (67%)]	Loss: 0.352177		训练正确率: 97.92%	校验正确率: 89.57%
训练周期: 19 [1600/1784 (90%)]	Loss: 0.040774		训练正确率: 98.00%	校验正确率: 89.57%
训练周期: 20 [0/1784 (0%)]	Loss: 0.155777		训练正确率: 100.00%	校验正确率: 90.43%
训练周期: 20 [400/1784 (22%)]	Loss: 0.032036		训练正确率: 97.28%	校验正确率: 90.43%
训练周期: 20 [800/1784 (45%)]	Loss: 0.219169		训练正确率: 96.52%	校验正确率: 93.04%
训练周期: 20 [1200/1784 (67%)]	Loss: 1.495021		训练正确率: 97.01%	校验正确率: 90.43%
训练周期: 20 [1600/1784 (90%)]	Loss: 0.022227		训练正确率: 96.76%	校验正确率: 93.91%
Current Training epoch: 20,	Current Testing Acc: 93.00%
-----------------------------------
End of Training...

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

毕尔街日报

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

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

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

打赏作者

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

抵扣说明:

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

余额充值