PyTorch深度学习(一)

环境配置

1
conda create -n pytorch python=3.8

启动这个pytorch这个环境

1
conda activate pytorch

关闭这个环境

1
conda deactivate

查看这个环境中有那些pip包

1
pip list

接着安装pytorchhttps://pytorch.org/

pytorch1.jpg

安装的时候可以看一下GPU

1
https://www.geforce.cn/hardware/technology/cude/supported-gpus

如果电脑上没有英伟达的显卡就在安装的时候CUDA选择None,接着就是复制下面的命令执行,在下面这个虚拟环境中输入指令

1
(pytorch)C:\User>

接着验证环境,先输入python进入环境

1
2
3
import torch
torch.cuda.is_available()
#如果有返回True没有显示False

使用编辑器Jupyter要先安装对应的包

1
conda install nb_conda

启动方法

1
(pytorch)C:Users>jupyter notebook

两大法宝函数

pytorch2.jpg

dir()函数

这个dir就是查看一些模块的分区有什么模块,这个是可以一步一步的查看这个模块中的内容

help()函数

这个函数可以让我们知道每个工具是如何使用的,工具使用方法。

Dataset

使用下面代码可以查看这个Dataset的官方说明使用

1
2
from torch.utils.data import Dataset
help(Dataset)

Dataset代码实现

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
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 = 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 = "hymenoptera_data/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)
img,label = ants_dataset[0]
img,label = bees_dataset[2]
#img.show()

train_dataset = ants_dataset + bees_dataset #这个是将两个数据集结合起来ants数据在前,bees数据在后
#print(len(ants_dataset)) #124
#print(len(bees_dataset)) #121
#print(len(train_dataset)) #245

img,label = train_dataset[124]
img.show()

TensorBoard的使用

绘制简单的图像

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

write = SummaryWriter("logs")

#write.add_image()
#y=x
for i in range(100):
write.add_scalar("y=x的函数",i,i) #第一个参数是标题,第二个是y轴数据,第三个是x轴数据

write.close()

pytorch3.png

安装tensorboard

1
(pytorch) G:\pytorch>pip install tensorboard

运行上面的python代码就可以得到一个log文件夹,这个文件夹中就有数据,接下来就是查看这个数据,指定端口

1
(pytorch) G:\pytorch>tensorboard --logdir=logs --port=6007

安装opencv

1
pip install opencv-python

查看一个图片的类型

1
2
3
4
5
from PIL import Image

image_path = "hymenoptera_data/train/ants/0013035.jpg"
img = Image.open(image_path)
print(type(img))

利用Numpy对图片进行处理

1
2
3
import numpy as np
img_array = np.array(img_path)
#这样可以将图片数据转化为np类型

实操

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

write = SummaryWriter("logs")
image_path = "hymenoptera_data/train/ants/24335309_c5ea483bb8.jpg"
img_PIL = Image.open(image_path)
img_array = np.array(img_PIL)

print(type(img_array))
print(img_array.shape) #这个是查看类型来判断dataformats="HWC"的选择

write.add_image("test",img_array,1,dataformats="HWC") #这个数字是表示第几步,第一个参数还是标题
#y=x
for i in range(100):
write.add_scalar("y=x的函数",i,i) #第一个参数是标题,第二个是y轴数据,第三个是x轴数据

write.close()

Transforms的使用

将图片数据类型转化为tensor类型

pytorch4.png
pytorch5.png

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
from torchvision import transforms
from PIL import Image
from torch.utils.tensorboard import SummaryWriter

# python的用法 -> tensor数据类型
# 通过transforms.ToTensor()将PIL.Image或者numpy.ndarray转换为tensor数据类型

img_path = "hymenoptera_data/train/ants/0013035.jpg"
img = Image.open(img_path)
#print(img) 查看这个图片的类型
#1、transforms.ToTensor()将PIL.Image或者numpy.ndarray转换为tensor数据类型
# 第一种方法:img_tensor = transforms.ToTensor()(img)
img_tensord = transforms.ToTensor()
img_tensor = img_tensord(img)
#print(img_tensor.shape) 这个得到的是torch.Size([3, 512, 768])最小的数字是C其他的可以看一下图片来确定
#print(img_tensor)

writer = SummaryWriter("logs")
writer.add_image("test",img_tensor,3,dataformats="CHW")
writer.close()

__call__的用法

1
2
3
4
5
6
7
8
9
10
11
12
13
class Person:
def __call__(self,name):
print("__call__"+"hello"+name)

def hello(self,name):
print("hello"+name)

person = Person()
person("zhangsan")
person.hello("lisi")

#__call__hellozhangsan
#hellolisi

从上述的代码运行结果可以知道这个__call__方法的使用是不用使用.去调用这个方法,直接是可以使用这个方法

Normalize的使用

pytorch6.png

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
from PIL import Image
from torchvision import transforms
from torch.utils.tensorboard import SummaryWriter

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

#ToTensor
trans_tensor = transforms.ToTensor()
img_tensor = trans_tensor(img)
writer.add_image("ants", img_tensor, 1)

#Normalize
print(img_tensor[0][0][0])
trans_norm = transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))
#因为图片是一个RGB三元所以这里mean中是有三个数据,总的就是对一个图片的像素进行修改

img_norm = trans_norm(img_tensor)
print(img_norm[0][0][0])
writer.add_image("ants_norm", img_norm, 1)

writer.close()

Resize的使用

主要是对图片的缩放将比例修改

pytorch7.png

pytorch8.png

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
from PIL import Image
from torchvision import transforms
from torch.utils.tensorboard import SummaryWriter

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

#ToTensor
trans_tensor = transforms.ToTensor()
img_tensor = trans_tensor(img)
writer.add_image("ants", img_tensor, 1)

#Normalize
print(img_tensor[0][0][0])
trans_norm = transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))
img_norm = trans_norm(img_tensor)
print(img_norm[0][0][0])
writer.add_image("ants_norm", img_norm, 1)

#Resize
print(img.size)
trans_resize = transforms.Resize((512, 512))
# img PIL -> resize PIL -> img_resize PIL
img_resize = trans_resize(img)
print(img_resize)
print(img_resize.size)

#img_resize PIL -> tensor -> img_tensor_resize tensor
img_tensor_resize = trans_tensor(img_resize)
print(img_tensor_resize)
writer.add_image("ants_resize", img_tensor_resize, 1)
writer.close()

Compose的使用

Compose()中的参数需要时一个列表Python中,列表的表示形式为[数据1,数据2,…],在Compose中,数据需要transforms类型所以得到,Compose([transforms参数1,transforms参数2,…])

1
2
3
4
5
6
7
8
9
#Compose - resize - 2
trans_resize_2 = transforms.Resize(512)
trans_compose = transforms.Compose([trans_resize_2, trans_tensor])
#这个第一个参数是显示进行裁剪,第二个参数的意思是再进行数据的转换为tensor

img_resize_2 = trans_compose(img)
print(img_resize_2)
print(img_resize_2.size)
writer.add_image("ants_resize_2", img_resize_2, 1)

torchvision

官方学习文档

1
https://docs.pytorch.org/vision/stable/

使用CIFAR10数据

1
2
3
4
5
6
7
8
9
10
11
12
13
import torchvision

train_set = torchvision.datasets.CIFAR10(root='./data', train=True, download=True)
test_set = torchvision.datasets.CIFAR10(root='./data', train=False, download=True)

print(train_set[0]) #(<PIL.Image.Image image mode=RGB size=32x32 at 0x2717F5B1130>, 6)
print(train_set.classes) #('airplane', 'automobile', 'bird', 'cat', 'deer', 'dog', 'frog', 'horse','ship', 'truck')

img, label = train_set[0]
print(img) # <PIL.Image.Image image mode=RGB size=32x32 at 0x2717F5B1130>
print(label) # 6
print(train_set.classes[label]) #frog
img.show()

这个主要是对数据进行下载并查看第一个数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import torchvision
from torch.utils.tensorboard import SummaryWriter

dataset_transforms = torchvision.transforms.Compose([
torchvision.transforms.ToTensor()
])
train_set = torchvision.datasets.CIFAR10(root='./data', train=True,transform=dataset_transforms, download=True)
test_set = torchvision.datasets.CIFAR10(root='./data', train=False,transform=dataset_transforms, download=True)

# print(train_set[0]) #(<PIL.Image.Image image mode=RGB size=32x32 at 0x2717F5B1130>, 6)
# print(train_set.classes) #('airplane', 'automobile', 'bird', 'cat', 'deer', 'dog', 'frog', 'horse','ship', 'truck')

# img, label = train_set[0]
# print(img) # <PIL.Image.Image image mode=RGB size=32x32 at 0x2717F5B1130>
# print(label) # 6
# print(train_set.classes[label]) #frog
# img.show()

writer = SummaryWriter("p10")
for i in range(10):
img, label = train_set[i]
writer.add_image("train_set", img, i)

writer.close()

上述是将dataset与transform结合,dataloader的使用

1
https://docs.pytorch.org/docs/stable/data.html#torch.utils.data.DataLoader
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import torchvision

from torch.utils.data import DataLoader
from torch.utils.tensorboard import SummaryWriter

test_dataset = torchvision.datasets.CIFAR10(root='./data', train=False, download=True, transform=torchvision.transforms.ToTensor())
test_loader = DataLoader(dataset=test_dataset, batch_size=64, shuffle=False, num_workers=0,drop_last=True)

#测试数据集中第一张图片及target
img, target = test_dataset[0]
print(img.shape, target)

writer = SummaryWriter("p11")
for epoch in range(2):
step = 0
for data in test_loader:
imgs, targets = data
writer.add_images("Epoch{}_Step{}_Images".format(epoch, step), imgs, step)
step += 1

writer.close()