Pytorch 在Pytork中有没有生成张量分段函数的方法?

Pytorch 在Pytork中有没有生成张量分段函数的方法?,pytorch,Pytorch,我想得到一个像这样的分段函数,用于pytorch中的张量。但我不知道如何定义它。我使用了一个非常愚蠢的方法来做这件事,但在我的代码中它似乎不起作用 def trapezoid(self, X): Y = torch.zeros(X.shape) Y[X % (2 * pi) < (0.5 * pi)] = (X[X % (2 * pi) < (0.5 * pi)] % (2 * pi)) * 2 / pi Y[(X % (2 *

我想得到一个像这样的分段函数,用于pytorch中的张量。但我不知道如何定义它。我使用了一个非常愚蠢的方法来做这件事,但在我的代码中它似乎不起作用

    def trapezoid(self, X):
        Y = torch.zeros(X.shape)
        Y[X % (2 * pi) < (0.5 * pi)] = (X[X % (2 * pi) < (0.5 * pi)] % (2 * pi)) * 2 / pi
        Y[(X % (2 * pi) >= (0.5 * pi)) & (X % (2 * pi) < 1.5 * pi)] = 1.0
        Y[X % (2 * pi) >= (1.5 * pi)] = (X[X % (2 * pi) >= (1.5 * pi)] % (2 * pi)) * (-2 / pi) + 4
        return Y
def梯形(自身,X):
Y=火炬零点(X形状)
Y[X%(2*pi)<(0.5*pi)]=(X[X%(2*pi)<(0.5*pi)]%(2*pi))*2/pi
Y[(X%(2*pi)>=(0.5*pi))&(X%(2*pi)<1.5*pi)]=1.0
Y[X%(2*pi)>=(1.5*pi)]=(X[X%(2*pi)>=(1.5*pi)]%(2*pi))*(-2/pi)+4
返回Y

你能帮我找出如何设计函数梯形,这样对于张量X,我可以直接使用梯形(X)

因为你的函数有周期2π,我们可以关注[0,2π]。由于它是分段线性的,所以可以将其表示为[0,2π]上的迷你ReLU网络,如下所示:

梯形(x)=1-relu(x-1.5π)/0.5π-relu(0.5π-x)/0.5π

因此,我们可以在Pytorch中对整个函数进行如下编码:

import torch
import torch.nn.functional as F
from torch import tensor 
from math import pi

def trapezoid(X):
  # Left corner position, right corner position, height
  a, b, h = tensor(0.5*pi), tensor(1.5*pi), tensor(1.0)

  # Take remainder mod 2*pi for periodicity
  X = torch.remainder(X,2*pi)

  return h - F.relu(X-b)/a - F.relu(a-X)/a
打印到双重检查将生成正确的图片:

import matplotlib.pyplot as plt

X = torch.linspace(-10,10,1000)
Y = trapezoid(X)
plt.plot(X,Y)
plt.title('Pytorch Trapezoid Function')