python argparse中使用True或者False

272 阅读1分钟

 

def str2bool(v):
    if isinstance(v,bool):
        return v
    if v == 'True':
        return True
    if v == 'False':
        return False

import argparse
parser = argparse.ArgumentParser()

parser.add_argument('--drop', type=str2bool, default=False)
cfg = parser.parse_args()

if cfg.drop:
    print('niubi')
else:
    print('walalala')

用这个人方式就能替代 --store_true了

​ ​

 

在用pytorch训练网络的时候,每一张图片都被转为了张量形式的数据,有时候我们需要将这些张量转为jpg格式的图片,应该如何转变呢?我们只要将张量tensor转为PIL格式的数据,然后再将数据保存起来就可以了,下面以一个简单的例子进行说明,这个例子中的图片是一个随机生成的图片。

import torch
from torchvision import transforms

toPIL = transforms.ToPILImage() #这个函数可以将张量转为PIL图片,由小数转为0-255之间的像素值
img = torch.randn(3,128,64)
pic = toPIL(img)
pic.save('random.jpg')

​ 对于一个矩阵,如果想要找到这个矩阵中最大元素的值和这个元素在原矩阵中的索引,可以用下面的代码:

    x = torch.randn(4,3)
    print(x)
    column = 3
    index = torch.argmax(x)
    x_view = x.view(-1)
    print(x_view)
    print(index)
    if (index+1)% column == 0:
        i = (index+1)//column - 1
        j = column - 1
    else:
        i = (index+1)//column
        j = ((index+1)%column) - 1
    if x[i][j] == x_view[index]:
        print(x[i][j])
        print(x_view[index])
index = torch.argmax(x) 返回的是最大元素的一维索引

下面看一下代码运行的结果: 在这里插入图片描述为了获取最大值在原始矩阵中的索引,而不是view为一维状态下的一维索引,我们需要对这个index进行分解,分解出row 和column的索引。分解分为两种情况: (1)index + 1后的值为column的整数倍,说明这个最大值在每个行向量的最末尾,用if 下面对应的逻辑进行获取索引值。 (2)如果不满足上面的if判断,那么书名最大值落在某个行向量的中间位置,就按照else下面的逻辑获取 i 和j 的值。

在后面加了判断 if x[i][j] == x_view[index]: 是为了保证我们获取的 i 和 j 的索引值是正确的,因为通过view后的向量的索引为index的位置一定是最大值,将我们的计算出的索引位置对应的数值和真正的最大值比较,就能进一步判断我们算出的矩阵索引是否正确。