PyTorch学习笔记(5)——Kaggle猫狗分类问题数据集读取和构建

Kaggle猫狗分类问题数据集处理

数据集官方下载:https://www.kaggle.com/c/dogs-vs-cats-redux-kernels-edition/data

参考资料:

import torch
import os
from PIL import Image
from torch.utils.data import DataLoader
import torchvision.transforms as transforms
import numpy as np
import matplotlib.pyplot as plt
# 数据集(训练集)所在目录
# ../data/Dog_Cat/train
label_mp = {"cat":0, "dog":1}
# 根据路径获取图片信息
def get_data(data_dir):
    data_dc = []
    for root, dirs, files in os.walk(data_dir):
        for img_name in files:
            img_path = os.path.join(data_dir, img_name)
            label = label_mp[img_name.split('.')[0]]
            data_dc.append((img_path, int(label)))
    return data_dc
# 自定义transform方法(椒盐噪声)
class MyTransform(object):
    def __init__(self, snr=0.9):
        super(MyTransform).__init__()
        self.snr = snr
    def __call__(self, img):
        img_ = np.array(img).copy()
        h, w, c = img_.shape
        mask = np.random.choice((0, 1, 2), size=(h, w, 1), p=[self.snr, (1 - self.snr) / 2, (1 - self.snr) / 2])
        mask = np.repeat(mask, c, axis=2)
        img_[mask == 1] = 255
        img_[mask == 2] = 0
        img_ = Image.fromarray(img_).convert('RGB')
        return img_
# 构建自己的Dataset
class DogCatDataset(torch.utils.data.Dataset):
    def __init__(self, data_dir, transfrom=None):
        super(DogCatDataset).__init__()
        self.data_dir = data_dir
        self.data_dc = get_data(data_dir)
        self.transform = transform
    
    def __getitem__(self, index):
        img_path, label = self.data_dc[index]
        img = Image.open(img_path).convert('RGB')
        if self.transform != None:
            img = self.transform(img)
        return img, label
    
    def __len__(self):
        return len(self.data_dc)
basic_dir = os.path.join(os.getcwd(), '../', 'data','Dog_Cat')
transform = transforms.Compose([
    transforms.Resize((32, 32)),
    MyTransform(snr=0.95),
    transforms.ToTensor(),
    transforms.Normalize(mean=[0.5, 0.5, 0.5], std=[0.2, 0.2, 0.2]),
])
train_dataset = DogCatDataset(data_dir=os.path.join(basic_dir, 'train'), transfrom=transform)
img_path = os.path.join(train_dataset.data_dc[0][0])
img = Image.open(img_path).convert('RGB')
plt.imshow(img)
plt.show()

在这里插入图片描述

# Dataloader
train_loader = DataLoader(dataset=train_dataset, batch_size=16, shuffle=True)
# 打印一个batch
for i, data in enumerate(train_loader):
    img, label = data
    print(img.size())
    print(label)
    break
torch.Size([16, 3, 32, 32])
tensor([1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 1, 1, 0])
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,你想了解关于 Kaggle 分类问题PyTorch 实现,是吗? 首先,你需要下载 Kaggle分类数据集。你可以从这个链接中下载:https://www.kaggle.com/c/dogs-vs-cats/data 接下来,你需要使用 PyTorch 搭建一个卷积神经网络模型。以下是一个简单的示例代码: ```python import torch.nn as nn import torch.optim as optim import torchvision.models as models class CatDogClassifier(nn.Module): def __init__(self): super(CatDogClassifier, self).__init__() self.resnet = models.resnet18(pretrained=True) self.fc = nn.Linear(1000, 2) def forward(self, x): x = self.resnet(x) x = self.fc(x) return x ``` 在这个示例中,我们使用了 ResNet18 模型,并在其之上添加了一个全连接层作为分类器。 接下来,你需要准备数据集。你可以使用 PyTorch 中的 `torchvision.datasets.ImageFolder` 类来读取数据集。以下是一个读取数据集的示例代码: ```python import torchvision.transforms as transforms from torchvision.datasets import ImageFolder data_transforms = transforms.Compose([ transforms.Resize((224, 224)), transforms.ToTensor(), ]) train_dataset = ImageFolder('data/train', transform=data_transforms) val_dataset = ImageFolder('data/val', transform=data_transforms) ``` 在这个示例中,我们使用了 `Resize` 和 `ToTensor` 转换来对数据进行预处理。 最后,你需要定义损失函数和优化器,并使用 PyTorch 中的`DataLoader`类来加载数据集。以下是一个训练模型的示例代码: ```python from torch.utils.data import DataLoader model = CatDogClassifier() criterion = nn.CrossEntropyLoss() optimizer = optim.Adam(model.parameters(), lr=0.001) train_loader = DataLoader(train_dataset, batch_size=32, shuffle=True) val_loader = DataLoader(val_dataset, batch_size=32, shuffle=False) for epoch in range(10): for inputs, labels in train_loader: optimizer.zero_grad() outputs = model(inputs) loss = criterion(outputs, labels) loss.backward() optimizer.step() # 在验证集上进行评估 total = 0 correct = 0 with torch.no_grad(): for inputs, labels in val_loader: outputs = model(inputs) _, predicted = torch.max(outputs.data, 1) total += labels.size(0) correct += (predicted == labels).sum().item() print(f"Epoch {epoch}: Accuracy = {correct / total}") ``` 在这个示例中,我们使用了交叉熵损失函数和 Adam 优化器,并进行了10个 epoch 的训练。 希望这个示例对你有所帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值