如何在PyTorch的nn.Sequential层中使用torch.square()对张量求平方
报错原因
你遇到的报错核心原因是torch.square()属于PyTorch的函数式API,调用时必须主动传入输入张量,本身不属于nn.Module的子类实例,无法直接放入nn.Sequential容器中自动承接前序层的输出执行计算。另外你原代码里Conv2d定义末尾缺少闭合的右括号,修改时需要一并补全。
解决方法
有两种常用方案可以实现需求:
- 方法1:使用
nn.Lambda封装(适配PyTorch 1.10及以上版本)
直接将torch.square用nn.Lambda包装为符合nn.Sequential要求的模块即可,修改后的完整序列代码如下:
self.cnn = nn.Sequential( # maxpool nn.MaxPool2d((1, 5), stride=(1, 5)), nn.Lambda(lambda x: torch.square(x)), # layer1 nn.Conv2d(in_channels=in_channels, out_channels=32, kernel_size=5) )
- 方法2:自定义平方层(全版本兼容)
如果使用的PyTorch版本不支持nn.Lambda,可以自行实现一个极简的自定义模块:
class SquareLayer(nn.Module): def forward(self, x): return torch.square(x)
之后将自定义层放入nn.Sequential即可:
self.cnn = nn.Sequential( # maxpool nn.MaxPool2d((1, 5), stride=(1, 5)), SquareLayer(), # layer1 nn.Conv2d(in_channels=in_channels, out_channels=32, kernel_size=5) )
内容的提问来源于stack exchange,提问作者shamalaia
相关产品推荐
相关产品推荐

