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
3、其中shape的值起始index是1,[::-1]是把值进行第一维度反序,即如果其是一维向量则是再一维向量里头尾反序,如果是在
二维向量的话则是进行第一维度数据反序,而第二维度里的值没有改变,例如在图像数据的话则是row那个维度进行反序。
代码如下:
testnp = np.random.randn(2, 3)
testnpsecond = testnp[::-1]
print("\ntestnp:", testnp,
"\ntestnpsecond:", testnpsecond,
'\nshape:', testnpsecond.shape[:-1], #相当于testnpsecond.shape[:1]
'\nshape:', testnpsecond.shape[:-1][::-1])
# shape[:-1][::-1]这里的意思是先取shape[1:2]的对应位置维度大小即为(460,640),然后再进行[::-1]把
# 其值进行反序,得到(640,460)
segm = cv2.resize(segm[0, :NUM_CLASSES].cpu().data.numpy().transpose(1, 2, 0),
img.shape[:-1][::-1],
interpolation=cv2.INTER_CUBIC)
输出为:
testnp: [[-1.33372927 1.2669729 -0.17848075]
[-1.9581627 0.00515841 -1.1380311 ]]
testnpsecond: [[-1.9581627 0.00515841 -1.1380311 ]
[-1.33372927 1.2669729 -0.17848075]]
shape: (2,)
shape: (2,)