PyCharm入门学习笔记(一):Dataset,Tensorboard,Transforms

一、Pytorch一些快捷键的使用:

  1. ctrl + p:查看方法的输入类型
  2. shift + enter:换到下一行首部

二、类的内置函数call函数

class Person:
    def __call__(self, name):
        print("内置__call__方法")

    def hello(self, name):
        print("自定义函数")

person = Person()
# 调用的两种方式:
# 1.xx() 形式,调用了__call__()
person("zhangsan")
# 2.通过xx.自定义函数()调用
person.hello("lisi")

三、Dataset的使用

from torch.utils.data import Dataset
from PIL import Image
import os

class MyData(Dataset):

    # 初始化
    # self提供全局变量
    def __init__(self, root_dir, label_dir):
        # 根目录
        self.root_dir = root_dir
        # label目录
        self.label_dir = label_dir
        # 拼接 root + label
        self.path = os.path.join(self.root_dir, self.label_dir)
        # os.listdir获取label文件下的列表
        self.img_path = os.listdir(self.path)

    # idx表示数据的编号
    def __getitem__(self, idx):
        # 获取idx的图片名
        img_name = self.img_path[idx]
        # 获取图片路径
        img_item_path = os.path.join(self.root_dir, self.label_dir, img_name)
        # 打开图片
        img = Image.open(img_item_path)
        # 赋值label,并在下一步返回img和label
        label = self.label_dir
        return img, label

    def __len__(self):
        return len(self.img_path)


root_dir1 = "../dataset/train"
ants_label_dir1 = "ants"
ants_dateset = MyData(root_dir1, ants_label_dir1)
print(ants_dateset[1])

四、Tensorboard的使用

4.1 代码展示

from torch.utils.tensorboard import SummaryWriter
import numpy as np
from PIL import Image

# tensorboard 的使用
#
# 1.设置tensorboard文件logs
writer = SummaryWriter("logs")
# 2.获取图片
image_path = "../dataset/train/ants_image/5650366_e22b7e1065.jpg"
img_PIL = Image.open(image_path)
# 将PIL转为numpy类型
img_array = np.array(img_PIL)
# 可以看出这里的图片是长 宽 通道,所以要在下一步设置为HWC
print(img_array.shape)

# 3.设置tensorboard图片的名字为test
# 第三个参数设置表示 step步数
# dataformats要与图片shape对应
writer.add_image("test", img_array, 2,dataformats='HWC')
for i in range(100):
    # 在tensorboard画出 y = 2x 的图像
    writer.add_scalar("y = 2x", 2*i, i)
# 4.关闭
writer.close()

# 在终端输入 tensorboard --logdir=exercise/logs --port=6007
# 打开6007端口的logs

4.2 结果展示:

在这里插入图片描述

4.3 在使用tensorboard遇到的问题:

问题一:因为我的logs是在exercise下的,所以应写成tensorboard --logdir=exercise/logs --port=6007,而不是tensorboard --logdir=logs --port=6007
问题二:记得一定要关闭tensorboard,即最后一行代码writer.close()

在这里插入图片描述

五、Transforms的使用

5.1 代码展示

from PIL import Image
from torch.utils.tensorboard import SummaryWriter
from torchvision import transforms


# 绝对路径:E:\PyCharm_Project\learn_pytorch\dataset\train\ants_image\0013035.jpg
# 相对路径:../dataset/train/ants_image/0013035.jpg
img_path = "../dataset/train/ants_image/0013035.jpg"
img = Image.open(img_path)
print("PIL:")
print(img)
writer = SummaryWriter("logs")

# 一、ToTensor():
# 将PIL/ndarray类型 -》 Tensor类型
# 1) Image.open()打开的是图片的PIL类型
# 2) cv2.open()打开的是图片的ndarray类型
# 使用形式:transforms.ToTensor()
trans_tensor = transforms.ToTensor()
# 通过ctrl+p可以查看变量tensor_trans的输入数据类型为pic
img_tensor = trans_tensor(img)
print("img->Tensor:")
print(img_tensor)
# 显示在tensorboard上,记得要close
writer.add_image("Tensor_img", img_tensor)

# 二、Normalize():归一化
# 使用形式:transforms.Normalize(([, , ], [, , ]))
trans_norm = transforms.Normalize([0.5, 0.5, 0.5], [0.5, 0.5, 0.5])
img_norm = trans_norm(img_tensor)
# 归一化公式:
# output[channel] = (input[channel] - mean[channel]) / std[channel]
# 解释: 假设:mean=0.5 std=0.5 input范围为[0,1]
#       那么output=(input-0.5)/0.5=2*input-1
#       经过上式output范围为[-1,1]
print(img_tensor[0][0][0])
print(img_norm[0][0][0])
writer.add_image("Normalize", img_norm)

# 三、Resize():改变大小
# 使用形式:transforms.Resize((长, 宽))
trans_resize = transforms.Resize((512, 512))
# img PIL(768×512) -> img_resize PIL(512×512)
img_resize = trans_resize(img)
print(img.size)
print(img_resize)
# 要想在tensorboard显示,要将PIL -> Tensor/numpy
img_resize = trans_tensor(img_resize)
writer.add_image("Resize", img_resize, 0)

# 四、Compose():
# 可以把几个tranforms组合在一起使用
# 相当于一个组合器,可以对输入图片一次进行多个transforms的操作
# 注意使用顺序:前一个操作的输出,要是后一个操作的输入
# 使用形式:transforms.Compose([transfomer操作1, transfomer操作2, ...])
trans_resize_2 = transforms.Resize(512)
trans_compose = transforms.Compose([trans_resize_2, trans_tensor])
# PIL -> PIL改变大小 -> tensor
img_resize_2 = trans_compose(img)
writer.add_image("Resize", img_resize_2, 1)


# 五、RandomCrop():随机裁剪
trans_random = transforms.RandomCrop((500, 200))
trans_compose_2 = transforms.Compose([trans_random, trans_tensor])
# 随机裁剪10次500×200的图片
for i in range(10):
    img_crop = trans_compose_2(img)
    writer.add_image("RandomCrop", img_crop, i)

writer.close()

5.2 结果显示

PIL:
<PIL.JpegImagePlugin.JpegImageFile image mode=RGB size=768x512 at 0x1DCB0606D10>
img->Tensor:
tensor([[[0.3137, 0.3137, 0.3137,  ..., 0.3176, 0.3098, 0.2980],
         [0.3176, 0.3176, 0.3176,  ..., 0.3176, 0.3098, 0.2980],
         [0.3216, 0.3216, 0.3216,  ..., 0.3137, 0.3098, 0.3020],
         ...,
         [0.3412, 0.3412, 0.3373,  ..., 0.1725, 0.3725, 0.3529],
         [0.3412, 0.3412, 0.3373,  ..., 0.3294, 0.3529, 0.3294],
         [0.3412, 0.3412, 0.3373,  ..., 0.3098, 0.3059, 0.3294]],

        [[0.5922, 0.5922, 0.5922,  ..., 0.5961, 0.5882, 0.5765],
         [0.5961, 0.5961, 0.5961,  ..., 0.5961, 0.5882, 0.5765],
         [0.6000, 0.6000, 0.6000,  ..., 0.5922, 0.5882, 0.5804],
         ...,
         [0.6275, 0.6275, 0.6235,  ..., 0.3608, 0.6196, 0.6157],
         [0.6275, 0.6275, 0.6235,  ..., 0.5765, 0.6275, 0.5961],
         [0.6275, 0.6275, 0.6235,  ..., 0.6275, 0.6235, 0.6314]],

        [[0.9137, 0.9137, 0.9137,  ..., 0.9176, 0.9098, 0.8980],
         [0.9176, 0.9176, 0.9176,  ..., 0.9176, 0.9098, 0.8980],
         [0.9216, 0.9216, 0.9216,  ..., 0.9137, 0.9098, 0.9020],
         ...,
         [0.9294, 0.9294, 0.9255,  ..., 0.5529, 0.9216, 0.8941],
         [0.9294, 0.9294, 0.9255,  ..., 0.8863, 1.0000, 0.9137],
         [0.9294, 0.9294, 0.9255,  ..., 0.9490, 0.9804, 0.9137]]])
tensor(0.3137)
tensor(-0.3725)
(768, 512)
<PIL.Image.Image image mode=RGB size=512x512 at 0x1DCB1D3EE60>

5.3 Tensorboard显示:

5.3.1 ToTensor:相片的PIL格式需要转换成Tensor格式才能在Tensorboard上显示

在这里插入图片描述

5.3.2 Normalize:进行归一化操作可以改变图片的颜色

在这里插入图片描述

5.3.3 Resize:将768×512改变成512×512

在这里插入图片描述

5.3.4 Compose:可以将连续的几个transforms操作合并一起,但要保证前一个操作的输出时候一个操作的输入

在这里插入图片描述

5.3.5 RandomCrop:随机裁剪出10份图片(这里是第六份)

在这里插入图片描述

六、其他函数/类

关注输入和输出类型
多看官方文档
关注方法需要什么参数
不知道返回值的时候:*print()、print(type())、debug

【参考 PyTorch深度学习快速入门教程 -小土堆】

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值