Kaggle树叶分类Leaves Classify总结

前言

作为初学者,在Kaggle上获得了最高95.6%的识别准确率的一个及格成绩,本文作为总结和分享
Kaggle Classify Leaves竞赛地址

Kaggle成绩分享

工具准备


pytorch可视化

使用Visdom进行数据可视化的操作

安装visdom

pip install visdom

或者到visdom的github下载后到根目录安装
https://github.com/fossasia/visdom

cd visdom
pip install -e .

在terminal输入以下命令启动visdom

visdom
或
python -m visdom.server

启动visdom后,如果出现

Downloading scripts, this may take a little while

不要按照visdom服务启动时提示Downloading scripts, this may take a little while解决办法所说下载script替换,这样会导致server在浏览器打开后图像不会实时更新的问题
直接上梯子等一会就行

由于我是python3.8,所以会出现NotImplementedError
参照关于Python3.8运行Visdom.server抛出NotImplementedError异常的解决方法即可

成功启动后显示

Checking for scripts.
It's Alive!
INFO:root:Application Started
You can navigate to http://localhost:8097

在浏览器中输入http://localhost:8097即可打开
visdom服务网页终端


visdom例程

import torch
from torchvision.models import AlexNet
from torch.optim.lr_scheduler import CosineAnnealingLR
from visdom import Visdom
import time

visdom = Visdom()
# 创建一个初始点位为(0, 0),window句柄为test,标题为test的图像窗口
visdom.line(Y=[0], X=[0], win='test', opts=dict(title='test', legend=['test1', 'test2'])) 

numEpochs = 75
model = AlexNet(num_classes=2)
optimizer = torch.optim.Adam(model.parameters(), lr=0.1)
scheduler1 = CosineAnnealingLR(optimizer,T_max=numEpochs)

for epoch in range(numEpochs):
    optimizer.zero_grad()
    optimizer.step()
    scheduler1.step()
    updatedLearningRate1 = scheduler1.get_last_lr()[0]

    # 将图像加入visdom
    visdom.line(Y=[updatedLearningRate1], X=[epoch], win='test', update='append', name='test1') # name需要与legend对应
    visdom.line(Y=[epoch*0.001], X=[epoch/10], win='test', update='append', name='test2')
    time.sleep(0.1)

visdom例程效果图


数据增强库

torchvision

具体请参照玩转pytorch中的torchvision.transforms


CutMix

pip install git+https://github.com/ildoonet/cutmix 

程序预处理准备

创建树叶种类标签枚举体

import pandas as pd

# 树叶种类标签枚举体
leavesLabels = sorted(list(set(pd.read_csv('classify-leaves/train.csv')['label'])))
ELeavesLabels = dict(zip(leavesLabels, range(len(leavesLabels))))
# 类别数量
nClass = len(leavesLabels)
# 再转换回来,最后预测的时候使用
ELeavesLabelsInverse = {
   }
for label, index in ELeavesLabels.items():
   ELeavesLabelsInverse[index] = label

自定义Dataset

# 继承pytorch的dataset,创建自己的
class CLeavesData(Dataset):
    def __init__(self, csv_path, file_path, mode='unknown', valid_ratio=0.2, transform=None):
        """
        Args:
            csv_path (string): csv 文件路径
            file_path (string): 图像文件所在路径
            mode (string): 训练模式还是测试模式
            valid_ratio (float): 验证集比例
        """
        self.file_path = file_path
        self.mode = mode
        self.transform = transform

        # 读取 csv 文件
        self.data_info = pd.read_csv(csv_path)
        # 计算 数据长度和训练集长度
        self.data_length = len(self.data_info.index) - 1
        self.train_length = int(self.data_length * (1 - valid_ratio
  • 8
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,你可以按照以下步骤使用PyTorch编写使用resnet101预训练模型进行图片树叶分类的代码: 1. 导入必要的库和模块: ```python import torch import torch.nn as nn import torchvision.models as models import torchvision.transforms as transforms from torch.utils.data import DataLoader ``` 2. 定义数据预处理: ```python 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]) ]) ``` 3. 加载数据集: ```python dataset = torchvision.datasets.ImageFolder(root='path/to/dataset', transform=transform) dataloader = DataLoader(dataset, batch_size=32, shuffle=True) ``` 4. 加载预训练模型: ```python model = models.resnet101(pretrained=True) ``` 5. 修改模型的最后一层: ```python num_ftrs = model.fc.in_features model.fc = nn.Linear(num_ftrs, 176) ``` 在这里,176是你数据集中的类别数。 6. 定义损失函数和优化器: ```python criterion = nn.CrossEntropyLoss() optimizer = torch.optim.SGD(model.parameters(), lr=0.001, momentum=0.9) ``` 7. 训练模型: ```python num_epochs = 10 for epoch in range(num_epochs): for images, labels in dataloader: optimizer.zero_grad() outputs = model(images) loss = criterion(outputs, labels) loss.backward() optimizer.step() ``` 在这里,我们训练模型10个epoch。 8. 在测试集上进行评估: ```python correct = 0 total = 0 with torch.no_grad(): for images, labels in testloader: outputs = model(images) _, predicted = torch.max(outputs.data, 1) total += labels.size(0) correct += (predicted == labels).sum().item() print('Accuracy of the model on the test images: %d %%' % (100 * correct / total)) ``` 这些是使用PyTorch编写使用resnet101预训练模型进行图片树叶分类的基本步骤。你需要根据自己的具体情况进行相应的修改。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值