【pytorch】Pytorch中的TensorDataset与DataLoader

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]])
b=torch.tensor([44,55,66,44,55,66,44,55,66,44,55,66])
train_ids = TensorfDataset(a,b)
print(train_ids[0:1])
print('='*60)
for x_train,y_label in train_ids:
	print(x_train,y_label)
(tensor([4,5,6]),tensor(55))
============================================================
tensor([1, 2, 3]) tensor(44)
tensor([4, 5, 6]) tensor(55)
tensor([7, 8, 9]) tensor(66)
tensor([1, 2, 3]) tensor(44)
tensor([4, 5, 6]) tensor(55)
tensor([7, 8, 9]) tensor(66)
tensor([1, 2, 3]) tensor(44)
tensor([4, 5, 6]) tensor(55)
tensor([7, 8, 9]) tensor(66)
tensor([1, 2, 3]) tensor(44)
tensor([4, 5, 6]) tensor(55)
tensor([7, 8, 9]) tensor(66)

DataLoader进行数据封装

描述

torch.utils.data.DataLoader 主要是对数据进行 batch 的划分,在训练模型时使用到此函数,用来把训练数据分成多个小组,此函数每次抛出一组数据。直至把所有的数据都抛出。完成数据的初始化。

用法

train_loader = DataLoader(dataset=train_ids,batch_size=4,shuffle=True) # shuffle参数:打乱数据顺序,默认为False

代码

BATCH_SIZE刚好整除数据量
说明:共有10条数据,设置BATCH_SIZE为5进行划分,能划分为2组(step为0和1)。这两组数据互斥。

"""
    批训练,把数据变成一小批一小批数据进行训练。
    DataLoader就是用来包装所使用的数据,每次抛出一批数据
"""
import torch
import torch.utils.data as Data
BATCH_SIZE = 5       # 批训练的数据个数
x = torch.linspace(1, 10, 10)   # 训练数据
print(x)
y = torch.linspace(10, 1, 10)   # 标签
print(y)
# 把数据放在数据库中
torch_dataset = Data.TensorDataset(x, y)  # 对给定的 tensor 数据,将他们包装成 dataset
loader = Data.DataLoader(
    # 从数据库中每次抽出batch size个样本
    dataset=torch_dataset,       # torch TensorDataset format
    batch_size=BATCH_SIZE,       # mini batch size
    shuffle=True,                # 要不要打乱数据 (打乱比较好)
    num_workers=2,               # 多线程来读数据
)
def show_batch():
    for epoch in range(3):
        for step, (batch_x, batch_y) in enumerate(loader):
            # training
            print("steop:{}, batch_x:{}, batch_y:{}".format(step, batch_x, batch_y))
show_batch()

运行结果:

tensor([ 1.,  2.,  3.,  4.,  5.,  6.,  7.,  8.,  9., 10.])
tensor([10.,  9.,  8.,  7.,  6.,  5.,  4.,  3.,  2.,  1.])
(tensor(2.), tensor(9.))
steop:0, batch_x:tensor([2., 1., 9., 3., 4.]), batch_y:tensor([ 9., 10.,  2.,  8.,  7.])
steop:1, batch_x:tensor([ 6., 10.,  7.,  8.,  5.]), batch_y:tensor([5., 1., 4., 3., 6.])
steop:0, batch_x:tensor([4., 1., 9., 2., 8.]), batch_y:tensor([ 7., 10.,  2.,  9.,  3.])
steop:1, batch_x:tensor([ 6., 10.,  5.,  3.,  7.]), batch_y:tensor([5., 1., 6., 8., 4.])
steop:0, batch_x:tensor([10.,  3.,  4.,  7.,  6.]), batch_y:tensor([1., 8., 7., 4., 5.])
steop:1, batch_x:tensor([2., 1., 8., 5., 9.]), batch_y:tensor([ 9., 10.,  3.,  6.,  2.])

BATCH_SIZE 不整除数据量
说明:会输出余下所有数据
将上述代码中的BATCH_SIZE改为4:

"""
    批训练,把数据变成一小批一小批数据进行训练。
    DataLoader就是用来包装所使用的数据,每次抛出一批数据
"""
import torch
import torch.utils.data as Data
BATCH_SIZE = 4       # 批训练的数据个数
x = torch.linspace(1, 10, 10)   # 训练数据
print(x)
y = torch.linspace(10, 1, 10)   # 标签
print(y)
# 把数据放在数据库中
torch_dataset = Data.TensorDataset(x, y)  # 对给定的 tensor 数据,将他们包装成 dataset
loader = Data.DataLoader(
    # 从数据库中每次抽出batch size个样本
    dataset=torch_dataset,       # torch TensorDataset format
    batch_size=BATCH_SIZE,       # mini batch size
    shuffle=True,                # 要不要打乱数据 (打乱比较好)
    num_workers=2,               # 多线程来读数据
)
def show_batch():
    for epoch in range(3):
        for step, (batch_x, batch_y) in enumerate(loader):
            # training
            print("steop:{}, batch_x:{}, batch_y:{}".format(step, batch_x, batch_y))
show_batch()

运行结果:

tensor([ 1.,  2.,  3.,  4.,  5.,  6.,  7.,  8.,  9., 10.])
tensor([10.,  9.,  8.,  7.,  6.,  5.,  4.,  3.,  2.,  1.])
steop:0, batch_x:tensor([3., 7., 4., 1.]), batch_y:tensor([ 8.,  4.,  7., 10.])
steop:1, batch_x:tensor([ 8., 10.,  5.,  2.]), batch_y:tensor([3., 1., 6., 9.])
steop:2, batch_x:tensor([6., 9.]), batch_y:tensor([5., 2.])
steop:0, batch_x:tensor([ 2.,  1., 10.,  6.]), batch_y:tensor([ 9., 10.,  1.,  5.])
steop:1, batch_x:tensor([4., 8., 5., 9.]), batch_y:tensor([7., 3., 6., 2.])
steop:2, batch_x:tensor([3., 7.]), batch_y:tensor([8., 4.])
steop:0, batch_x:tensor([5., 2., 7., 1.]), batch_y:tensor([ 6.,  9.,  4., 10.])
steop:1, batch_x:tensor([ 8., 10.,  6.,  9.]), batch_y:tensor([3., 1., 5., 2.])
steop:2, batch_x:tensor([3., 4.]), batch_y:tensor([8., 7.])
  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值