一、两大法宝函数

1、dir()

打开,看见

2、help()

查看说明书

二、三个运行方式的区别

三、如何导入数据

两种数据形式:Dataset、Dataloader

Dataset

1、如何获取每一个数据及其label?

2、总共有多少条数据?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
from torch.utils.data import Dataset
from PIL import Image
import os # 用于获取图片的地址


class MyData(Dataset):

def __init__(self, root_dir, label_dir):
self.root_dir = root_dir
self.label_dir = label_dir
self.path = str(os.path.join(self.root_dir, self.label_dir)) # 拼接地址
self.img_path = os.listdir(self.path) # 获取当前目录中文件的地址列表

def __getitem__(self, 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 = self.label_dir
return img, label

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


root_dir = "dataset/train"
ants_label_dir = "ants"
bees_label_dir = "bees"
ants_dataset = MyData(root_dir, ants_label_dir)
bees_dataset = MyData(root_dir, bees_label_dir)

train_dataset = ants_dataset + bees_dataset

四、Tensorboard的使用

1
2
3
4
5
6
7
8
from torch.utils.tensorboard import SummaryWriter

writer = SummaryWriter("logs") # 文件存放在logs文件夹中

for i in range(100):
writer.add_scalar("y=2x", 2*i, i)
# tag 纵轴 横轴
writer.close()

如何打开tensorboard界面?

终端中:

tensorboard –logdir=”D:\pycharm\learn_pytorch\learn_pytorch\logs”

如何切换打开的端口(避免服务器训练时与别人冲突)

tensorboard –logdir=”D:\pycharm\learn_pytorch\learn_pytorch\logs” –port=6007(修改端口地址)

导入自己的图片

1
2
3
4
5
6
7
8
9
10
11
12
from torch.utils.tensorboard import SummaryWriter
import numpy as np
from PIL import Image

writer = SummaryWriter("logs")
image_path = "dataset/train/ants/0013035.jpg"
img_PIL = Image.open(image_path)
img_array = np.array(img_PIL) # 将图片转为numpy格式
writer.add_image("test", img_array, 1, dataformats='HWC')
# 从PIL到numpy,需要在add_image()中指定shape中每一个数字、维度表示的含义

writer.close()

如果改变image的地址并且将writer.add_image("test", img_array, 1(横轴), dataformats='HWC')中的横轴改为2,则tensorboard会在之前的图片上显示拖动条,向右拖动即为第二张图片

五、transform的使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
from PIL import Image
from torch.utils.tensorboard import SummaryWriter
from torchvision import transforms

writer = SummaryWriter("logs")
img = Image.open("dataset/train/ants/0013035.jpg")
print(img)

# ToTensor (transforms的一种工具)
trans_totensor = transforms.ToTensor() # 打开并配置工具
img_totensor = trans_totensor(img) # 使用工具
writer.add_image("ToTensor", img_totensor)

# Normalize 归一化 (预处理,确保输入模型的数据在相同的尺度上。将数据缩放到一个小范围)
trans_norm = transforms.Normalize([0.5, 0.5, 0.5], [0.5, 0.5, 0.5])
img_norm = trans_norm(img_totensor)
writer.add_image("Normalize", img_norm)

# Resize
print(img.size)
trans_resize = transforms.Resize((512, 512))
img_resize = trans_resize(img) # 得到的仍然是PIL类型
img_resize = trans_totensor(img_resize) # 得到tensor类型的图片
writer.add_image("Resize", img_resize, 0)
print(img_resize)


# 方法2 Compose - resize 相当于打包处理的过程
trans_resize_2 = transforms.Resize(512)
trans_compose = transforms.Compose([trans_resize_2, trans_totensor])
# 将resize和转换为tensor的操作用compose打包,第一个操作的输出是第二个操作的输入
img_resize2 = trans_compose(img)
writer.add_image("Resize", img_resize2, 1)


# RandomCrop 随机裁剪
trans_randomCrop = transforms.RandomCrop((500, 1000)) # 只写一个数就是按正方形裁剪
trans_compose2 = transforms.Compose([trans_randomCrop, trans_totensor])
for i in range(10):
img_crop = trans_compose2(img)
writer.add_image("RandomCropHW", img_crop, i)

writer.close()

transforms.Normalize(mean, std)

注:需要传递tensor类型图片

将图像的每个通道(RGB,共3个通道)按特定的均值和标准差进行归一化

Resize()

注:需要传递PIL类型图片

括号中只给一个数值,那么就将图片短的那个边匹配这个数值进行等比缩放

括号中给两个数值,就将长宽设置为这两个数值

Tips

关注输入和输出类型

关注方法需要什么参数

不知道返回值的时候,可以print()或print(type())或debug