此文为本人近期自学pytorch的笔记,根据pytorch基础入门所学内容做的笔记,如有误或者理解有偏差的,请多多指正。此教学视频的感受和体会在文章最后。如果你喜欢的话,可以关注公众号:你我的青春,一部分学习体验与推荐会分享在公众号上,公众号二维码已放在文章最后。希望我们在2022中加油前进!
CUDA NVIDIA进行硬件加速
深度学习核心:梯度下降算法
x‘(下一次的数值)=x-rate(步长)*x’(x倒数)
衍生出来的梯度下降有:Adam,sgd,rmsprop,nag,adadelta,adagrad,momentum
Closed Form Solution近似解
Logistic Regression压缩函数,压缩到0-1
Linear Regression 线性
Python与Pytorch数据类型区别
a=torch.randn(2,3)
print(a.type())#可以查看具体数据类型
#输出为'torch.FloatTensor'
print(type(a))#查看基本数据类型,不常用
#torch.Tensor
print(isinstance(a,torch.FloatTensor))#匹配数据类型
#输出为True
#同一个Tensor,部署在GPU与CPU上,是不一样的
``
### Dimension0/rank0(标量)
torch.tensor(1.)
#输出为tensor(1.)
torch.tensor(1.3)
#输出tensor(1.300)
#可以用来表示loss
向量在Pytorch中,统称为张量,
Dim0,标量
Dim1:Bias Linear Input
Dim2:Linear Input batch
Dim3:RNN input Batch
Dim4:CNN:[b,c,h,w]
tensor:输入现成数据
FloatTensor输入维度(不常用)
不推荐使用list
数据集的路径导入
import os
from torch.utils.data import Dataset
from PIL import Image
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, 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的使用(一个数据)
需要tensor数据类型才能展示,所以使用前需要进行格式转换
from torch.utils.tensorboard import SummaryWriter
writer=SummaryWriter("logs")
for i in range(100):
writer.add_scalar("y=x",i,i)#标签,y轴,x轴
# writer.add_image()
# writer.add_scalar()#数
writer.close()
打开方式:
在终端输入:
tensorboard --logdir=logs
当多人使用时,可能会出现端口占用,修改端口如下
tensorboard --logdir=logs --port=6007
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) # 转为np类型,这样才能匹配writer.add_image()的输入参数
print(type(img_array))
print(img_array.shape)#由(512, 768, 3)已知,通道在后面,所以需要其他函数将其转化
writer.add_image("test",img_array,1,dataformats='HWC')#显示图片,并进行格式转化了,将格式转为HWC,把通道放后面了,通过这种方法可以看到每个步骤执行的输出结果
for i in range(100):
writer.add_scalar("y=10", i, i) # 标签,y轴,x轴
writer.close()
transform进行图片的变换
import cv2
from PIL import Image
from torch.utils.tensorboard import SummaryWriter
from torchvision import transforms
# python的用法-》tensor的数据类型
# 通过transform.ToTensor去看两个问题
# 1、transform该如何使用(Python)
# 2、为什么需要Tensor数据类型
# 需要相对路径,因为是斜杆,绝对路径是反斜杠
img_path = "dataset/train/ants/0013035.jpg"
img = Image.open(img_path)
writer=SummaryWriter("logs")
# 1、transform该如何使用(Python)
tensor_trans = transforms.ToTensor()
tensor_img = tensor_trans(img)
#使用cv2引入图片
cv_img=cv2.imread(img_path)
writer.add_image("Tensor_img",tensor_img)
writer.close()
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
trans_totensor = transforms.ToTensor() # 将此方法赋给trans_totensor
img_tensor = trans_totensor(img) # 然后使用此方法后将结果赋值给img_tensor
writer.add_image("Totensor", img_tensor) # 然后显示在write上
# Normalize归一化
print(img_tensor[0][0][0])
trans_norm = transforms.Normalize([0.5, 0.5, 0.5], [0.5, 0.5, 0.5]) # 因为RGB是三层的,需要提供三个标准差
img_norm = trans_norm(img_tensor)
print(img_norm[0][0][0])
writer.add_image("Normalize", img_norm)
#Resize
print(img.size)
trans_resize=transforms.Resize((512,512))
img_resize=trans_resize(img)
print(img_resize)
#Compose - resize -2
trans_resize_2=transforms.Resize(512)
#PIL-PIL->tensor
trans_compose=transforms([trans_resize_2,trans_totensor])
img_resize_2=trans_compose(img)
writer.add_image("Resize",img_resize_2,1)#后面的1为将输出放在第一位显示出来
#RandomCrop
trans_random=transforms.RandomCrop(512)
trans_compose_2=transforms.Compose([trans_random,trans_totensor])#前面表示随机裁剪,后面为转为tensor数据类型
for i in range(10):
img_crop=trans_compose_2(img)
writer.add_image("RandonCrop",img_crop,i)
writer.close()
一些方式方法的总结:
- 首先关注输入输出以及类型,需要什么参数(可用print或者官方文档查看)
- 多看官方文档
torchvision统一管理处理数据集
import ssl
import torchvision
from torch.utils.tensorboard import SummaryWriter
dataset_transform=torchvision.transforms.Compose([torchvision.transforms.ToTensor()])
ssl._create_default_https_context = ssl._create_unverified_context
train_set=torchvision.d