其他分享
首页 > 其他分享> > Pytorch关于tensorboard和transforms的学习笔记

Pytorch关于tensorboard和transforms的学习笔记

作者:互联网

Dataset

类继承Dataset
    # MyData 类
    class MyData(Dataset):
        def __init__(self, root_dir, label_dir):
            self.root_dir = root_dir
            self.label_dir = label_dir
            self.path = os.path.join(self.root_dir, self.label_dir)
            self.img_path_list = os.listdir(self.path)
    
        def __getitem__(self, index):
            # 得到dataset图片
            img_name = self.img_path_list[index]
            img_item_path = os.path.join(self.root_dir,self.label_dir,img_name)
            img = Image.open(img_item_path)
            label = self.label_dir
            return img,label
    
        def __len__(self):
            return len(self.img_path_list)
使用
    # 实例
    root_dir = "dataset1/train"
    
    # 获得ants数据集
    ants_label_dir = "ants_image"
    ant_dataset = MyData(root_dir=root_dir, label_dir=ants_label_dir)
    
    # 获得bees数据集
    bees_label_dir = "bees_image"
    bee_dataset = MyData(root_dir=root_dir, label_dir=bees_label_dir)
    
    # 整合bees和anys 的数据集
    train_dataset = ant_dataset + bee_dataset

tensorboard

使用tensorboard
    from torch.utils.tensorboard import SummaryWriter
    import numpy as np
    from PIL import Image
    
    
    writer = SummaryWriter("logs")
    
    img_path = "dataset1/train/bees_image/92663402_37f379e57a.jpg"
    img = Image.open(img_path)
    img_array = np.array(img)
    # 图像数据类型 img_tensor
    writer.add_image("img_array1",img_array,2,dataformats='HWC')
    
    
    for i in range(100):
        # Args:
        #   tag (string): Data title
        #   scalar_value : y Value
        #   global_step (int): x Value
        writer.add_scalar("y=x",3*i,i) # 添加标量
    
    writer.close()


打开tensorboard生成的事务文件
Terminal 
    tensorboard --logdir=logs 
        -port=6007

将图片的格式PIL.JpegImagePlugin.JpegImageFile转成add_image接受的格式
    pip install opencv-python
    numpy.array
        img_array = np.array(img)

transforms

transforms.ToTensor
    作用
        将数据转换成神经网络需要的格式
        将数据转换成为 Tensor
    使用
        img_path = "dataset1/train/bees_image/92663402_37f379e57a.jpg"
        img = Image.open(img_path)
        # img_array = np.array(img)
        tensor_trans = transforms.ToTensor()
        tensor_img = tensor_trans(img)

transforms.Normalize
    output[channel] = (input[channel] - mean[channel]) / std[channel]
    例子
        0 < input[channel] < 1
        mean =[0.5,0.5,0.5]  #len(mean) = channel 
        std =[0.5,0.5,0.5]
        output[channel=0] = input[channel=0] * 2 - 1 
        -1 < output[channel=0] < 1

transforms.Resize & transforms.Compose
    # 使用Resize 对图片进行任意的缩放 512,512
    print(img.size)
    trans_resize = transforms.Resize((512, 512))
    img_resize1 = trans_resize(img)
    print(img_resize1)
    # PIL To TOTENSOR
    img_resize1 = trans_totensor(img_resize1)
    writer.add_image("img_resize1", img_resize1)
    
    # 使用Resize 对图片进行等比例的缩放 735 550
    print(img.size)
    trans_resize = transforms.Resize(550)
    trans_compose = transforms.Compose([trans_resize, trans_totensor])
        # img_resize2 = trans_resize(img)
        # img_resize2 = trans_totensor(img_resize2) 

    # PIL To TOTENSOR
    img_resize2 = trans_compose1(img)
    print(img_resize2.size)
    writer.add_image("img_resize2", img_resize2)
transforms.RandomCrop
    # 使用RandomCrop 随机裁剪指定大小的图片
    trans_randomCrop = transforms.RandomCrop([30,30])
    trans_compose2 = transforms.Compose([trans_randomCrop, trans_totensor])
    for i in range(10):
        img_randomCrop = trans_compose2(img)
        print(img_randomCrop.size)
        # PIL To TOTENSOR
        writer.add_image("img_randomCrop", img_randomCrop,i+1)
使用方法总结
    关注方法描述的 输入和输出
    关注方法的参数

Question & Answer

Python中下划线在变量名和方法名中的含义

原文链接:https://blog.csdn.net/cnds123/article/details/118707525

python中的下划线主要分为如下几类:

前置单下划线,如_var,
    主要是用于将变量或方法定义为私有属性。它对于程序员而言是一种提示,这里的私有属性并非如java中的私有,而是一种约定俗成,想强行访问仍旧可以正常访问。
后置单下划线,如var_,
    主要用于将变量区别,如变量名称和关键字冲突,后面加个下划线区别开来。
前置双下划线,如__var,
    类中带前置双下划线的变量或方法,都会触发python解释器的名称修饰,是不能直接通过该名称去访问到的,实现了一定程度上的隔离。
前后都有双下划线,如__var__,
    常见的有__init__()对象构造函数,这类方法是python中的魔法方法(特殊方法),用于特殊用途。
单下划线本身,如_ 在Python REPLs如IDLE Shell中是一个特殊变量(可以表示一个临时值),它表示解释器计算的最后一个表达式的结果。

AttributeError: type object 'Image' has no attribute 'open'

原因
    from PIL.Image import Image
解决方法
    from PIL import Image

关于Python Console中设置相对路径出现乱码问题

Python Console
    定义
        Python程序的Script
问题描述
    如设置 img = "dataset\train\ants"
原因
    '\' 导致字符转义
解决方法
    img = "dataset\train\ants"
    改为
    1. img = "dataset/train/ants"
    2. img = "dataset\\train\\ants"

add_image方法出现TypeError: Cannot handle this data type: (1, 1, 512), |u1

原因
Shape:
    img_tensor: Default is :math:`(3, H, W)`. You can use ``torchvision.utils.make_grid()`` to
    convert a batch of tensor into 3xHxW format or call ``add_images`` and let us do the job.
    Tensor with :math:`(1, H, W)`, :math:`(H, W)`, :math:`(H, W, 3)` is also suitable as long as
    corresponding ``dataformats`` argument is passed, e.g. ``CHW``, ``HWC``, ``HW``.
解决方法
    使用type(img)查看dataformats
    使用add_image时设置对应的dataformats
    例如
        writer.add_image("img_array1",img_array,1,dataformats='HWC')

标签:img,self,label,Pytorch,transforms,tensorboard,trans,dir
来源: https://www.cnblogs.com/Norbury/p/16201468.html