Pytorch基础知识(2)数据的导入与预处理

大多数情况下,数据被分为训练集、验证集和测试集。我们使用训练集训练模型,在训练期间,使用验证集来跟踪模型的性能,使用测试集来评估最终的模型。一般情况下,测试集是被隐藏的。训练一个模型,我们最少需要训练集和验证集。当我们只有训练集的时候,会将训练集拆分为训练集,验证集两部分或者训练集、验证集和测试集三部分。

导入数据集

PyTorch的torchvision包提供了多个流行的数据集。
我们从torchvision中导入MNIST数据集:

  1. 首先,我们导入MNIST训练集:
from torchvision import datasets
# path to store data and/or load from
path2data = "./data"
# laod training data
train_data = datasets.MNIST(path2data, train=True, download=True)
  1. 然后,我们提取训练集的输入数据和标签数据
# extract data and targets
x_train, y_train = train_data.data, train_data.targets
print(x_train.shape)
print(y_train.shape)

torch.Size([60000, 28, 28])
torch.Size([60000])
  1. 下一步,我们导入MNIST测试集
# loading validation data
val_data = datasets.MNIST(path2data, train=False, download=True)
  1. 然后,我们提取测试集的输入数据和标签数据
# extract data and targets
x_val, y_val = val_data.data, val_data.targets
print(x_val.shape)
print(y_val.shape)

# torch.Size([10000, 28, 28])
# torch.Size([10000])
  1. 然后,我们将给tensors增加一个维度
# add a dimension to tensor to become B*C*H*W
if len(x_train.shape)==3:
	x_train = x_train.unsqueeze(1)
print(x_train.shape)

if len(x_val.shape)==3:
	x_val= x_val.unsqueeze(1)
print(x_val.shape)
# torch.Size([60000, 1, 28, 28])
# torch.Size([10000, 1, 28, 28])

现在,我们显示一些样本

  1. 下一步,我们导入需要的包
from torchvision import utils
import matplotlib.pyplot as plt
import numpy as np
  1. 然后,我们定义一个函数来显示图像
def show(img):
	# convert tensor to numpy array
	npimg = img.numpy()
	# convert to H*W*C shape
	npimg_tr = np.transpose(npimg, (1, 2, 0))
	plt.imshow(npimg_tr, interpolation="nearest")
	plt.show()
  1. 下一步,我们创建一个网格并显示图片
# make a grid of 40 images, 8 images per row
x_grid = utils.make_grid(x_train[:40], nrow=8, padding=2)
print(x_grid.shape)

# call helper function
show(x_grid)

结果如下:

数据变换

数据变换也叫做数据增强是一种提高模型性能的技术。torchvision包提供了常用的图像变换。

  1. 在MNIST数据集上定义图像变换
from torchvision import transforms
# loading MNIST training dataset
train_data = datasets.MNIST(path2data, train=True, download=True)
# define transformations
data_transform = transform.Compose([
	transforms.RandomHorizontalFlip(p=1),
	transforms.RandomVerticalFlip(p=1),
	transforms.ToTensor(),
])
  1. 在MNIST数据集上应用图像变换
# get a sample image from training dataset
img = train_data[0][0]
# transfrom sample image
img_tr = data_transform(img)
# convert tensor to numpy array
img_tr_np = img_tr.numpy()
# show original and transformed images
plt.subplot(1,2,1)
plt.imshow(img, cmap="gray")
plt.title("original")
plt.subplot(1,2,2)
plt.imshow(img_tr_np[0], cmap="gray")
plt.title("transformed")
plt.show()

结果显示:
结果显示
3.我们也可以把变换函数传递到dataset类中:

# define transformations
data_transform = transforms.Compose([
	transforms.RandomHorizontalFlip(1),
	transforms.RandomVerticalFlip(1),
	transforms.ToTensor(),
])
# Loading MNIST training data with on-the-fly transformations
train_data = datasets.MNIST(path2data, train=True, download=True, transform=data_transform)

tensors包装为dataset

如果数据是以张量形式提供的,则可以使用以下命令将其包装为PyTorch数据集
TensorDataset类。

  1. 让我们通过包装x_train和y_train来创建一个PyTorch数据集
from torch.utils.data import TensorDataset
# warp tensors into a dataset
train_ds = TensorDataset(x_train, y_train)
val_ds = TensorDataset(x_val, y_val)

for x,y in train_ds:
	print(x.shape, y.item())
	break

# torch.Size([1, 28, 28]) 5

创建数据加载器

为了方便地在训练期间迭代数据,我们可以使用DataLoader类创建一个数据加载器,如下所示:

from torch.utils.data import DataLoader
# create a data loader from dataset
train_dl = DataLoader(train_ds, batch_size=8)
val_dl = DataLoader(val_ds, batch_size=8)

# iterate over batches
for xb,yb in train_dl:
	print(xb.shape)
	print(yb.shape)
	break
# torch.Size([8,1,28,28])
# torch.Size([8])
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值