pytorch简单的自定义循环层非常慢

pytorch简单的自定义循环层非常慢,pytorch,recurrent-neural-network,Pytorch,Recurrent Neural Network,我使用PackedSequence在pytorch中实现了一个非常简单的自定义递归层。该层以x20的顺序降低我的网络速度。我读到过关于在不使用JIT的情况下减慢自定义层速度的文章,但顺序是x1.7,这是我可以接受的 我只是索引每个序列的压缩序列并执行递归。 我怀疑有些代码没有在GPU上执行 对于如何实现这种类型的RNN(基本上没有密集层,没有任何功能混合),我也非常感谢其他任何技巧 导入火炬 导入torch.nn作为nn 从torch.nn.utils.rnn导入包序列 def GetPacke

我使用PackedSequence在pytorch中实现了一个非常简单的自定义递归层。该层以x20的顺序降低我的网络速度。我读到过关于在不使用JIT的情况下减慢自定义层速度的文章,但顺序是x1.7,这是我可以接受的

我只是索引每个序列的压缩序列并执行递归。 我怀疑有些代码没有在GPU上执行

对于如何实现这种类型的RNN(基本上没有密集层,没有任何功能混合),我也非常感谢其他任何技巧

导入火炬
导入torch.nn作为nn
从torch.nn.utils.rnn导入包序列
def GetPackedSequenceIndicates(批次大小):
“”“输入:来自PackedSequence对象的批大小
需要长度排序序列!
"""
n批次=批次大小[0]
seqIdx=[]
对于范围内的ii(n批次):
seqLen=火炬总数((第二批)大于0)。项目()
idx=火炬长传感器(seqLen)
idx[0]=ii
idx[1::=批次尺寸[0:seqLen-1]
seqIdx.append(torch.cumsum(idx,dim=0))
返回seqIdx
类LinearRecursionLayer(nn.Module):
“”“具有可训练平滑常数的线性递归平滑层。”“”
定义初始值(自身、专长尺寸、α平滑=0.5):
超级(LinearRecursionLayer,self)。\uuuu init\uuuuu()
self.feat\u dim=feat\u dim
#可训练参数
self.alpha_smooth=nn.参数(alpha_smooth*torch.one(self.feat_dim))
self.wx=nn.参数(火炬一号(自身专长尺寸))
self.activ=nn.Tanh
def前进(自身,x):
如果存在(x,包装顺序):
seqIdx=GetPackedSequenceIndicates(x.批次大小)
ydata=火炬。类似零(x.data)
对于seqIdx中的idx:
y_frame=x.data[idx[0]#第一帧初始化
#迭代序列
对于idx中的nn:
x_frame=x.data[nn]
y_帧=self.alpha_平滑*y_帧+(1-self.alpha_平滑)*x_帧#平滑循环
ydata[nn,:]=self.activ(self.wx*(y_帧))
y=包装顺序(ydata,x.批次尺寸)#包装
否则:#张量
raise VALUERROR('未实现')
返回y