虞姬,Pytorch学习记载-运用Pytorch进行深度学习,数据加载和预处理,汉服

频道:小编推荐 日期: 浏览:204

主页.jpg

留意确认现已装置了torch和torchvision

数据加载和预处理

在完结60分钟入门之后,接下来有六节tutorials和五节关于文本处理的tutorials。争夺一天一节。不过要点仍是神经网络构建和数据处理部分。

运转任何机器学习都会在预备数据上花费很大精力,究竟Rubbish in Rubbish out。Pytorch供给许多东西协助使数据加载愈加简洁。本教程中,咱们将看到图和从一个不重要的数据会集加载和预处理/增强数据。

预装置库

  • scikit-image:装置pip install scikit-image,下载有点慢,记住封闭VPN。
  • pandas:用于更方便地读取csv数据。
  • 这非有必要处理的数据集是面部姿态,意味着一张人脸将像下面这样被标示。

  • image.png
  • 数据下载能够从官网下载,解压后会看到人脸和相应的labels文件。

  • image.png
  • 在csv文件中能够发现,一共有68个part,就是说一张脸有68个点会被郑敬渂标示。

1. 读取数据

1.1 引进有必要库

from __future__ import print_function, division
import 虞姬,Pytorch学习记载-运用Pytorch进行深度学习,数据加载和预处理,汉服os
import torch
import pandas as pd
from skimage import io, transfor男人的丁丁m
import numpy as np
import matplotlib.pyplot as plt
from torch.utils.data import Dataset, DataLoader
from torchvision import tra虞姬,Pytorch学习记载-运用Pytorch进行深度学习,数据加载和预处理,汉服nsforms, utils
import warnings
warnarashramniings.filterwarnings('ignore')

1.2 运用pandas读取csv数据

landmarks_frame = pd.read_csv('data/faces/face_landmarks.csv')
n = 10
img_nam虞姬,Pytorch学习记载-运用Pytorch进行深度学习,数据加载和预处理,汉服e = landmarks_frame.ix[n, 0]
landmarks = landmarks_frame.ix[n, 1:].as_matrix().astype('float')
landmarks = landmarks.reshape(-1, 2)
print('image name:{}'.format(img_name))
print('landmarks shape:{}'.format(landmarks.shape))
print('first 4 landmarks"{}'.format(landmarks[:4]))

读取数据后,咱们能够展现一下数据

def show_landmarks(image, landmarks):
plt.imshow(image)
plt.scatter(landmarks[:,0],landmarks[:,1],s=10,marker='.',c='r')
plt.pause(0.001)
plt.figure()
show_landmarks(io.imread(os.path.join('data/faces/',img_name)),landmarks)
plt.show()

image.png

2. Dataset类

torch.utils.data.Dataset是用于表明数据集的类,常用数据集都承继自Dataset,而且掩盖下面两个办法:

  • len,len(dataset)回来的时数据集的巨细
  • getitem__,是数据集支撑索引操作, dataset[i] 教程构建了一个dataset类。在_init_中读取csv,读取图片的操作在__getitem中进行,这样时一次性存储在内存中,愈加高效。

数据集的样本时一个字典格局{'image':image, 'landmarks':landmarks}。数据聚会有一个操作参数transform,这样任何需求操作的都能够提交到样例中来。

class FaceLandmarksDataset(Dataset):
def __init__(self, csv_files, root_dir, transform=None):
self.landmarks_frame = pd.read_csv(csv_files)
self.root_dir = root_dir
self.transform = transform
def __len__(self):
return len(self.landmarks_frame)
def __getitem__(self, idx):
img_name = os.path.join(self.root_dir, self.landmarks_frame.iloc[idx, 0])
image = io.imread(img_name)
landmarks = self.landmarks_frame.iloc[idx, 1:].as_matrix()
landmarks = landmarks.astype('float').reshape(-1, 2)
sample = {'image': image, 'landmarks': landmarks}
if self.transform:
sample = self.transform(sample)
r新八唧eturn sample

接下来就能够完成一下,输出四张样例和它们的标签

face_dataset=FaceLandmarksDataset(csv_files='data/faces/face_landmarks.csv',root_dir='data/faces')
fig=plt.f胡歌的老婆王晓晨igure()
for i in range(len(face_dataset)):
sample=face乳白陆行鸟_dataset[i]
print(i,sample['image'].shape, sample['landmarks'].shape)
ax=plt.subplot(1,4,i+1)
plt.tight_layout()
ax.set_title('sample #{}'.format(i))
ax.axis('off')
show_landmarks(**sample)
if i==3:
plt.show()
break
0 (324, 215, 3) (68, 2)
1 (500, 333, 3) (68, 2)
2 (250, 258, 3) (68, 2)
3 (434, 290, 3) (68, 2)

image.png

3. Transform

上面输出的图有一些问题,样本的尺度纷歧,而神经网络期望处理的是固定巨细的数据,这样就需求对这些数据做一些预处理。

在前面的Transformer模型中,mask其实也是一种Transform,将纷歧致的语句经过掩码调整成相同长度。

这里有三种改换

  • Rescale缩放图画
  • RandomCrop随机取舍图画,这是一种数据增强的办法
  • ToTensor把 numpy 图画转化为 PyTorch 图画(咱们需求交流轴)

咱们将把它们写成一个可调用的类而不是函数,所以改换所需的参数不用在每次调用时都传递。为此,咱们只需完成 call__ 办法,假设需求能够完成 __init 办法。咱们能够向下面这样运用他们,这段不在代码中表现

tsfm = Transform(params)
transform_sample = tsfm(sample)

下面完成Transform,是对上面三种改变的完成

class Rescale(阮忠元与黄家驹对对比object):
'''
将图片缩放成实例要求的巨细
'''
def __init__(self, output_size):
assert isinstance(output_size, (int, tuple))
self.output_size = output_size
def __call__(self, sample):
image, landmarks = sample['image'], sample['landmarks']
h, w = image.shape[:2]
if isinstance(self.output_size, int):
# 图片的巨细缩放,配平
if h > w:
new_h, new_w = self.output_size * h / w, self.output_size
else:
new_h, new_w虞姬,Pytorch学习记载-运用Pytorch进行深度学习,数据加载和预处理,汉服 = self.output_size, self.output_size * w / h
else:
new_h, new_w = self.好想要output_size
new_h, new_w = int(new_h), int(new_w)
img = transform.resize(image, (new_h, new_w))
landmarks = landmarks * [new_w / w, new_h / h]
return {'image': img, 'landmarks': landmarks}
class RandomCrop(object):
'''
对样例图片进行随机剪切
'''
def __init__(self, output_size):
assert isinstance(output_size, (int, tuple))
if isinstance(output_size, int):
self.output_size = (output_size, output_siz虞姬,Pytorch学习记载-运用Pytorch进行深度学习,数据加载和预处理,汉服e)
else:
assert len(output_size) == 2
self.output_size = output_size
def __call__(self, sample):
image, landmarks = sample['image'], sample['landmarks']
h, w = image.shape[:2]
new_h, new_w = self.output_size
top = np.random.randint(0, h - new_h)
left = np.random.randint(0, w - new_w)
img = image[top: top + new_h, left: left + new_w]香江电子帝国
landmarks = landmarks - [left, top]
return {'image': img, 'landmarks': landmarks}
class ToTensor(object):
'''
将numpy数据转为Tensors
'''
def __call__(self, sample):
image, landmarks = sample['image'], sample['landmarks']
# swap color axis because
# numpy image: H x W x C
# torch image: C X H X W
image = image.transpose((2, 0, 1))
return {'image': torch.fr余枫无所谓om_numpy(image),
'landmarks': torch.from_numpy(landmarks)}

3.2 整合Transform

假设咱们想先把图画的较短的一边缩放到256,然后从中随机取舍一个224*224巨细的图画。即咱们想要组合 Rescale 和 RandomCrop 两个改换。

torchvision.transforms.Compose是一个简略的可调用类,答应咱们来组合多个改换

scale=Rescale(256)
crop=RandomCrop(128)
composed=transforms.Compose([Rescale(256),RandomCrop(224)])
fig=plt.figure()
sample=face_dataset[65]
for i ,tsfm in enumerate([scale, crop, composed]):
transform_sample=tsfm(sample)
ax=plt.subplot(1,3, i+1)
plt.tight_layout()
ax.set_title(type(tsfm).__nam中国武术散打功夫王争霸赛e__)
show_landmarks(**transform_sam虞姬,Pytorch学习记载-运用Pytorch进行深度学习,数据加载和预处理,汉服ple)
plt.show()

image.png

4. 迭代数据集

将之前吾儿背叛伤透我的心完成的类整合创立一个包含组合改换的数据集,履行以下操作:

  • 批处理数据
  • 打乱数据
  • 运用m桅组词ultiprocessing加载数据
  • torch.utils.data.DataLoader徐若瑄儿子 是一个供给以上一切的功用的迭代器。main函数中相应的参数很清楚。其间一个参数是 collate_fn。你能够指定怎么运用 collate_fn 对样本进行批处理。可是,对大多数状况来说,默许的主动分页应该能够正常作业的很好。翁帆的父亲
if __name__ == '__main__':
# 搞定数据,还有整合改换
transformed_dataset = FaceLandmarksDataset(csv_files='data/faces/face_landmarks.csv', root_dir='data虞姬,Pytorch学习记载-运用Pytorch进行深度学习,数据加载和预处理,汉服/faces',
transform=transforms.Compose([
Rescale(256),
RandomCrop(224),
ToTensor()
]))
# 运用DataLoader,包含改换好的数据集、批处理巨细、主动打乱
dataloader = DataLoader(transformed_dataset, batch_size=4, shuff目土土le=True, num_workers=4)
def show_landmarks_batch(sample_batched):
images_batch, landmarks_batch = sample_batched['image'], sample_batched['landmarks']
batch_size = len(images_batch)
im_size = images_batch.size(2)
grid = utils.make_grid(images_batch)
plt.imshow(grid.numpy().transpose((1, 2, 0)))
for i in range(batch_size):
plt.scatter(landmarks_batch[i, :, 0].numpy() + i * im_size,
landmarks_batch[i, :, 1].numpy(),
s=10, 卢雁慧marker='.', c='r')
for i_batch, sample_batched in enumerate(dataloader):
print(i_batch, sample_batched['image'].size(), sample_batched['landmarks'].size())
if i_batch == 3:
plt.figure()
sincurrhow_landmarks_batch(sample_batched)
plt.axis('off')
plt.ioff()
plt.show()
break

回忆一下数据预处理:

  • 加载数据,监督学习中,一般运用pandas读取已有数据标签
  • 运用Dataset表明表明数据集
  • 对数据进行转化(缩放一致巨细、裁剪、转成Tensor)
  • 整合Compose数据,运用Dat谢太傅东行aLoader进行迭代