有时需要使用 PyTorch 对本地数据 进行分类任务,需要对本地数据进行加载

假设常用的本地数据文件为二维表结构,通过一般性操作获得数据和类标,并完成训练集/测试集划分后

进一步需要通过 torch.from_array() 转换为 Tensor 类型,此时还需要使用torch.utils.data.TensorDataset() 对数据进行包装

torch.utils.data.TensorDataset(data_tensor, target_tensor)

功能:用于包装数据张量 data_tensor 和目标张量 target_tensor

data_tensor:表示数据的张量

target_tensor:表示目标的张量,比如样本的类标

比如,将训练数据及其样本类标进行组合包装:

data_train_TD = Data.TensorDataset(data_train_T, labels_train_T) 之后便可对包装后数据进行加载。

(1) TensorDataset

​ TensorDataset 可以用来对 tensor 进行打包,就好像 python 中的 zip 功能。该类通过每一个 tensor 的第一个维度进行索引。因此,该类中的 tensor 第一维度必须相等。

from torch.utils.data import TensorDataset
import torch
from torch.utils.data import DataLoader

a = torch.tensor([[1, 2, 3], [4, 5, 6], [7, 8, 9], [1, 2, 3], [4, 5, 6], [7, 8, 9], [1, 2, 3], [4, 5, 6], [7, 8, 9], [1, 2, 3], [4, 5, 6], [7, 8, 9]])
b = torch.tensor([44, 55, 66, 44, 55, 66, 44, 55, 66, 44, 55, 66])
train_ids = TensorDataset(a, b) #相当于zip函数

# 切片输出
print(train_ids[0:1])
print('=' * 60)

# 循环取数据
for x_train, y_label in train_ids:
  print(x_train, y_label)


# DataLoader进行数据封装
print('=' * 60)
train_loader = DataLoader(dataset=train_ids, batch_size=4, shuffle=True) #shuffle参数:打乱数据顺序
for i, data in enumerate(train_loader, 1): # 注意enumerate返回值有两个,一个是序号,一个是数据(包含训练数据和标签),参数1是设置从1开始编号
  x_data, label = data
  print(' batch:{0} x_data:{1} label: {2}'.format(i, x_data, label))

(2)DataLoader

DataLoader就是用来包装所使用的数据,每次抛出一批数据
import torch
import torch.utils.data as Data

BATCH_SIZE = 5
x = torch.linspace(1, 10, 10)
y = torch.linspace(10, 1, 10)
# 把数据放在数据库中
torch_dataset = Data.TensorDataset(x, y)

loader = Data.DataLoader(
  # 从数据库中每次抽出batch size个样本
  dataset=torch_dataset,
  batch_size=BATCH_SIZE,
  shuffle=True,
  num_workers=0,
)

def show_batch():
    for epoch in range(10):
        for step, (batch_x, batch_y) in enumerate(loader):
    # training
    print("steop:{}, batch_x:{}, batch_y:{}".format(step, batch_x, batch_y)) #方便输出**


if __name__ == '__main__':
  show_batch()
Last modification:February 13, 2022
如果觉得我的文章对你有用,请随意赞赏