从 Python 中的数据框创建迭代器
Create iterator from a Data Frame in Python
我正在使用 Seq2Seq 进行 NLP 项目。我从我的数据集中创建了一个数据框,然后使用数据加载器创建了一个批处理迭代器,请参见以下代码:
# creates lists containing each pair
original_word_pairs = [[w for w in l.split('\t')] for l in lines[:num_examples]]
data = pd.DataFrame(original_word_pairs, columns=["src", "trg"])
# conver the data to tensors and pass to the Dataloader
# to create a batch iterator
class MyData(Dataset):
def __init__(self, X, y):
self.data = X
self.target = y
# TODO: convert this into torch code is possible
self.length = [ np.sum(1 - np.equal(x, 0)) for x in X]
def __getitem__(self, index):
x = self.data[index]
y = self.target[index]
x_len = self.length[index]
return x,y,x_len
def __len__(self):
return len(self.data)
train_dataset = MyData(input_tensor_train, target_tensor_train)
val_dataset = MyData(input_tensor_val, target_tensor_val)
train_dataset = DataLoader(train_dataset, batch_size = BATCH_SIZE,
drop_last=True,
shuffle=True)
test_dataset= DataLoader(val_dataset, batch_size = BATCH_SIZE,
drop_last=True,
shuffle=True)
那是我代码的一部分,问题是我想像这样使用迭代器
for i, batch in enumerate(iterator):
src = batch.src
trg = batch.trg
但我收到错误“AttributeError:'list' 对象没有属性 'src'”
如何使用迭代器并访问特定列?
您可以将 Dataset
中的 __getitem__
重新定义为 return 字典:
def __getitem__(self, index):
x = self.data[index]
y = self.target[index]
x_len = self.length[index]
return {"src": x, "trg": y, "x_len": x_len}
DataLoader
的默认 collate_fn
将注意提供包含批次而不是单个观察值的字典,但您需要将 x_len
转换为 tensor
到__getitem__
使其工作(或者您可以传递自定义 collate_fn
)。
我正在使用 Seq2Seq 进行 NLP 项目。我从我的数据集中创建了一个数据框,然后使用数据加载器创建了一个批处理迭代器,请参见以下代码:
# creates lists containing each pair
original_word_pairs = [[w for w in l.split('\t')] for l in lines[:num_examples]]
data = pd.DataFrame(original_word_pairs, columns=["src", "trg"])
# conver the data to tensors and pass to the Dataloader
# to create a batch iterator
class MyData(Dataset):
def __init__(self, X, y):
self.data = X
self.target = y
# TODO: convert this into torch code is possible
self.length = [ np.sum(1 - np.equal(x, 0)) for x in X]
def __getitem__(self, index):
x = self.data[index]
y = self.target[index]
x_len = self.length[index]
return x,y,x_len
def __len__(self):
return len(self.data)
train_dataset = MyData(input_tensor_train, target_tensor_train)
val_dataset = MyData(input_tensor_val, target_tensor_val)
train_dataset = DataLoader(train_dataset, batch_size = BATCH_SIZE,
drop_last=True,
shuffle=True)
test_dataset= DataLoader(val_dataset, batch_size = BATCH_SIZE,
drop_last=True,
shuffle=True)
那是我代码的一部分,问题是我想像这样使用迭代器
for i, batch in enumerate(iterator):
src = batch.src
trg = batch.trg
但我收到错误“AttributeError:'list' 对象没有属性 'src'” 如何使用迭代器并访问特定列?
您可以将 Dataset
中的 __getitem__
重新定义为 return 字典:
def __getitem__(self, index):
x = self.data[index]
y = self.target[index]
x_len = self.length[index]
return {"src": x, "trg": y, "x_len": x_len}
DataLoader
的默认 collate_fn
将注意提供包含批次而不是单个观察值的字典,但您需要将 x_len
转换为 tensor
到__getitem__
使其工作(或者您可以传递自定义 collate_fn
)。