Pytorch学习(五)内置函数__init__()和__call__()函数的使用

1. __init__的用法

首先按照如下方法定义一个类Student并初始化该类的一个对象stu,通过语句stu.scores为stu添加属性,这个类存在的问题是:我们还可以为stu1, stu2不同的实例化对象添加不同的属性,但理论上,stu, stu1, stu2属于同一类Student,我们希望他们具备相同的属性,如name, scores。而且采用这种设置对象属性的方式,scores等属性是暴露的,没有起到封装的效果。

class Student:
    pass
stu = Student()
stu.scores = [84,86,95]
print(stu.scores)

上述问题的解决方案就是在实例化的时候对类传入一些参数,来设置实例化对象的属性,这种初始化方法通过__init__实现。
在定义类的时候,如果添加__init__方法,在创建类的实例时,会自动调该方法,通常用来对类的属性进行初始化,以下边的Student类为例。

class Student:
	def __init__(self, name, scores):
		self.name = name
		self.scores = scores
stu = Student()  

__init__方法中的第一个参数self指向新创建的实例化对象,self也可以换成其他名称,但习惯上使用self。通过语句stu = Student() 可以创建Student类的实例。
__init__与类中其他普通方法的区别在于:

  1. __init__在生成类实例的时候自动被调用,而普通方法需要被显示调用才能起到作用。
  2. __init__传入的参数为局部变量,如果想要在类中的其他方法中使用该变量,需要赋值给self.<属性名>
  3. __init__不允许有返回值
2. __call__的用法

根据下面的代码可以看出,call()函数不用显示调用,而是使用对象初始化的方式来调用。

class Person:
    def __call__(self, name):
        print("__call__" + " hello " + name)

    def hello(self, name):
        print("hello ", name)

p = Person()
p("Amy")
p.hello("Mike")

# 结果如下:
__call__ hello Amy
hello  Mike

可以结合torchvision.transforms里的compose()来深入理解__init__()和__call__()的用法

class Compose(object):
    """Composes several transforms together.

    Args:
        transforms (list of ``Transform`` objects): list of transforms to compose.

    Example:
        >>> transforms.Compose([
        >>>     transforms.CenterCrop(10),
        >>>     transforms.ToTensor(),
        >>> ])
    """

    def __init__(self, transforms):
        self.transforms = transforms

    def __call__(self, img):
        for t in self.transforms:
            img = t(img)
        return img

    def __repr__(self):
        format_string = self.__class__.__name__ + '('
        for t in self.transforms:
            format_string += '\n'
            format_string += '    {0}'.format(t)
        format_string += '\n)'
        return format_string

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: "默认进程组尚未初始化,请确保调用了init_process_group。" 这个错误提示通常出现在使用PyTorch分布式训练时,表示需要在使用分布式训练前先调用init_process_group函数来初始化进程组。这个函数会为分布式训练创建一个进程组,以确保不同进程间的通信和同步。因此,如果在使用分布式训练时遇到这个错误提示,需要在代码添加init_process_group函数调用来初始化进程组。 ### 回答2: "Default process group has not been initialized,请确保调用init_process_group。"这个错误表示进程组没有初始化。进程组是在Unix/Linux系统组织进程的一种方式,一个进程组是具有相同组ID的一组进程的集合。 当进程存在多个线程,以及多个进程需要协作完成任务时,可能需要使用进程组和进程间通讯来协调他们的工作,从而完成任务。通常,进程组会应用在进程间通讯操作,例如,利用管道、消息队列等实现信息的交互。 而init_process_group,是在进程组初始化的函数,为该进程组申请唯一的ID,并分配资源,从而使进程组实际可用。 因此,当出现"default process group has not been initialized"错误信息时,通常是因为在使用进程组或进程间通讯操作之前,没有正确调用init_process_group进行进程组的初始化,导致该进程组未能被识别和使用。 解决此问题的有效方法是要确保在使用进程组或进程间通讯操作之前调用init_process_group进行初始化。而在实际程序编码,应当养成编写健壮代码的习惯,更好地处理异常情况,避免出现不必要的错误。 ### 回答3: 这个错误信息是在使用PyTorch进行分布式训练时可能会出现的一个问题,原因是在初始化分布式进程时,调用了未初始化的进程组。这个错误提示的意思是默认进程组没有被初始化,需要确保调用了init_process_group方法才能使用分布式训练功能。 在PyTorch,分布式训练可以提高训练速度和效率。但在使用时,需要对各个进程进行初始化,并且控制好不同进程之间的通信和同步。初始化分布式进程组时,需要指定进程组的类型、排名等信息,并进行初始化。 在调用init_process_group方法之前,需要确保已经设置了必要的环境变量、指定了进程数量等配置。如果没有正确地设置环境变量或指定进程数量,也可能会导致类似的错误信息。 解决这类问题的方法是检查代码是否正确调用了init_process_group方法,并确保传递了正确的参数。如果设置了环境变量,需要确保环境变量的值正确。还可以尝试使用torch.distributed.init_process_group方法,该方法可以自动从环境变量读取配置信息来初始化分布式进程组。 总之,这个问题的解决方法与具体的代码实现有关,需要根据具体情况来进行调整。但无论如何,了解分布式训练的原理和实现方式是必要的。在使用分布式训练时,不仅需要注意代码实现的细节,还需要考虑到进程间的通信和同步问题,以便在保证训练效果的同时提高训练速度和效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值