大家好,又见面了,我是你们的朋友全栈君。
前言
最近开始接触pytorch,从跑别人写好的代码开始,今天需要把输入数据根据每个batch的最长输入数据,填充到一样的长度(之前是将所有的数据直接填充到一样的长度再输入)。 刚开始是想偷懒,没有去认真了解输入的机制,结果一直报错…还是要认真学习呀!
加载数据
pytorch中加载数据的顺序是: ①创建一个dataset对象 ②创建一个dataloader对象 ③循环dataloader对象,将data,label拿到模型中去训练
dataset
你需要自己定义一个class,里面至少包含3个函数: ①__init__:传入数据,或者像下面一样直接在函数里加载数据 ②__len__:返回这个数据集一共有多少个item ③__getitem__:返回一条训练数据,并将其转换成tensor
代码语言:javascript复制import torch
from torch.utils.data import Dataset
class Mydata(Dataset):
def __init__(self):
a = np.load("D:/Python/nlp/NRE/a.npy",allow_pickle=True)
b = np.load("D:/Python/nlp/NRE/b.npy",allow_pickle=True)
d = np.load("D:/Python/nlp/NRE/d.npy",allow_pickle=True)
c = np.load("D:/Python/nlp/NRE/c.npy")
self.x = list(zip(a,b,d,c))
def __getitem__(self, idx):
assert idx < len(self.x)
return self.x[idx]
def __len__(self):
return len(self.x)
dataloader
参数: dataset:传入的数据 shuffle = True:是否打乱数据 collate_fn:使用这个参数可以自己操作每个batch的数据
代码语言:javascript复制dataset = Mydata()
dataloader = DataLoader(dataset, batch_size = 2, shuffle=True,collate_fn = mycollate)
下面是将每个batch的数据填充到该batch的最大长度
代码语言:javascript复制def mycollate(data):
a = []
b = []
c = []
d = []
max_len = len(data[0][0])
for i in data:
if len(i[0])>max_len:
max_len = len(i[0])
if len(i[1])>max_len:
max_len = len(i[1])
if len(i[2])>max_len:
max_len = len(i[2])
print(max_len)
# 填充
for i in data:
if len(i[0])<max_len:
i[0].extend([27] * (max_len-len(i[0])))
if len(i[1])<max_len:
i[1].extend([27] * (max_len-len(i[1])))
if len(i[2])<max_len:
i[2].extend([27] * (max_len-len(i[2])))
a.append(i[0])
b.append(i[1])
d.append(i[2])
c.extend(i[3])
# 这里要自己转成tensor
a = torch.Tensor(a)
b = torch.Tensor(b)
c = torch.Tensor(c)
d = torch.Tensor(d)
data1 = [a,b,d,c]
print("data1",data1)
return data1
结果:
最后循环该dataloader ,拿到数据放入模型进行训练:
代码语言:javascript复制 for ii, data in enumerate(test_data_loader):
if opt.use_gpu:
data = list(map(lambda x: torch.LongTensor(x.long()).cuda(), data))
else:
data = list(map(lambda x: torch.LongTensor(x.long()), data))
out = model(data[:-1]) #数据data[:-1]
loss = F.cross_entropy(out, data[-1])# 最后一列是标签
写在最后:建议像我一样刚开始不太熟练的小伙伴,在处理数据输入的时候可以打印出来仔细查看。
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/133122.html原文链接:https://javaforall.cn