1、环境配置
anaconda
pytorch1.12.1
1.1 anaconda
1、注意添加环境变量
2、conda基础指令(如果开了代理服务器vpn,务必关闭!!!)
创建虚拟环境
- conda create -n 环境名称 package(需要的包/库)
例:conda create -n torch12 python=3.10 numpy
- 激活指定虚拟环境
Windows:
conda activate torch12
Linux:
source activate torch
- 关闭虚拟环境
conda deactivate
- 复制旧环境到新环境中
conda create -n openmmlab --clone torch12
- 删除虚拟环境
conda remove -n torch12 --all
- 查看存在的虚拟环境
conda envs list
- conda 换源
conda config --add channels 镜像源
更好的方法:
直接修改.condarc文件内容
Windows 用户无法直接创建名为 .condarc
的文件,可先执行 conda config --set show_channel_urls yes
生成该文件之后再修改。
北京外国语大学镜像源:
channels:
- defaults
show_channel_urls: true
default_channels:
- https://mirrors.bfsu.edu.cn/anaconda/pkgs/main
- https://mirrors.bfsu.edu.cn/anaconda/pkgs/r
- https://mirrors.bfsu.edu.cn/anaconda/pkgs/msys2
- https://mirrors.bfsu.edu.cn/anaconda/cloud/pytorch/
custom_channels:
conda-forge: https://mirrors.bfsu.edu.cn/anaconda/cloud
msys2: https://mirrors.bfsu.edu.cn/anaconda/cloud
bioconda: https://mirrors.bfsu.edu.cn/anaconda/cloud
menpo: https://mirrors.bfsu.edu.cn/anaconda/cloud
pytorch: https://mirrors.bfsu.edu.cn/anaconda/cloud
pytorch-lts: https://mirrors.bfsu.edu.cn/anaconda/cloud
simpleitk: https://mirrors.bfsu.edu.cn/anaconda/cloud
- 查看安装的package有哪些版本
conda search package(报名)
1.2 pytorch
1、创建虚拟环境
conda create -n torch12 python=3.10
2、安装torch1.12.1(GPU版)
conda install pytorch==1.12.1 torchvision==0.13.1 torchaudio==0.12.1 cudatoolkit=11.6 -c pytorch -c conda-forge
3、验证安装成功
import torch
torch.__version__()
结果如下:
4、检验pytorch是否可以用GPU:
2、pytorch
2.1 Python学习中的两大法宝函数
- dir() 函数:能让我们知道工具箱以及工具箱中的分隔区有什么东西(打开,看见)
- help() 函数:能让我们知道每个工具是如何使用的,工具的使用方法(说明书)
-
Python中 __call__ 的用法:内置函数 __call__ ,不用.的方式调用方法,可以直接拿对象名,加上需要的参数,即可调用方法.
2.2 IDE比较
2.2.1 Jupyter小知识
1、首先win+r,输入cmd,进入你想要运行或者创建Jupyter文件夹。
2、激活自己的虚拟环境
3、输入jupyter notebook
2.3 PyTorch加载数据
小知识:
tensor-> (batch-size,in_channels,h,w)
卷积核:(out_channels,in_channels/groups,h,w)
PyTorch 读取数据涉及两个类:Dataset & Dataloader包含在torch.utils.data中。
2.3.1 Dataset
Dataset:提供一种方式,获取其中需要的数据及其对应的真实的 label 值,并完成编号。主要实现以下两个功能:
- 如何获取每一个数据及其label
- 告诉我们总共有多少的数据
Dataset 是一个抽象类,所有数据集都需要继承这个类,所有子类都需要重写 __getitem__ 的方法,这个方法主要是获取每个数据集及其对应 label,还可以重写长度类 __len__
2.3.2 PIL和OpenCV
PIL(Python Image Library)是python的第三方图像处理库
OpenCV(Open Source Computer Vision Library)开放源代码计算机视觉库,主要算法涉及图像处理、计算机视觉和机器学习相关方法。
两种方法读图片
注意,路径引号前加 r 可以防止转义,或使用双斜杠
import PIL.Image as Image
import cv2
#PIL
img_path = r"imgs/dog.png"
img_data_PIL = Image.open(img_path)
img_data_PIL.show()
#CV
img_path_cv = cv2.imread(img_path)
cv2.imshow("dog",i
2.3.3 OS
os模块提供的就是各种 Python 程序与操作系统进行交互的接口
1、读取指定文件夹路径下所有文件信息返回一个列表
import os
dir_path = "dataset/train/ants"
img_path_list = os.listdir(dir_path) # 将文件夹下的东西变成一个列表
2、拼接路径
import os
root_dir = "dataset/train"
label_dir = "ants"
path = os.path.join(root_dir, label_dir) # 把两个路径拼接在一起
完整代码:
from torch.utils.data import Dataset
from PIL import Image #读取图片
import os #想要获得所有图片的地址,需要导入os(系统库)
#创建一个class,继承Dataset类
class MyData(Dataset):
def __init__(self,root_dir,label_dir): #创建初始化类,即根据这个类去创建一个实例时需要运行的函数
#通过索引获取图片的地址,需要先创建图片地址的list
#self可以把其指定的变量给后面的函数使用,相当于为整个class提供全局变量
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): #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)
img, label = ants_dataset[0]
img.show() # 可视化第一张图片
#将ants(124张)和bees(121张)两个数据集进行拼接
train_dataset=ants_dataset+bees_dataset
2.3.4 数据集类型
1、数据格式一
直接将文件名ants当做Label
2、数据格式二
当label比较复杂,存储数据比较多时,不可能以文件夹命名的方式,而是以每张图片对应一个txt文件,txt里存储label信息的方式
import os
root_dir=r"E:\学完了学完了\PyTorch\土堆-Pytorch\Learn_torch\dataset\train"
# 把原来的ants重命名为ants_image
target_dir="ants_image"
img_path=os.listdir(os.path.join(root_dir,target_dir))
label=target_dir.split('_')[0] # ants
out_dir="ants_label"
for i in img_path:
file_name=i.split('.jpg')[0]
with open(os.path.join(root_dir,out_dir,"{}.txt".format(file_name)),'w') as f:
f.write(label)
2.4 数据预处理:torchvision.transform
看 transforms.py文件(工具箱),它定义了很多 class文件(工具)
举例:
Compose类:将不同的transforms打包在一起
ToTensor类:把一个PIL的Image或者numpy数据类型的图片转换成 tensor 的数据类型
ToPILImage类:把一个图片转换成PIL Image
Normalize类:归一化
Resize类:尺寸变换
CenterCrop类:中心裁剪
2.4.1 ToTensor类
from torchvision import transforms
from PIL import Image
import torch
picture_path = "data/flower.jpg"
img_pil = Image.open(picture_path)
# 转换一个' ' PIL Image ' '或' ' numpy.ndarray ' 到张量
picture_transform = transforms.ToTensor()
img_tensor = picture_transform(img_pil)
print(type(img_tensor))
print(type(img_pil))
将数据类型转化回去:ToPILImage 的使用,把 tensor 数据类型或 ndarray 类型转换成 PIL Image
2.4.2 Normalize类
# 用均值和标准差归一化张量图像
picture_transform = transforms.Normalize(std=[0.5,0.5,0.5], mean=[0.5,0.5,0.5])
img_tensor_n = picture_transform(img_tensor)
print(img_tensor[0][0][0])
print(img_tensor_n[0][0][0])
img_pil.show()
picture_transform_PIL = transforms.ToPILImage()
img_tensor_n_pil = picture_transform_PIL(img_tensor_n)
img_tensor_n_pil.show()
2.4.3 CenterCrop类
# 在中心裁剪给定的图像
picture_transform = transforms.CenterCrop(500)
img_compose = picture_transform(img_pil)
print(img_compose.size)
print(img_pil.size)
2.4.4CenterCrop类
# 将输入图像调整为给定的大小
picture_transform = transforms.Resize([255,225])
img_compose = picture_transform(img_pil)
print(img_compose.size)
print(img_pil.size)
2.4.4RandomCrop类
# 在随机位置裁剪给定的图像
picture_transform_Crop = transforms.RandomCrop([500,500])
img_crop = picture_transform_Crop(img_pil)
img_crop.show()
print(img_crop.size)
print(img_pil.size)
2.4.5 Compose()
在Compose中,数据需要是transforms类型,所以得到Compose([transforms参数1,transforms参数2,...])。
# 将几个转换组合在一起。此转换不支持torchscript
picture_transform = transforms.Compose([
# 在中心裁剪给定的图像
#transforms.CenterCrop(500),
# 转换一个' ' PIL Image ' '或' ' numpy。ndarray ' '到张量
# transforms.ToTensor(),
# 将输入图像调整为给定的大小
transforms.Resize([255,225]),
# 将张量或ndarray转换为PIL Image
#transforms.ToPILImage(),
])
img_compose = picture_transform(img_pil)
print(img_compose.size)
print(img_pil.size)
2.5 torchvision.datasets
包含有:COCO 目标检测、语义分割;MNIST 手写文字;CIFAR 物体识别
from torchvision.datasets import FashionMNIST
## 使用FashionMNIST数据
## 准备训练数据集
train_data = FashionMNIST(
root = "./data/FashionMNIST", # 数据的路径
train = True, # 只使用训练数据集
transform = transforms.ToTensor(),
download= False
)
## 定义一个数据加载器
train_loader = Data.DataLoader(
dataset = train_data, ## 使用的数据集
batch_size=64, # 批处理样本大小
shuffle = False, # 每次迭代前不乱数据
num_workers = 2, # 使用两个进程
)
## 计算train_loader有多少个batch
print("train_loader的batch数量为:",len(train_loader))
## 获得一个batch的数据
for step, (b_x, b_y) in enumerate(train_loader):
if step > 0:
break
## 输出训练图像的尺寸和标签的尺寸
print(b_x.shape)
print(b_y.shape)
## 可是使用train_loader中的前80%的batch做为训练集,剩下的batch作为验证集
2.6 torchvision.models
提供一些比较常见的神经网络模型,有的已经预训练好,如分类、语义分割、目标检测、视频分类。
from torchvision import models
## 导入预训练好的VGG16网络
vgg16 = models.vgg16(pretrained=True)
print(vgg16)
## 获取vgg16的特征提取层
vgg = vgg16.features
# 将vgg16的特征提取层参数冻结,不对其进行更新
for param in vgg.parameters():
param.requires_grad_(False)
4 可视化
4.1HiddenLayer
HiddenLayer库,HiddenLayer库是一个非常简单、已与扩展、可用于可视化深度学习训练过程及网络结构的、可以和Jupyter Notebook完美兼容的库HiddenLayer开发的初衷是对于小型的项目,没有必要使用TensorBoard这类复杂的高级工具来进行检测,所以HiddenLayer是一个轻量化、小型的可视化工具,除了对Pytorch的支持外,HiddenLayer还支持Keras、TensorFlow等高级工具。
4.1.1 build_graph()函数
import hiddenlayer as hl
## 可视化卷积神经网络
hl_graph = hl.build_graph(MyConvnet,torch.ones(1,1,28,28)) # torch 版本高了
hl_graph.theme = hl.graph.THEMES["blue"].copy() # 主题设置为蓝色
hl_graph.save("data/chap4/MyConvnet_hl.png", format="png")
3.2 PyTorchViz
PyTorchViz来可视化网络PyTorchViz主要使用make_dot函数来进行绘制,其原理和HiddenLayer相同,都是对输入进行追踪不过不同的是HiddenLayer对输入的追踪集成到了函数内部,PyTorchViz则需要通过PyTorch来进行追踪。
3.2.1make_dot()函数
from torchviz import make_dot
## 使用make_dot可视化网络
x = torch.randn(1, 1, 28, 28).requires_grad_(True)
y = MyConvnet(x)
MyConvnetvis = make_dot(y, params=dict(list(MyConvnet.named_parameters()) + [('x', x)]))
MyConvnetvis
3.3tensorboardX
3.3.1SummaryWriter类
函数 | 功能 | 用法 |
SummaryWrite | 创建编写器,保存日志 | writer=SummaryWrite() |
weiter.add_scalar() | 添加标量 | writer.add_scalar(‘myscalar’,value,iteration) |
writer.add_image() | 添加图像 | writer.add_image(‘imresult’,x,iteration) |
writer.addhistogram() | 添加直方图 | writer.add_histogram(‘hist’,array,iteration) |
writer.add_graph() | 添加网络结构 | writer.add_graph(model,input_to_model=None) |
实例化
## 从tensorboardX库中导入需要的API
from tensorboardX import SummaryWriter
SumWriter = SummaryWriter(log_dir="data/chap4/log") # 保存log日志的文件夹
weiter.add_scalar()
## 为日志添加训练集损失函数
SumWriter.add_scalar("train loss",
train_loss.item() / niter,
global_step=niter)
writer.add_image()
## 为日志中添加训练数据的可视化图像,使用当前batch的图像
## 将一个batch的数据进行预处理
b_x_im = vutils.make_grid(b_x,nrow=12)
SumWriter.add_image('train image sample', b_x_im,niter)
writer.addhistogram()
## 使用直方图可视化网络中参数的分布情况
for name, param in MyConvnet.named_parameters():
SumWriter.add_histogram(name, param.data.numpy(),niter)
3.3.2 查看可视化结果
1、win+r输入cmd,打开终端。
2、输入tensorboard --logdir=logs # Logdir=事件文件所在文件夹名
3.4 Visdom
visdom是FaceBook开发的一款可视化工具,其实质是一款在网页端的web服务器,对Pytorch的支持较好。
安装指令
pip install visdom
错误:计算机积极拒绝
在Anaconda prompt下相应的环境(torch12)下输入以下命令
python -m visdom.server
再执行画图
3.4.1 2D散点图
from visdom import Visdom
from sklearn.datasets import load_iris
iris_x,iris_y = load_iris(return_X_y=True)
## 2D散点图
vis = Visdom()
vis.scatter(iris_x[:,0:2],Y = iris_y+1,win="windows1",env="main")
3.4.2 3D散点图
## 3D散点图
vis.scatter(iris_x[:,0:3],Y = iris_y+1,win="3D 散点图",env="main",
opts = dict(markersize = 4,# 点的大小
xlabel = "特征1",ylabel = "特征2")
)