【问题标题】:AttributeError: Can't pickle local object 'pre_datasets.<locals>.<lambda>' when implementing Pytorch frameworkAttributeError: Can't pickle local object 'pre_datasets.<locals>.<lambda>' 在实现 Pytorch 框架时
【发布时间】:2021-10-11 05:50:18
【问题描述】:

我试图在 CNN 上实现一个 pytorch 框架。
我确定代码是正确的,因为它来自教程,并且当我在 GoogleDrive 上的 Jupyter Notebook 上运行它时它可以工作。
但是当我尝试将其本地化为.py 文件时,它提示错误:
AttributeError: Can't pickle local object 'pre_datasets.&lt;locals&gt;.&lt;lambda&gt;' 我知道这是关于在函数之外推断对象,但是关于这个错误的确切问题是什么?
我应该如何解决它?

这是代码的主要部分。

def pre_datasets():
    TRAIN_TFM = transforms.Compose(
        [
            transforms.Resize(size=(128, 128)),
            # TODO
            transforms.ToTensor(),
        ]
    )
    train_set = DatasetFolder(
        root=CONFIG["train_set_path"],
        loader=lambda x: Image.open(x),
        extensions="jpg",
        transform=TRAIN_TFM,
    )
    train_loader = DataLoader(
        dataset=train_set,
        batch_size=CONFIG["batch_size"],
        shuffle=True,
        num_workers=CONFIG["num_workers"],
        pin_memory=True,
    )
    return train_loader

def train(train_loader):
    ...
    for epoch in range(CONFIG["num_epochs"]):
    ...
        for batch in train_loader: # error happened here
    ...

if __name__ == "__main__":
    train_loader = pre_datasets()
    train(train_loader)

这是错误信息:

Traceback (most recent call last):
  File "HW03_byCRZ.py", line 197, in <module>
    train(train_loader, valid_loader)
  File "HW03_byCRZ.py", line 157, in train
    for batch in train_loader:
  File "/Users/ceezous/opt/anaconda3/envs/pytorch_env/lib/python3.8/site-packages/torch/utils/data/dataloader.py", line 355, in __iter__
    return self._get_iterator()
  File "/Users/ceezous/opt/anaconda3/envs/pytorch_env/lib/python3.8/site-packages/torch/utils/data/dataloader.py", line 301, in _get_iterator
    return _MultiProcessingDataLoaderIter(self)
  File "/Users/ceezous/opt/anaconda3/envs/pytorch_env/lib/python3.8/site-packages/torch/utils/data/dataloader.py", line 914, in __init__
    w.start()
  File "/Users/ceezous/opt/anaconda3/envs/pytorch_env/lib/python3.8/multiprocessing/process.py", line 121, in start
    self._popen = self._Popen(self)
  File "/Users/ceezous/opt/anaconda3/envs/pytorch_env/lib/python3.8/multiprocessing/context.py", line 224, in _Popen
    return _default_context.get_context().Process._Popen(process_obj)
  File "/Users/ceezous/opt/anaconda3/envs/pytorch_env/lib/python3.8/multiprocessing/context.py", line 284, in _Popen
    return Popen(process_obj)
  File "/Users/ceezous/opt/anaconda3/envs/pytorch_env/lib/python3.8/multiprocessing/popen_spawn_posix.py", line 32, in __init__
    super().__init__(process_obj)
  File "/Users/ceezous/opt/anaconda3/envs/pytorch_env/lib/python3.8/multiprocessing/popen_fork.py", line 19, in __init__
    self._launch(process_obj)
  File "/Users/ceezous/opt/anaconda3/envs/pytorch_env/lib/python3.8/multiprocessing/popen_spawn_posix.py", line 47, in _launch
    reduction.dump(process_obj, fp)
  File "/Users/ceezous/opt/anaconda3/envs/pytorch_env/lib/python3.8/multiprocessing/reduction.py", line 60, in dump
    ForkingPickler(file, protocol).dump(obj)
AttributeError: Can't pickle local object 'pre_datasets.<locals>.<lambda>'

【问题讨论】:

  • 我已经解决了这个问题。我通过直接用 Image.open 替换 lambda x:Image.open(x) 部分来避免这个问题。

标签: python pytorch computer-vision attributeerror


【解决方案1】:

腌制 lambda 函数需要额外的修改(序列化函数),请参阅 Can Python pickle lambda functions? 了解更多信息。

【讨论】:

  • 我已经解决了这个问题。我通过直接用Image.open 替换lambda x:Image.open(x) 部分来避免这个问题。但是腌制功能部分对我理解发生了什么有很大帮助。
  • 哦,很高兴听到这个消息。您还尝试将import dill 添加到代码的开头。它可能会解决这个问题。
  • 是的,我试过了,但是控制台说我必须做更多的改变。因此,我将代码编辑为我提到的更简单的方法。
【解决方案2】:

我遇到了类似的问题,我像这样使用dill:

import dill as pickle

它开箱即用!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-11-12
    • 1970-01-01
    • 2021-08-21
    • 2018-08-31
    • 2010-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多