我正在尝试设计一个训练流程,用于在训练期间采样样本。
我的数据如下所示:
defaultdict(list,
{'C1629836-28004480': [0, 5, 6, 12, 17, 19, 28],
'C0021846-28004480': [1, 7, 15],
'C0162832-28004480': [2, 9],
'C0025929-28004480': [3, 10, 30],
'C1515655-28004480': [4],
...
}
其中键是标签,值是数据索引列表
我自定义数据集类,其中我的
__getitem__(self, idx)
函数需要计算锚点(随机选择)与其他数据点之间的距离。看起来像这样:
def __getitem__(self, idx):
item_label = self.labels[idx] # C1629836-28004480
item_data = self.data[item_label] # [0, 5, 6, 12, 17, 19, 28]
anchor_index = random.sample(item_data,1)
mentions_indices = [idx for idx in item_data if idx != anchor_index]
with torch.no_grad():
self.model.eval()
anchor_input = ...
anchor_embedding = self.model.mention_encoder(anchor_input)
for idx in mention_indices:
...
防止将模型传递到自定义数据集的另一种方法是在训练期间在
training_step
函数内运行推理。
但是我在某处读到,使用数据集和数据加载器准备数据以输入模型可能会节省训练时间,因为它们具有并行机制或类似的东西。
但实际上,我需要根据训练期间模型的最新权重状态来计算这些距离,这种并行机制能保证这一点吗?虽然在Python中变量是引用变量而不是值变量。
那么哪种方式更专业、更正确呢?
听起来您想要的是在训练期间动态计算这些嵌入。最好的方法是将模型计算移出
__getitem__
函数并移至训练循环中。
__getitem__
方法应用于磁盘受限或CPU受限的单一任务。计算嵌入受 GPU 限制,应批量完成。
最佳实践是执行以下操作:
__getitem__
方法返回必要的数据来计算 anchor_embedding
以及稍后使用的其他量collate_fn
的 DataLoader
批量输入以进行计算 anchor_embedding
model
批量计算 anchor_embedding
和其他数量