TensorBoardX add_image()輸出圖片與torchvision.transforms.Normalize()標準化需要注意的地方

TensorBoardX add_image()輸出圖片與torchvision.transforms.Normalize()標準化

版權歸屬:

更多關注:

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)標準化的公式:
out=inmeanstd out = \frac{in - mean}{std}
將mean=0.5, std=0.5代入公式,可知值域範圍爲[-1, 1]。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章