zip迭代tensor数据、求topk的简单方法,shape[:-1],[::-1]的用法

58 篇文章 2 订阅
24 篇文章 2 订阅

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,)

 

 

 

 

 

 

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值