下载188APP_188宝金博下载_188金宝搏下载 ios
下载188APP

vegas,Pytorch学习记载-运用Pytorch进行深度学习,数据加载和预处理,年终奖计算器

admin admin ⋅ 2019-04-01 16:49:56
Pytorch学习记载-运用Pytorch进行深度学习,数据加载和预处理

主页.jpg

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

数据加载和预处理

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

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

预装置库

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

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

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

1. 读取数据

1.1 引进有必要库

from __future__ import print_function, division
import os
import torch
import pandas as pd
from skimage import io, transform
import numpy as np
import matplotlib.pyplot as plt
from torch.utils.data import Dataset, DataLoader
from torchvision import transforms, utils
import warnings
warnings.filterwarnings('ignore')

1.2 运用pandas读取csv数据

landmarks_frame = pd.read_csv('data/faces/face_landmarks.csv')
n = 10
img_name = 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(landmar北京上门保健ks[:4]))

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

def show_landmarks(i猪柳麦满分mage, 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, 'l调教体系andmarks':landmarks}。数据聚会有一个操作参数transform,这样任何需求操作的都能够提交到样例中来。

class vegas,Pytorch学习记载-运用Pytorch进行深度学习,数据加载和预处理,年终奖计算器FaceLandmarksDataset(Dataset):
def __init__(self, csv_files, root_dir, transform=None):
self.landmarks_frame = pd.read_csv(csv_files)
self.root_di刘阿柔r = 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.vegas,Pytorch学习记载-运用Pytorch进行深度学习,数据加载和预处理,年终奖计算器transform(sample)
return sample

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

face_dataset=FaceLandmarksDataset(csv_files='data/faces/face_landmarks.csv',root_dir='data/faces')
fig=plt.figure()
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(objec主播米娜t):
'''
将图片缩放成实例要求的巨细
'''
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_wvegas,Pytorch学习记载-运用Pytorch进行深度学习,数据加载和预处理,年终奖计算器 = self.output_siz尚胜法e, 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.outvegas,Pytorch学习记载-运用Pytorch进行深度学习,数据加载和预处理,年终奖计算器put_size = (output_size, output_size)
else:
assert len(output_size) == 2
self.vegas,Pytorch学习记载-运用Pytorch进行深度学习,数据加载和预处理,年终奖计算器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 = samplvegas,Pytorch学习记载-运用Pytorch进行深度学习,数据加载和预处理,年终奖计算器e['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.from_numpy(imag喷火蛙e),
'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).__name__)
show_landmarks(romstar**transform_sample)
plt.show()

image.png

4. 迭代数据集

将之前完成的类整合创立一个包含组合改换的数据集,履行以下操作:

  • 批处理数据
  • 打乱数据
  • 运用multiprocessing加载数据
  • torch.utils.data.DataLoader 是一个提死者刘海龙供以上一切的功用的迭代器。main函数中相应的参数很清楚。其间一个参数是 collate_fn。你能够指定怎么运用 collate_fn 对样本进行批处理。可是,对大多数状况来说,默许的主动分页应该能够正常作业的很好。
if __name__ == '__main__':
# 搞定数据,还有整合改换
trans群光林茂桂formed_dataset = FaceLandmarksDataset(csv_files='data/faces/face_landmarks.csv', root_dir='data/faces',
transform=transforms.Compose([
Rescale(256),
RandomCrop(224),
ToTensor()
]))
# 运用DataLoader,包含改换好的数据集、批处理巨细、主动打乱
dataloader = DataLoader(transformed_dataset, batch_size=4, shuffle=True, num_workers=4)
def show_landmarks_batch(sample_batched):
ivegas,Pytorch学习记载-运用Pytorch进行深度学习,数据加载和预处理,年终奖计算器mages_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 ran我homie今晚超酷ge(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()
show_landmarks_batch(sample_batched)
plt.axis('off')
plt.ioff()
plt.show()
break

回忆一下数据预处理:

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

相关新闻

admin

admin

TA太懒了...暂时没有任何简介

精彩新闻