zip迭代tensor数据、求topk的简单方法
1、zip函数可以获取可迭代数据的元素,其中包括各种list、tuple、Tensor等元素
下面是一个例子:
testzip = [[1, 2], [1, 3], [2, 3], [3, 3]]
print("单参数时的输出:")
for tuplesin in zip(testzip):
#tuplesin出来的数据是([1,2],),在3D数据训练的适合会导致其重现出来的数据
#有的地方变成热力图,如果通过下面转换为list跟取第零的元素后样本重新出来的数据就正确了
# tuplesins=list(tuplesin)[0]
print(tuplesin)
print("多参数时的输出:")
for tuples,i in zip(testzip,np.arange(len(testzip))):
print(tuples)
其输出为:
单参数时的输出:
([1, 2],)
([1, 3],)
([2, 3],)
([3, 3],)
多参数时的输出:
[1, 2]
[1, 3]
[2, 3]
[3, 3]
其中应用到Tensor上的代码为:
def DeNormalize(tensor, mean):
# 这个zip要有两个参数,如果只有zip的话无法进行第二次的通道取值
# for sample, i in zip(tensor, np.arange(len(tensor))): //这个方法更好
for sample in zip(tensor):
sample=list(sample)[0] #使用上面的单参数需要添加这个转换为list否则展示出来的例子图片会报错出现热力图。
# sample=sample[0] #也可以改为这样子,
# for t,m in zip(sample,mean):
# 进行通道取值循环
for index, t in enumerate(sample):
# 加了'_'后缀将在原地(in-place)改变张量的操作。
t.add_(mean[index])
return tensor
如果不使用上面的sample=sample[0]的话则会导致返回的tensor会有不同如下:
2、求分类输出的topk的方法如下:
def calculate_accuracy(outputs, targets):
batch_size = targets.size(0)
_, pred = outputs.topk(1, 1, True) #第一个1时top中的k,第二个1是指数据的什么维度上进行求最大值
pred = pred.t() #进行数据的装置
correct = pred.eq(targets.view(1, -1))
sumdim=correct.float().sum()
if sumdim>0:
n_correct_elems = sumdim
return n_correct_elems / batch_size
return 0