扩展nn.Module实现时@运算符的使用方法疑问
关于PyTorch代码中
@运算符的说明 首先明确结论:此处的@不是装饰器语法,是Python 3.5+ 新增的矩阵乘法运算符,属于数值计算场景的专用语法支持。
核心原理
- Python从3.5版本开始通过PEP 465标准新增了
@运算符,专门用于表示矩阵乘法操作,对应的类魔法方法为__matmul__()。任意自定义类只要实现了该方法,都可以使用@做自定义运算。 - PyTorch的
Tensor类型已经原生实现了__matmul__方法,内部逻辑就是调用矩阵乘法计算,因此两个Tensor之间用@连接时,会自动执行矩阵乘法。
代码等价验证
你提供的代码中:
input_ @ self.weight
完全等价于以下两种写法:
# 通用高维矩阵乘法API torch.matmul(input_, self.weight) # 2维张量专属矩阵乘法API,此处两个张量都是2维,因此也适用 torch.mm(input_, self.weight)
结合你的代码参数验证:input_形状为(100, 5),self.weight形状为(5, 2),矩阵乘法输出形状为(100, 2),叠加广播后的bias后结果符合断言要求。
和装饰器语法的区别
@的两种用法语法位置完全不同,Python解释器不会混淆:
- 作为装饰器使用时,
@必须单独写在函数/类定义的上一行,后面紧跟装饰器对象 - 作为矩阵乘法运算符使用时,
@写在两个运算对象中间,属于二元运算符
内容的提问来源于stack exchange,提问作者user785099
相关产品推荐
相关产品推荐

