Python 3.x 代码优化:Torch张量计算

Python 3.x 代码优化:Torch张量计算,python-3.x,pytorch,Python 3.x,Pytorch,我目前正在实现一个计算自定义交叉熵损失的函数。 函数的定义如下图所示 我的代码如下: output = output.permute(0, 2, 3, 1) target = target.permute(0, 2, 3, 1) batch, height, width, channel = output.size() total_loss = 0. for b in range(batch): # for each batch o = output[b] t = targ

我目前正在实现一个计算自定义交叉熵损失的函数。 函数的定义如下图所示

我的代码如下:

output = output.permute(0, 2, 3, 1)
target = target.permute(0, 2, 3, 1)

batch, height, width, channel = output.size()

total_loss = 0.
for b in range(batch): # for each batch
    o = output[b]
    t = target[b]
    loss = 0.
    for w in range(width):
        for h in range(height): # for every pixel([h,w]) in the image
            sid_t = t[h][w][0]
            sid_o_candi = o[h][w]
            part1 = 0. # to store the first sigma 
            part2 = 0. # to store the second sigma

            for k in range(0, sid_t):
                p = torch.sum(sid_o_candi[k:]) # to get Pk(w,h)
                part1 += torch.log(p + 1e-12).item()

            for k in range(sid_t, intervals):
                p = torch.sum(sid_o_candi[k:]) # to get Pk(w,h)
                part2 += torch.log(1-p + 1e-12).item()

            loss += part1 + part2

    loss /= width * height * (-1)
    total_loss += loss
total_loss /= batch
return torch.tensor(total_loss, dtype=torch.float32)

我想知道这些代码是否可以进行任何优化。

我不确定
sid\u t=t[h][w][0]
是否对每个像素都相同。如果是这样的话,您可以去掉所有的
for循环
,这会加快计算速度

不要使用
.item()
,因为它将返回一个Python值,该值将丢失
grad\u fn
轨迹。那么就不能使用
loss.backward()
来计算渐变

如果
sid\u t=t[h][w][0]
不相同,这里有一些修改可以帮助您消除至少1个
for loop


批次、高度、宽度、通道=output.size()
总损失=0。
对于范围内的b(批次):#对于每个批次
o=输出[b]
t=目标[b]
损失=0。
对于范围内的w(宽度):
对于范围内的h(高度):#对于图像中的每个像素([h,w])
sid_t=t[h][w][0]
sid_o_candi=o[h][w]
第1部分=0.#存储第一个sigma
第2部分=0.#存储第二个西格玛
sid1\u cumsum=sid\u o\u candi[:sid\u t].flip(dim=(0,).cumsum(dim=0).flip(dims=(0,))
第1部分=火炬总数(火炬对数(sid1_cumsum+1e-12))
sid2\u cumsum=sid\u o\u candi[sid\u t:interval].flip(dim=(0,).cumsum(dim=0).flip(dims=(0,))
第2部分=火炬总数(火炬对数(1-sid2_cumsum+1e-12))
损失+=第1部分+第2部分
损耗/=宽度*高度*(-1)
总损失+=损失
总损失/=批次
返回火炬张量(总损耗,dtype=torch.float32)
工作原理:

x=torch.arange(10);
打印(x)
x_flip=x.flip(dims=(0,);
打印(x_翻转)
x_逆_求和=x_flip.cumsum(dim=0).flip(dims=(0,))
打印(x_反求和)
#输出
张量([0,1,2,3,4,5,6,7,8,9])
张量([9,8,7,6,5,4,3,2,1,0])
张量([45,45,44,42,39,35,30,24,17,9])

希望有帮助。

我不确定
sid\u t=t[h][w][0]
对每个像素是否相同。如果是这样的话,您可以去掉所有的
for循环
,这会加快计算速度

不要使用
.item()
,因为它将返回一个Python值,该值将丢失
grad\u fn
轨迹。那么就不能使用
loss.backward()
来计算渐变

如果
sid\u t=t[h][w][0]
不相同,这里有一些修改可以帮助您消除至少1个
for loop


批次、高度、宽度、通道=output.size()
总损失=0。
对于范围内的b(批次):#对于每个批次
o=输出[b]
t=目标[b]
损失=0。
对于范围内的w(宽度):
对于范围内的h(高度):#对于图像中的每个像素([h,w])
sid_t=t[h][w][0]
sid_o_candi=o[h][w]
第1部分=0.#存储第一个sigma
第2部分=0.#存储第二个西格玛
sid1\u cumsum=sid\u o\u candi[:sid\u t].flip(dim=(0,).cumsum(dim=0).flip(dims=(0,))
第1部分=火炬总数(火炬对数(sid1_cumsum+1e-12))
sid2\u cumsum=sid\u o\u candi[sid\u t:interval].flip(dim=(0,).cumsum(dim=0).flip(dims=(0,))
第2部分=火炬总数(火炬对数(1-sid2_cumsum+1e-12))
损失+=第1部分+第2部分
损耗/=宽度*高度*(-1)
总损失+=损失
总损失/=批次
返回火炬张量(总损耗,dtype=torch.float32)
工作原理:

x=torch.arange(10);
打印(x)
x_flip=x.flip(dims=(0,);
打印(x_翻转)
x_逆_求和=x_flip.cumsum(dim=0).flip(dims=(0,))
打印(x_反求和)
#输出
张量([0,1,2,3,4,5,6,7,8,9])
张量([9,8,7,6,5,4,3,2,1,0])
张量([45,45,44,42,39,35,30,24,17,9])

希望能有所帮助。

您的问题更适合您的问题更适合您的语句“part2=torch.sum(torch.(torch.log(1-sid2_cumsum+1e-12))”,因为我的解释器报告了错误?此语句“part2=torch.sum(torch.log(1-sid2_cumsum+1e-12))”中是否有拼写错误,因为我的翻译报告了错误?