AI_Pytorch—内容回顾

发布时间 2023-07-12 14:45:59作者: 辰令

pytorch

基本结构与组件-基本流程与步骤-基本方法和应用
组件 PyTorch都是用C++和CUDA编写的
  modules and classes 
    torch.nn , 
	torch.optim , 
	Dataset , and DataLoader

学、练、训、赛、研、用
  device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu") 
  mindspore.set_context(device_target='Ascend', device_id=0)
Pytorch: 
   Tensor、 Parameter、Buffer

  nn.Module 中常用的功能都可以在\nn.Cell 中找到映射



MindSpore 优化了数据对象的设计逻辑,仅保留了两种数据对象:Tensor 和 Parameter
   Tensor 对象仅参与运算,并不需要对其进行梯度求导和参数更新
   Parameter 数据对象和 PyTorch 的 Parameter 意义相同,会根据其属性requires_grad 来决定是否对其进行梯度求导和 参数更新

包说i名

PyTorch的默认运行方式为即时执行(eager mode)
import torch
import torch.nn as nn
import torch.optim as optimizer	
from torch.utils.data import Dataset,DataLoader
   torch.nn.init提供了常用的初始化方法
   torch.nn.BCELoss  torch.nn.MultiMarginLoss 损失函数
   torch.optim 提供了多种优化器
   功能: 
      数据读入和加载  torch.utils.data
	  模型设计        torch.nn. torch.nn.Sequential
	                  torch.nn中,该模块提供了常见的神经网络层和其他架构组
	  损失函数        torch.nn.MultiMarginLoss 
	  提供了多种优化器 torch.optim
	     torch.nn.init提供了常用的初始化方法
  底层实现: torch.autograd

基本内容

torch.__version__
import numpy as np
import torch

print(torch.cuda.is_available(),torch.__version__)
data = [[1,2],[3,4]]
np_array = np.array(atad)
x_data=torch.tensor(data)
print(data,np_array,x_data)
print(data.__class__,np_array.__class__,x_data.__class__)
print(type(data),type(np_array),type(x_data))
print(dir(data),dir(np_array),dir(x_data))

print(help(x_data ))
print(help(torch.tensor ))

### 通过dir 查看数据的属性--查看tensor的特性

### 查看函数说明  help() 加函数名的方式能够在终端输出文档内容。注意:只用输入函数名,不是调用函数,所以不要写个括号
###type() dir() help() id()
## dir() 返回一个列表,其中包含字符串str的所有属性和方法
## vars()函数,我们可以很方便地查看自定义对象的属性和值
##测试该对象的属性:配合getattr()、setattr()以及hasattr(),我们可以直接操作一个对象的状态

 >>> hasattr(obj, 'x') # 有属性'x'吗?
__dict__属性,我们可以很方便地查看自定义对象的所有属性和值 利用__dict__可以给运行中的对象添加新的属性
   对象属性的几种方式
    方法一:使用属性运算符
      print(xmr.name)
    方法二:通过属性字典__dict__
      print(xmr.__dict__[‘name’])
    方法三:通过getattr函数
       print(getattr(xmr, ‘name’))
    方法四:operator.attrgetter	
	
##
 用类名直接调用__dict__,会输出该类中所有类属性和方法组成的字典;
 用类的实例对象调用__dict__,会输出该类中所有实例属性组成的字典;因为方法定义在类中,对象中没有定义方法,只是可以去调用类中的方法	

查看源码

三大命名空间:at、torch、c10
   1.at(ATen)负责声明和定义Tensor运算,是最常用到的命名空间
   2.c10是 ATen 的基础,包含了PyTorch的核心抽象、Tensor和Storage数据结构的实际实现
   3.torch命名空间下定义的 Tensor 相比于ATen 增加自动求导功能
   ATen,来自于 A Tensor library for C++11的缩写,ATen部分有大量的代码是来声明和定义Tensor运算相关的逻辑的
   C10,来自于Caffe Tensor Library的缩写
PyTorch的源代码主要是通过C++编写的,
    同时C++的接口暴露出来给Python调用
	C10主要目的之一是为了统一Pytorch的张量计算后端代码和caffe2的张量计算后端代码
	
过ATen(A Tensor Library)张量计算库	

通过案例

 案例以及对案例代码的修改

通过文档

文档的解释

张量

   有两种定义张量的方法 
      是把张量看成一个多维数组,当变换座标或变换基底时,其分量会按照一定变换的规则
	  是把张量定义成某个向量空间或其对偶空间上的多重线性映射,这向量空间在需要引入基底之前不固定任何坐标系统

数据

torch.utils.data.DataLoader and torch.utils.data.Dataset

模型

训练

Many layers inside a neural network are parameterized, 
  i.e. have associated weights and biases that are optimized during training. 
  Subclassing nn.Module automatically tracks all fields defined inside your model object, 
     and makes all parameters accessible using your model’s parameters() or named_parameters() methods.	
requires_grad   x.requires_grad_(True)  grad_fn  grad 

	
optimizer.zero_grad()
loss.backward()	
optimizer.step()


with torch.no_grad():
    z = torch.matmul(x, w)+b

框架

一个深度学习框架的使用场景有两类,科研和工程落地,前者需要有足够的灵活度和易用性,而后者需要的是部署和性能,这两者本身是有一些Gap的 
Forward Propagation  Backward Propagation:

dtype = torch.float
device = "cuda" if torch.cuda.is_available() else "cpu"
torch.set_default_device(device)

PyTorch 是基于计算路径追踪的自动微分,当我们定义一个网络结构后, 并不会建立反向图,
 而是在执行正向图的过程中, Parameter 记录每一个正向计算对应的反向函数,并生成一个动态计算图,
   用于后续的梯度计算。当在最终的输出处调用 backward 时,就会从根节点到叶节点应用链式法则计算梯度。
   PyTorch 的动态计算图所存储的节点实际是 Function 函数对象,每当对 Tensor 执行一步运算后,就会产生一个 Function 对象,
 它记录了反向传播中必要的信息。
 反向传播过程中,autograd 引擎会按照逆序,通过 Function 的 backward 依次计算梯度
 
 提供了 state_dict() 用于优化器状态的查看及保存
 
MindSpore 的自动微分是基于图结构的微分 
  自动微分时,需要传入正向图结构,自动微分的过程就是通过对正向图的分析从而得到反向传播信息,
    自动微分的结果与正向计算中具体的数值无关,仅和正向图结构有关
  其实图结构里既包含了正向算子,又包含了 MindSpore 为我们添加的反向算子,也就是说,MindSpore 在我们定义的正向图后面又新加了一个看不见的 Cell,
  这个 Cell 里都是根据正向图推导出来的反向算子。	
    构建反向图的接口就是 grad -们定义的正向图和自动微分得到的反向图
	
	MindSpore的学习率支持静态、动态、分组三种-包到优化器里面的,每调用一次优化器,学习率更新的step会自动更新一次

步骤:

 获取参考代码 -- 分析算法及网络结构	--复现论文实现

参考

https://pytorch.org/tutorials/beginner/basics/tensorqs_tutorial.html
https://pytorch.org/cppdocs/
https://github.com/mindspore-ai/mindspore
与PyTorch典型区别 https://www.mindspore.cn/docs/zh-CN/master/migration_guide/typical_api_comparision.html
PyTorch与MindSpore API映射表 https://www.mindspore.cn/docs/zh-CN/master/note/api_mapping/pytorch_api_mapping.html
https://github.com/ShusenTang/Deep-Learning-with-PyTorch-Chinese/tree/master
https://tangshusen.me/Deep-Learning-with-PyTorch-Chinese/#/