在采样策略训练期间将模型传递到自定义数据集以运行模型推理是否有效[Pytorch]

问题描述 投票:0回答:1

我正在尝试设计一个训练流程,用于在训练期间采样样本。

我的数据如下所示:

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中变量是引用变量而不是值变量。

那么哪种方式更专业、更正确呢?

python pytorch dataset sampling
1个回答
0
投票

听起来您想要的是在训练期间动态计算这些嵌入。最好的方法是将模型计算移出

__getitem__
函数并移至训练循环中。

__getitem__
方法应用于磁盘受限或CPU受限的单一任务。计算嵌入受 GPU 限制,应批量完成。

最佳实践是执行以下操作:

  1. 使用
    __getitem__
    方法返回必要的数据来计算
    anchor_embedding
    以及稍后使用的其他量
  2. 使用
    collate_fn
    DataLoader
    批量输入以进行计算
    anchor_embedding
  3. 在训练循环中,使用
    model
    批量计算
    anchor_embedding
    和其他数量
© www.soinside.com 2019 - 2024. All rights reserved.