「卷积神经网络」实战 Kaggle 竞赛:树叶分类

简介: 「卷积神经网络」实战 Kaggle 竞赛:树叶分类

导入必要的库。
%matplotlib inline
import random
import torch
from torch import nn
from torch.nn import functional as F
from torchvision import datasets, transforms
import pandas as pd
import matplotlib.pyplot as plt
from d2l import torch as d2l
from PIL import Image
读取训练数据与测试数据,并转化为 NumPy 格式,方便后续实现自定义 Dataset。
train_data = pd.read_csv('./data/train.csv')
test_data = pd.read_csv('./data/test.csv')

train_images = train_data.iloc[:, 0].values
pred_images = test_data.iloc[:, 0].values
train_labels = pd.get_dummies(train_data.iloc[:, 1]).values.argmax(1)
train_labels_header = pd.get_dummies(train_data.iloc[:, 1]).columns.values

n_train = train_images.shape[0]
继承 torch.utils.Dataset 类,自定义树叶分类数据集。
class CLASSIFY_LEAVES(torch.utils.data.Dataset):

def __init__(self, root, images, labels, transform):
    super(CLASSIFY_LEAVES, self).__init__()
    self.root = root
    self.images = images
    if labels is None:
        self.labels = None
    else:
        self.labels = labels
    self.transform = transform
def __getitem__(self, index):
    image_path = self.root + self.images[index]
    image = Image.open(image_path)
    image = self.transform(image)
    if self.labels is None:
        return image
    label = torch.tensor(self.labels[index])
    return image, label
def __len__(self):
    return self.images.shape[0]

def load_data(images, labels, batch_size, train):

aug = []
if (train):
    aug = [transforms.RandomHorizontalFlip(),
           transforms.RandomVerticalFlip(),
           transforms.ColorJitter(brightness=0.5, contrast=0.5, saturation=0.5, hue=0.5),
           transforms.ToTensor()]
else:
    aug = [transforms.ToTensor()]
transform = transforms.Compose(aug)
dataset = CLASSIFY_LEAVES('./data/', images, labels, transform=transform)
return torch.utils.data.DataLoader(dataset=dataset, batch_size=batch_size, num_workers=8, shuffle=train)

使用 ResNet-18 网络,并初始化。
net = get_resnet18()

def init_weights(m):

if type(m) == nn.Linear or type(m) == nn.Conv2d:
    nn.init.xavier_uniform_(m.weight)

net.apply(init_weights)
定义训练函数,使用多 GPU 训练。
def accuracy(y_hat, y):

return (y_hat.argmax(1) == y).sum()

def train(net, train_iter, test_iter, num_epochs, lr, devices):

net = nn.DataParallel(net, device_ids = devices).to(devices[0])
optimizer = torch.optim.Adam(net.parameters(), lr=lr)
loss = nn.CrossEntropyLoss()
animator = d2l.Animator(xlabel='epoch', xlim=[1, num_epochs], legend=['train acc', 'test acc'])
for epoch in range(num_epochs):
    train_loss_tot, train_acc_tot, train_tot = 0, 0, 0
    test_acc_tot, test_tot = 0, 0
    net.train()
    for X, y in train_iter:
        optimizer.zero_grad()
        X, y = X.to(devices[0]), y.to(devices[0])
        y_hat = net(X)
        l = loss(y_hat, y)
        l.backward()
        optimizer.step()
        with torch.no_grad():
            train_loss_tot += l * X.shape[0]
            train_acc_tot += accuracy(y_hat, y)
            train_tot += X.shape[0]
    net.eval()
    with torch.no_grad():
        for X, y in test_iter:
            X, y = X.to(devices[0]), y.to(devices[0])
            test_acc_tot += accuracy(net(X), y)
            test_tot += X.shape[0]
    train_loss = train_loss_tot / train_tot
    train_acc = train_acc_tot / train_tot
    test_acc = test_acc_tot / test_tot
    animator.add(epoch + 1, (train_acc.cpu(), test_acc.cpu()))
    torch.save(net.state_dict(), 'resnet18.params')

随机抽取 15000 个训练数据,以及 3000 个测试数据,并初始化迭代器。
train_slices = random.sample(list(range(n_train)), 15000)
test_slices = list(set(range(n_train)) - set(train_slices))

train_iter = load_data(train_images[train_slices], train_labels[train_slices], 512, train=True)
test_iter = load_data(train_images[test_slices], train_labels[test_slices], 512, train=False)
训练。
train(net, train_iter, test_iter, 10, 0.01, [torch.device('cuda:0'),

                                         torch.device('cuda:1')])

预测,并写入 submission.csv。注意推理仍需要在 GPU 上运行。
pred_iter = load_data(pred_images, None, 256, train=False)

def predict(net, pred_iter):

net.to(torch.device('cuda:0'))
net.eval()
prediction = []
for index, X in enumerate(pred_iter):
    X = X.to('cuda:0')
    prediction.extend(train_labels_header[net(X).argmax(1).cpu()])
test_data['label'] = prediction
test_data.to_csv('./data/submission.csv', index=None)

predict(net, pred_iter)

目录
相关文章
|
15天前
|
数据采集 存储 JSON
Python网络爬虫:Scrapy框架的实战应用与技巧分享
【10月更文挑战第27天】本文介绍了Python网络爬虫Scrapy框架的实战应用与技巧。首先讲解了如何创建Scrapy项目、定义爬虫、处理JSON响应、设置User-Agent和代理,以及存储爬取的数据。通过具体示例,帮助读者掌握Scrapy的核心功能和使用方法,提升数据采集效率。
58 6
|
13天前
|
机器学习/深度学习 计算机视觉 Python
【YOLOv11改进 - 注意力机制】SimAM:轻量级注意力机制,解锁卷积神经网络新潜力
【YOLOv11改进 - 注意力机制】SimAM:轻量级注意力机制,解锁卷积神经网络新潜力本文提出了一种简单且高效的卷积神经网络(ConvNets)注意力模块——SimAM。与现有模块不同,SimAM通过优化能量函数推断特征图的3D注意力权重,无需添加额外参数。SimAM基于空间抑制理论设计,通过简单的解决方案实现高效计算,提升卷积神经网络的表征能力。代码已在Pytorch-SimAM开源。
【YOLOv11改进 - 注意力机制】SimAM:轻量级注意力机制,解锁卷积神经网络新潜力
|
7天前
|
机器学习/深度学习 人工智能 自然语言处理
深度学习中的卷积神经网络:从理论到实践
【10月更文挑战第35天】在人工智能的浪潮中,深度学习技术以其强大的数据处理能力成为科技界的宠儿。其中,卷积神经网络(CNN)作为深度学习的一个重要分支,在图像识别和视频分析等领域展现出了惊人的潜力。本文将深入浅出地介绍CNN的工作原理,并结合实际代码示例,带领读者从零开始构建一个简单的CNN模型,探索其在图像分类任务中的应用。通过本文,读者不仅能够理解CNN背后的数学原理,还能学会如何利用现代深度学习框架实现自己的CNN模型。
|
6天前
|
机器学习/深度学习 人工智能 算法框架/工具
深度学习中的卷积神经网络(CNN)及其在图像识别中的应用
【10月更文挑战第36天】探索卷积神经网络(CNN)的神秘面纱,揭示其在图像识别领域的威力。本文将带你了解CNN的核心概念,并通过实际代码示例,展示如何构建和训练一个简单的CNN模型。无论你是深度学习的初学者还是希望深化理解,这篇文章都将为你提供有价值的见解。
|
16天前
|
数据采集 前端开发 中间件
Python网络爬虫:Scrapy框架的实战应用与技巧分享
【10月更文挑战第26天】Python是一种强大的编程语言,在数据抓取和网络爬虫领域应用广泛。Scrapy作为高效灵活的爬虫框架,为开发者提供了强大的工具集。本文通过实战案例,详细解析Scrapy框架的应用与技巧,并附上示例代码。文章介绍了Scrapy的基本概念、创建项目、编写简单爬虫、高级特性和技巧等内容。
39 4
|
16天前
|
网络协议 物联网 API
Python网络编程:Twisted框架的异步IO处理与实战
【10月更文挑战第26天】Python 是一门功能强大且易于学习的编程语言,Twisted 框架以其事件驱动和异步IO处理能力,在网络编程领域独树一帜。本文深入探讨 Twisted 的异步IO机制,并通过实战示例展示其强大功能。示例包括创建简单HTTP服务器,展示如何高效处理大量并发连接。
38 1
|
7天前
|
机器学习/深度学习 人工智能 自动驾驶
深入解析深度学习中的卷积神经网络(CNN)
深入解析深度学习中的卷积神经网络(CNN)
21 0
|
10天前
|
机器学习/深度学习 人工智能 TensorFlow
深度学习中的卷积神经网络(CNN)及其在图像识别中的应用
【10月更文挑战第32天】本文将介绍深度学习中的一个重要分支——卷积神经网络(CNN),以及其在图像识别领域的应用。我们将通过一个简单的代码示例,展示如何使用Python和TensorFlow库构建一个基本的CNN模型,并对其进行训练和测试。
|
15天前
|
网络协议 调度 开发者
Python网络编程:Twisted框架的异步IO处理与实战
【10月更文挑战第27天】本文介绍了Python网络编程中的Twisted框架,重点讲解了其异步IO处理机制。通过反应器模式,Twisted能够在单线程中高效处理多个网络连接。文章提供了两个实战示例:一个简单的Echo服务器和一个HTTP服务器,展示了Twisted的强大功能和灵活性。
28 0
|
16天前
|
机器学习/深度学习 自然语言处理 TensorFlow
深度学习中的卷积神经网络(CNN)及其应用
【10月更文挑战第26天】在这篇文章中,我们将深入探讨卷积神经网络(CNN)的基本原理、结构和应用。CNN是深度学习领域的一个重要分支,广泛应用于图像识别、语音处理等领域。我们将通过代码示例和实际应用案例,帮助读者更好地理解CNN的概念和应用。