kaggle比赛:Classify Leaves(使用resnet50预训练模型进行:图片树叶分类)

本文介绍了如何利用resnet50预训练模型参与kaggle的树叶分类比赛。内容包括数据划分、图像增广、数据读取、模型构建、训练与验证、模型推理和结果提交,最终在kaggle上得到初步成绩。
摘要由CSDN通过智能技术生成

本文内容来源于《动手深度学习》一书。跟着沐神做kaggle比赛。

注:以下代码都在jupyter中完成。

1、比赛介绍:

该任务是:给出树叶的图片,将给出的树叶分成176类。

数据如下图所示,通过下面的网址,下载训练数据和测试数据:

在这里插入图片描述

比赛地址及数据下载地址:https://www.kaggle.com/c/classify-leaves/data

2、数据划分:

在开始之前,我们先看看数据集长什么样子:

在这里插入图片描述
其中.csv中存放的是图片的地址和对应的标签。

首先我们读取一下.csv中的数据,看看长什么样子:

# 下面两行是防止内核挂掉加的
import os
os.environ["KMP_DUPLICATE_LIB_OK"]="TRUE"

import collections
import math
import os
import shutil
import pandas as pd
import torch
import torchvision
from torch import nn
from d2l import torch as d2l
train_data = pd.read_csv(r"../data/classify-leaves/train.csv") # 训练数据
test_data = pd.read_csv(r"../data/classify-leaves/test.csv") # 测试数据
print(train_data.shape)
print(test_data.shape)
train_data # 训练数据有标签

输出:

在这里插入图片描述

test_data # 测试数据没有标签

输出:
在这里插入图片描述

我们可以观察到,train.csv中存放了训练数据集的图片相对地址和对应的标签,而test.csv中只存放了测试数据集的图片相对地址,标签需要我们预测么,当然没有了。

对数据有了一个直观的理解之后,接下来我们开始读取数据:读取数据集所在地址、并整理数据集。这里要注意,训练数据和测试数据都放在image文件夹下,我们需要通过train.csv和test.csv中的图片地址来将他们划分开。

整理数据集思路很简单:将训练数据集和测试数据集划分开,然后将训练数据集中每一个类建立一个文件夹,并把标签对应的图片复制一份到里面。(这里我们用到了验证数据集,和训练数据集操作是一样的)

下面的几个函数就是对上面的描述进行操作,都在注释中。

def read_csv_labels(fname):
    """读取 `fname` 来给标签字典返回一个文件名。"""
    with open(fname, 'r') as f:
        lines = f.readlines()[1:]
    tokens = [l.rstrip().split(',') for l in lines]
    return dict(((name, label) for name, label in tokens))

labels = read_csv_labels(os.path.join(data_dir, 'train.csv')) # 存放训练集标签的文件


def copyfile(filename, target_dir):
    """将文件复制到目标目录。"""
    os.makedirs(target_dir, exist_ok=True)
    shutil.copy(filename, target_dir)


def reorg_train_valid(data_dir, labels, valid_ratio):
    # 下面的collections.Counter就是统计label这个字典中有几个类别(返回字典);.most_common()则转换成元组;[-1][1]则返回最后一个元组的第二个值(因为这个类别数量最小)
    n = collections.Counter(labels.values()).most_common()[-1][1] # n就是数量最少类别对应的数量
    n_valid_per_label = max(1, math.floor(n * valid_ratio)) # 根据最小类别数量,得出验证集的数量
    label_count = {
   }
    for train_file in labels: # 返回训练集中的图片名字列表(我们看到,训练标签转换成的字典,key就是训练集的图片名字)
        label = labels[train_file] # 每张图片 对应的标签
        fname = os.path.join(data_dir, train_file) # 每个图片的完整路径
        copyfile(
            fname,
            os.path.join(data_dir, 'train_valid_test', 'train_valid', label)) # 将图片复制到指定的目录下,这个是为了交叉验证使用,这里和训练集没区别
        if label not in label_count or label_count[label] < n_valid_per_label: # 制作验证集。注:标签名作为key,value为每个标签的图片数量
            copyfile(
                fname,
                os.path.join(data_dir, 'train_valid_test'
  • 4
    点赞
  • 52
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值