Pytorch如何在nn.Module中安全地实现Hadamard(元素级)产品?

b5buobof  于 2022-11-23  发布在  其他
关注(0)|答案(1)|浏览(186)

我需要编写一个nn.Module类,其中的层可以相互连接。我需要对我的层的一些结果执行元素级乘积,但是(强调)**我不需要参数化层来执行此操作。**我需要将它放置在几个参数化层之间。我如何在不破坏梯度或导致其他问题的情况下将元素级乘积实现到我的模型中?
元素智能产品也被称为“阿达玛产品”。我一直无法找到一个单一的例子,一个nn.Module做这种产品在互联网上的任何地方。

qni6mghb

qni6mghb1#

您是否检查了torch.mul函数(https://pytorch.org/docs/stable/generated/torch.mul.html)?它将对两个大小相等的输入执行哈达玛乘积(对于大小不相等的输入,将使用广播)。按照惯例,在要求_grad=True的Tensor上执行此函数,梯度将被正确计算并存储在Tensor中。
由于你没有提供足够的信息来重建/完全理解你想要解决的问题,我只是举了一个例子。假设你在pytorch中有一个简单的CNN,但是(不管出于什么原因)你想在某些区域屏蔽掉层的输出。这可以通过以下方式实现:

import torch.nn as nn
class Masking_CNN(nn.Module):
   def __init__(self,input_channels):
       """
       input_channels: int, number of channels in the input 
       """

       super().__init__()        

       #describe the network
       self.conv_layer= nn.Conv2d(input_channels,4,kernel_size=3,padding=1)

   def forward(self,x,mask):
       """
       x: pytorch tensor of size(batch_size,input_channels,input_size,input_size)
       mask: pytorch tensor of size(1,4,input_size,input_size) containing either 0 or 1 
       """
    
       x= self.conv_layer(x)
       x= torch.mul(x,mask) 
       return x

因此,这将是一个如何将函数集成到网络中的例子。您所需要的只是将torch.穆尔函数添加到前向传递中,并将您希望按元素乘的Tensor(哈达玛乘积)作为参数传递。
如果您需要更多关于您的问题的缩小范围的帮助,请指定您的问题并提供关于您的问题的更多信息。

相关问题