TensorBoardX add_image()输出图片与torchvision.transforms.Normalize()标准化需要注意的地方

TensorBoardX add_image()输出图片与torchvision.transforms.Normalize()标准化

版权归属:

更多关注:

  • https://github.com/chanhal
  • https://www.zhihu.com/people/chanhal

1、TensorBoardX add_image()输出图片需要注意的地方

pytorch中调用TensorBoardX显示图片的方法如下:

from tensorboardX import SummaryWriter

writer = SummaryWriter(log_dir)
# display image
writer.add_image('label_name', img, global_step=total_step)

首先,label_name必须是一个唯一的名字,特别需要注意的是防止与add_scale()中的名字重复,这样子会出现莫名的错误;

其次,参数img可以是numpy or torch.Tensor,需是一张图像的三维矩阵,格式是[C, H, W]。如果是 torch.Tensor时,通常是选择batch中的一张图片img = batch[0];如果是numpy,通常读取的图片是[H, W, C],这时需要用numpy.transpose(img, (1,2,0))转换过来。

再者,参数img的值域范围是[0, 1] or [0, 255],在输入图片转换时特别需要注意。下面就说这个问题。

2、torchvision.transforms.Normalize()标准化需要注意的地方

使用torchvision.transforms进行输入图片的转换:

def get_sync_transform(opt):
    transform_list = []

    osize = [opt.load_size, opt.load_size]
    transform_list.append(Resize(osize, Image.BILINEAR))
    transform_list.append(RandomScaleCrop())

    # -chenhao for densenet memory overflow
    osize = [opt.crop_size, opt.crop_size]
    transform_list.append(Resize(osize, Image.BILINEAR))

    if opt.is_train and not opt.no_flip:
        transform_list.append(transforms.RandomHorizontalFlip())

    # note: this one range is [-1, 1]
    # transform_list += [ToTensor(),
    #                    Normalize((0.5, 0.5, 0.5),
    #                              (0.5, 0.5, 0.5))]
    #
    # note: this one range is [0, 1]
    transform_list += [ToTensor()]

    return transforms.Compose(transform_list)

上述代码中ToTensor()就已经默认scaled image value to [0, 1],如果再使用Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))就会scale image value to [-1, 1],Normalize(mean, std, inlace=False)标准化的公式:
o u t = i n − m e a n s t d out = \frac{in - mean}{std} out=stdinmean
将mean=0.5, std=0.5代入公式,可知值域范围为[-1, 1]。

你可能感兴趣的:(深度学习,Python,pytorch)