PIL,matplotlib,pytorch tensor,visdom之间的图片显示问题

用pytorch训练模型过程中有时要显示图片,这里以mnist数据集为例,最方便的无疑是visdom,可以接受tensor格式的输入

visdom

vis.images(x,nrow=8,win='x source',opts=dict(
        title = 'x source'
    ))

这里的x维度是 [32, 1, 28 ,28]
显示效果:
PIL,matplotlib,pytorch tensor,visdom之间的图片显示问题_第1张图片
注:x 未经规范化 transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]) 处理
如果是经过规范化处理的数据要先进行反规范化:

    def denormalize( x_hat):
        """
        反normalize
        :return:
        """
        mean = [0.485, 0.456, 0.406]
        std = [0.229, 0.224, 0.225]

        # x_hat = (x-mean) / std
        mean = torch.tensor(mean).reshape(3, 1, 1)
        std = torch.tensor(std).reshape(3, 1, 1)

        x = x_hat * std + mean

        return x

【19/9/18】 如果用的是远程服务器,可以在xshell中设置利用 ssl 隧道将远程服务器上某个端口的上的内容映射到本地
PIL,matplotlib,pytorch tensor,visdom之间的图片显示问题_第2张图片
PIL,matplotlib,pytorch tensor,visdom之间的图片显示问题_第3张图片
这里相当于命令 ssh -L 127.0.0.1:8097:127.0.0.1:8097 account@serveraddess

经过上述设置,在本地打开浏览器 http://localhost:8097 就可以看到远程服务器上8097端口的内容了,熟悉的 fucking world 又回来了
PIL,matplotlib,pytorch tensor,visdom之间的图片显示问题_第4张图片

PIL + matplotlib

注: 用 PIL.Image.show() 调用的是系统图片查看器,所以好像不能在jupyter页面上显示,至少colab上是不能显示

虽然用visdom很方便,但其有局限性。那就是只能在本地用,比如我如果去白嫖kaggle 或者 colab 的显卡就没法用visdom做可视化了
下面介绍用 PIL 结合 matplotlib 做多图片的显示。
还是mnist 数据集,x 为 tensor 格式数据 [32,1,28,28],需要注意的是这里的x在读取时经过了transforms.ToTensor(), # 转换成tensor 格式,并且压缩到[0 ,1],而且plt.imshow() 接受 二维 [h,w] 三维[h,w,channel] 的 numpy.ndarrry格式的输入,而图片在tensor中是以[c,h,w]存储的,可以通过维度变换进行转变,我用的是transforms.ToPILImage()

tf2 = transforms.ToPILImage()
fig = plt.figure()

for i in range(x.size(0)):  # x: [0 ~ 31]
    plt.subplot(4,8,i+1)
    img = tf2(x[i]).convert('L')  # to PIL img
    img=np.array(img)
    # print(img.shape,type(img),type(x[i]))
    # img=img.reshape(28,28,)
    # # print(img.shape, type(img))
    plt.imshow(img)

plt.show()

emmmm 感觉颜色不太对,不知道哪里的问题,找到问题再回来改了
PIL,matplotlib,pytorch tensor,visdom之间的图片显示问题_第5张图片

你可能感兴趣的:(pytorch)