Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何通过顺序语言建模将LSTM的损失矢量化_Python_Numpy_Deep Learning_Pytorch - Fatal编程技术网

Python 如何通过顺序语言建模将LSTM的损失矢量化

Python 如何通过顺序语言建模将LSTM的损失矢量化,python,numpy,deep-learning,pytorch,Python,Numpy,Deep Learning,Pytorch,所以我有一个涉及语言建模的任务,我通过了所有的单元测试,但是我的代码运行太慢了。我想这是因为我计算损失的方式。我们给出的公式如下: 我的天真实现如下所示: losses_batch_list = [] batch_size = log_probas.size(0) for b in range(batch_size): seq_length = max([i for i, e in enumerate(mask[b,:]) if e != 0]) + 1 loss_batc

所以我有一个涉及语言建模的任务,我通过了所有的单元测试,但是我的代码运行太慢了。我想这是因为我计算损失的方式。我们给出的公式如下:

我的天真实现如下所示:

losses_batch_list = []
batch_size = log_probas.size(0)
for b in range(batch_size):

    seq_length = max([i for i, e in enumerate(mask[b,:]) if e != 0]) + 1

    loss_batch = 0
    for t in range(seq_length):
        for n in range(self.vocabulary_size):
            if targets[b, t] == n:
                loss_batch += log_probas[b, t, n].detach()

    loss_batch = - loss_batch / seq_length
    losses_batch_list.append(loss_batch)

loss = torch.tensor(np.mean(losses_batch_list))

return loss
但是这个循环一直运行,因为词汇表的大小与GPT1大致相同(~40000),并且序列长度高达255(由于填充,因此掩码更短)。 有人对如何矢量化/加速这方面有什么建议吗? 我知道这是正确的,但我不能用它报告任何结果。。。 谢谢

B=批量大小
T=序列长度(填充)
N=声音大小
如果类型(掩码b)=torch.bool:
mask=mask.view(-1)#(B,T)->(B*T,)
其他:
mask=mask.bool().view(-1)#(B,T)->(B*T,)
log_probas=log_probas.view(-1,N)#(B,T,N)->(B*T,N)
targets=target.view(-1,1)#(B,T)->(B*T,1)
丢失=火炬。聚集(log_probas[mask],-1,target[mask])#没有填充令牌的丢失
损失=损失。平均值()

为什么代码片段中会出现双缩进(已编辑)?@desertnaut谢谢我不知道为什么会出现这种情况Hey@emily谢谢!这不太管用,我得到以下错误:数组几乎不等于4位小数实际值:2.763376474380493期望值:2.9091644287109375你知道这可能来自哪里吗:)我对Torchi还是很陌生,我想这是因为在你的代码中,首先计算每个序列的平均损失,然后计算批次序列的平均损失。但在我的例子中,损失是通过平均整个批次的代币损失来计算的。例如,
a=[1,2,3],b=[1,2,3,4,5],np.mean(a+b)=2.625,(np.mean(a)+np.mean(b))/2=2.5