一、Pytorch一些快捷键的使用:
- ctrl + p:查看方法的输入类型
- 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深度学习快速入门教程 -小土堆】