30Kaggle
竞赛:图片分类
比赛链接: https://www.kaggle.com/c/classify-leaves
导入包
import torch
import torchvision
from torch.utils.data import Dataset, DataLoader
from torchvision import transforms
import numpy as np
import pandas as pd
from torch import nn
import matplotlib.pyplot as plt
from PIL import Image
import os
from torch.nn import functional as F
import torch.optim as optim
import liliPytorch as lp
import torchvision.models as models
预处理:数据集分析
train_path = '../data/classify-leaves/train.csv'
test_path = '../data/classify-leaves/test.csv'
file_path = '../data/classify-leaves/'
# # 读取训练和测试数据
train_data = pd.read_csv(train_path)
test_data = pd.read_csv(test_path)
# 打印数据形状
print(train_data.shape) # (18353, 2)
print(test_data.shape) # (8800, 1)
#生成描述性统计数据
print(train_data.describe())
"""
image label
count 18353 18353
unique 18353 176
top images/0.jpg maclura_pomifera
freq 1 353
"""
# 查看不同树叶的数量
print(train_data['label'].value_counts())
"""
label
maclura_pomifera 353
ulmus_rubra 235
prunus_virginiana 223
acer_rubrum 217
broussonettia_papyrifera 214
...
cedrus_deodara 58
ailanthus_altissima 58
crataegus_crus-galli 54
evodia_daniellii 53
juniperus_virginiana 51
Name: count, Length: 176, dtype: int64
"""
1.数据处理与加载
train_path = '../data/classify-leaves/train.csv'
test_path = '../data/classify-leaves/test.csv'
file_path = '../data/classify-leaves/'
# 树叶的名字统计
labels_unique = train_data['label'].unique()
# print(labels_unique)
# 树叶标签的数量
labels_num = len(labels_unique)
# 提取出树叶标签,并排序
leaves_labels = sorted(list(set(train_data['label'])))
# print(leaves_labels)
# 将树叶标签对应数字
labels_to_num = dict(zip(leaves_labels, range(labels_num )))
# print(labels_to_num)
# 将数字对应树叶标签(用于后续预测)
num_to_labels = {
value : key for key, value in labels_to_num.items()}
# print(num_to_labels)
class LeavesDataset(Dataset):
def __init__(self, csv_path, file_path, mode='train', valid_ratio=0.2, resize_height=224, resize_width=224):
"""
初始化 LeavesDataset 对象。
参数:
csv_path (str): 包含图像路径和标签的 CSV 文件路径。
file_path (str): 图像文件所在目录的路径。
mode (str, optional): 数据集的模式。可以是 'train', 'valid' 或 'test'。默认值为 'train'。
valid_ratio (float, optional): 用于验证的数据比例。默认值为 0.2。
resize_height (int, optional): 调整图像高度的大小。默认值为 224。
resize_width (int, optional): 调整图像宽度的大小。默认值为 224。
"""
# 存储图像调整大小的高度和宽度
self.resize_height = resize_height
self.resize_width = resize_width
# 存储图像文件路径和模式(train/valid/test)
self.file_path = file_path
self.mode = mode
# 读取包含图像路径和标签的 CSV 文件
self.data_info = pd.read_csv(csv_path, header=0)
# 获取样本总数
self.data_len = len(self.data_info.index)
# 计算训练集样本数
self.train_len = int(self.data_len * (1 - valid_ratio))
# 根据模式处理数据
if self.mode == 'train':
# 训练模式下的图像和标签
self.train_img = np.asarray(self.data_info.iloc[0:self.train_len, 0])
self.train_label = np.asarray(self.data_info.iloc[0:self.train_len, 1])
self.image_arr = self.train_img
self.label_arr = self.train_label
elif self.mode == 'valid':
# 验证模式下的图像和标签
self.valid_img = np.asarray(self.data_info.iloc[self.train_len:, 0])
self.valid_label = np.asarray(self.data_info.iloc[self.train_len:, 1])
self.image_arr = self.valid_img
self.label_arr = self.valid_label
elif self.mode == 'test':
# 测试模式下的图像
self.test_img = np.asarray(self.data_info.iloc