写对比学习损失函数有感(关于速度差异、出现nan的情况)

出现nan的情况

1、比如 loss = sum(loss[i]) / count,这个时候就要小心分母,如果分母是0的话,loss就会变成nan。

2、使用交叉熵,因为有一个log函数,要注意内部。比如,-log(fenzi / fenmu),首先分母不能为0,第二分子也不能为0(否则log(0)一样会出问题),所以最好对分子分母都加一个很小的值,比如1e-8。

运行速度

使用time.perf_counter()来计时,因为time.time()得到的是以秒为单位的时间,在这里不合适。

1、创建一个 1024*1024 的二维数组:

python列表:158
写对比学习损失函数有感(关于速度差异、出现nan的情况)_第1张图片

torch.zeros:131
写对比学习损失函数有感(关于速度差异、出现nan的情况)_第2张图片

np.zeros:0.38
写对比学习损失函数有感(关于速度差异、出现nan的情况)_第3张图片

torch.zeros(1024, 1024).to(‘cuda’):55839
写对比学习损失函数有感(关于速度差异、出现nan的情况)_第4张图片

结论:如果用torch.zeros创建数组,还往cuda里放的话,速度会非常慢。最好用numpy,快好几个数量级。

2、给 1024*1024 的二维数组遍历赋值:

python自带数组:1800
写对比学习损失函数有感(关于速度差异、出现nan的情况)_第5张图片

torch.tensor.to(‘cuda’):39400
写对比学习损失函数有感(关于速度差异、出现nan的情况)_第6张图片

np.zeros:4700
写对比学习损失函数有感(关于速度差异、出现nan的情况)_第7张图片

结论:在赋值方面np略逊于原生数组,但是没有数量级上的差距。tensor更不用说了,慢死人。

3、给 1024*1024 的二维数组遍历赋值,而且计算余弦相似度:

torch.tensor的数组,以及F.cos的相似度:774
写对比学习损失函数有感(关于速度差异、出现nan的情况)_第8张图片

np的数组,以及np的相似度:686
写对比学习损失函数有感(关于速度差异、出现nan的情况)_第9张图片

我所用的转化一大堆转来转去的相似度:624
写对比学习损失函数有感(关于速度差异、出现nan的情况)_第10张图片

结论:计算相似度的话,几种方法都差不多。而且都不高。最耗时的,还是创建数组的过程。

你可能感兴趣的:(机器学习,学习,python,numpy)