利用利用kaggle+pytorch进行机器学习进行机器学习1(图像分类)(图像分类)
最近在学习机器学习,一开始准备适应tensorflow框架,结果学习的时候发现tensrflow2.0与1.0版本兼容性太差,于是采用pytorch框架。
对于学生党而言,免费的GPU是最重要的资源,kaggle提供了每周30个小时的免费GPU,基本满足了学习需要。
没有自己写源码,参考了kaggle上面的一个资源,并作了一定注释和修改。
#导入必要的包
import numpy as np # linear algebra
import pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)
import os
import torch
import torch.nn as nn
import cv2
import matplotlib.pyplot as plt
import torchvision
from torch.utils.data import Dataset, DataLoader, ConcatDataset
from torchvision import transforms
import copy
import tqdm
from PIL import Image
%matplotlib inline
在这里插入代码片
#图片文件解压缩
!unzip ../input/train -d train
!unzip ../input/test1 -d test1
#设置文件路径
train_dir = '/kaggle/working/train/train'
test_dir = '/kaggle/working/test1/test1'
train_files = os.listdir(train_dir)
test_files = os.listdir(test_dir)
#图片处理类
class CatDogDataset(Dataset):
def __init__(self, file_list, dir, mode='train', transform = None):
self.file_list = file_list
self.dir = dir
self.mode= mode
self.transform = transform
if self.mode == 'train':
if 'dog' in self.file_list[0]:
self.label = 1
else:
self.label = 0
def __len__(self):
return len(self.file_list)
def __getitem__(self, idx):
img = Image.open(os.path.join(self.dir, self.file_list[idx]))
if self.transform:
img = self.transform(img)
if self.mode == 'train':
img = img.numpy()
return img.astype('float32'), self.label
else:
img = img.numpy()
return img.astype('float32'), self.file_list[idx] #数据转换函数
data_transform = transforms.Compose([
transforms.Resize(256),
transforms.ColorJitter(),
transforms.RandomCrop(224),
transforms.RandomHorizontalFlip(),
transforms.Resize(128),
transforms.ToTensor()
])
#分离猫,狗的图像数据
cat_files = [tf for tf in train_files if 'cat' in tf] dog_files = [tf for tf in train_files if 'dog' in tf]
cats = CatDogDataset(cat_files, train_dir, transform = data_transform)
dogs = CatDogDataset(dog_files, train_dir, transform = data_transform)
catdogs = ConcatDataset([cats, dogs])
#数据加载
dataloader = DataLoader(catdogs, batch_size = 32, shuffle=True, num_workers=4)
samples, labels = iter(dataloader).next()
plt.figure(figsize=(16,24))
grid_imgs = torchvision.utils.make_grid(samples[:24])
np_grid_imgs = grid_imgs.numpy()
# in tensor, image is (batch, width, height), so you have to transpose it to (width, height, batch) in numpy to show it.
plt.imshow(np.transpose(np_grid_imgs, (1,2,0)))
# transfer learning
#使用Gpu
device = 'cuda'
model = torchvision.models.densenet121(pretrained=True) #调用pytorch中的预训练模型
评论0