pytorch的入门基础知识

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学习中的两大法宝函数

  1. dir() 函数:能让我们知道工具箱以及工具箱中的分隔区有什么东西(打开,看见)
  2. help() 函数:能让我们知道每个工具是如何使用的,工具的使用方法(说明书)
  3. 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") 
           )

  • 11
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值