【问题标题】:Pass user specified parameters to DataLoader将用户指定的参数传递给 DataLoader
【发布时间】:2020-04-22 11:38:42
【问题描述】:

我正在使用 U-Net 并实施 2015 年论文中描述的加权技术(U-Net: Convolutional Networks for Biomedical 图像分割)和 2019 年(U-Net – 用于细胞计数、检测和形态测量的深度学习)。在该技术中,存在方差 σ 和权重 w_0。我希望,尤其是 σ,成为一个可学习的参数,而不是从数据集到数据集猜测哪个值最好。

  1. 根据我的发现,我可以使用 nn.Parameter 来做到这一点。
  2. 要使用从一个时期到另一个时期学习到的 σ,我需要以某种方式通过 DataLoader 将这个新值传递给 DataSet 的 get_item 函数。

我目前对此的看法是扩展 torch.utils.data.DataLoader,其中新的 init 有一个额外的参数,接受用户指定/可学习的参数。鉴于torch.utils.data.DataLoader的源代码,我不明白DataLoader在哪里以及如何调用DataSet实例并因此传递这些参数。

代码方面,DataSet 定义中有函数

def __getitem__(self, index):

我可以改成

def __getitem__(self, index, sigma):

并利用更新的、新学习的 σ。

我的问题是,在训练期间,我将训练数据集迭代为

for epoch in range( checkpoint[ 'epoch'], num_epochs):
....
    for ii, ( X, y, y_weight, fname) in enumerate( dataLoader[ phase]):

在 DataLoader 的枚举中,如何将新的 σ 传递给 DataLoader,以便 DataLoader 将其传递给上述 DataSet getitem 函数?

编辑

目前,我在 DataSet 类中定义了一个参数 sigma

class MedicalImageDataset( Dataset):
      def __init__(self, fname, img_transform = None, mask_transform = None, weight_transform = None, sigma = 8):
            ...
            self.sigma = sigma

      def __getitem__(self, index):
            sigma = self.sigma
            ...

我通过 DataLoader 更新为

dataLoader[ 'train'].dataset.sigma = model.sigma

在哪里,

model.sigma

是自定义参数定义为

model.register_parameter( name = 'sigma', param = torch.nn.Parameter( torch.tensor( 16, dtype = torch.float16), requires_grad = True))

创建模型后。

我的问题是,model.sigma 看起来并没有从一个时代更新到另一个时代。具体来说,与初始值相同。这是为什么呢?

查看optimizer.state_dict() 我找不到任何名为“sigma”的参数,而我可以在model.named_parameters() 中找到一个。

最后,这个参数sigma没有附加到任何层,它有点“免费”。

【问题讨论】:

    标签: parameter-passing pytorch unity3d-unet dataloader


    【解决方案1】:

    您需要做的是将 sigma 设置为 Dataset 的一个属性,并在不同时期之间更改它。

    对于数据集定义

    class UNetDataset(object):
        def __init__(self, ..., sigma=5):
    
            self.sigma = sigma
    

    现在,在__getitem__ 内,您可以使用self.sigma 使用sigma 值

    现在在您的训练周期内,在每个 epoch 之后,您可以通过设置数据集的 sigma 属性来更改 sigma 值

    for epoch in range(num_epochs):
        dataset.sigma = #whatever value you want
    
        for i,(x,y) in enumarate(DataLoader):
    
    

    【讨论】:

    • 假设我最初有 σ = 3,在第一个 epoch 之后,反向传播后 σ = 5。然后在第二个时期,我将为 ii 做 (X, y, y_weight, fname) in enumerate(dataLoader[phase]):我如何传递新的 σ?谢谢。 DatatLoader 有一个 setattr 函数。这是这种方式然后自动将新的 σ 传递给 DataSet 吗?在 DataSet 中,如果通过了,我已经处理了 σ。
    • 据我了解,您需要在每个时期之后生成具有不同 sigma 的数据?如果你能分享一些关于这方面的代码或文献会容易得多。
    • 我更新了我的问题。我希望它能更清楚地说明我在问什么。
    猜你喜欢
    • 2018-03-03
    • 1970-01-01
    • 2016-11-07
    • 1970-01-01
    • 2010-12-15
    • 1970-01-01
    • 2023-03-31
    • 1970-01-01
    相关资源
    最近更新 更多