PyTorch学习笔记

PyTorch学习笔记,第1张

PyTorch学习笔记

PyTorch学习笔记
      • 基本术语
      • 算法利弊
        • 梯度下降算法
        • 随机梯度下降算法
        • 鞍点
      • 画图函数
      • PyTorch入门
        • 生成张量矩阵
        • 加法 * - /类似
        • 求均值
        • 判断相等 只是比较数据
        • 切片
        • 改变张量的形状 ,保证元素的总数量不变
        • torch 的 Tensor 与 NumPy 数组的相互转换
        • Nympy *** 作
        • pytorch 对a进行转置
        • 求实际存储的相距位置
        • 查看存储的地址
        • 查看storage的数据
        • 转换成连续存储的
        • view 与 reshape 的区别
      • PyTorch Autograd自动求导
      • 求梯度例子
        • 关于文本处理
        • 构建计算图
        • 构建模型的模板
        • pytroch中的各种优化器
        • 相应的模型函数
      • 各种函数模型
        • 1、Linear Unit
        • 2、Logistic Regression Unit (sigmoid)
        • 3、Binary Cross
        • 4、SGD
        • 5、Softmax
        • 6、Softmax 计算公式
        • 7、NLLLOSS
        • 8、CrossEntropyLoss
        • 9、Relu
      • 模型构建的四部
      • 卷积神经网络CNN
        • Conv2d 卷积层
        • MaxPool2d 池化层
        • 1x1的卷积
      • 循环神经网络RNN

基本术语

(会一直更新)
数乘:矩阵对应元素相乘,乘出结果相加 ,得到的结果是一个数

算法利弊 梯度下降算法

只能找到局部最优,不能找到全局最优
但是神经网络中经常使用梯度下降法,因为神经网络中局部最优点很少

(对每一个点求loss,求和后再更新w的值,因此可以并行计算)

随机梯度下降算法

对每一个点求loss后立刻更新w的值,不能并行计算,计算速度相对梯度下降来说比较慢。可以克服局部最优的缺陷

鞍点

O点为鞍点,导数为0

画图函数
import matplotlib.pyplot as plt
plt.plot(w_list,mse_list)  #填入横纵坐标数据
plt.ylabel("loss")  #纵坐标名称
plt.xlabel("w")     #横坐标名称
plt.show()
PyTorch入门 生成张量矩阵
torch.empty(5,3)   #生成一个未初始化的5行3列矩阵
torch.rand(5,3)    #生成一个初始化的5行3列矩阵
torch.zeros(5,3,dtype=torch.long)   #生成一个全零的5行3列矩阵, 数据类型为long,也可设置为int
x=torch.tensor([2.5,3.5]) #直接将数据封装为张量
y=torch.rand_like(x,dtype=torch.float) #复制张量x得到相同尺寸的新张量,但是数据随机初始化
torch.ones(2,2) # 生成一个2*2  全为1的矩阵
x.new_ones(5,3,dtype=torch.float)  #生成一个5行3列全为1的矩阵
x.size()  #或者使用x.shape()  得出张量的尺寸
加法 * - /类似
a+b
torch.add(a,b)
torch.add(a,b,  out=result)  #将结果存到result中,并打印结果
b.add_(a)   # a+b的结果直接赋给b ,并打印结果
求均值
x.mean()
判断相等 只是比较数据
# 判断里面的每一个值是否相等
x.eq(y)
# 判断所有是否相等
x.eq(y).all()
切片
a[1:3,1:3] # 行和列都可以进行切片
改变张量的形状 ,保证元素的总数量不变
torch.view()  
# 或者 torch.reshape()
torch 的 Tensor 与 NumPy 数组的相互转换
b=a.numpy() # 将Tensor 转换为Nympy数组  b和a共享内存
b=torch.from_numpy(a)  # 将Nympy数组 转换为Nympy数组Tensor  b和a共享内存
Nympy *** 作
np.add(a,1,out=a)  #Nympy在自己基础上加一,与torch中 a.add_(1)相同

!! 所有在CPU上的Tensors,除了CharTensor,都可以转换为Numpy array并可以反向转换.
pytorch 对a进行转置
# 转置后 b和a仍然用同一个存储区
b=a.permute(1,0)
求实际存储的相距位置
a.stride()    
#例子 
# a=tensor([[0, 1, 2],
#	    	[3, 4, 5],
#	    	[6, 7, 8]])		
# a.stride()  =(3,1)   
#行数据相距3个,列数据相距1个  (在实际的存储结构中)
查看存储的地址
a.data_ptr()
查看storage的数据
a.storage()
转换成连续存储的
# 转置,并转换为符合连续性条件的tensor ,contiguous 会开辟一个新的存储空间
b = a.permute(1, 0).contiguous()       
view 与 reshape 的区别
# reshape方法更强大,可以认为a.reshape = a.view() + a.contiguous().view()
#满足tensor连续性条件时,a.reshape返回的结果与a.view()相同,否则返回的结果与a.contiguous().view()相同

PyTorch Autograd自动求导

autograd包为Tensors上的所有 *** 作提供了自动求导机制

# 注意 
w.requires_grad=True   # Tensor has to be set to True


# 可以通过.detach()获得一个新的Tensor,拥有相同的内容但不需要自动求导.
print(x.requires_grad)  # true
y=x.detach()
print(y.requires_grad)  # false


# 终止对计算机图的回溯
# 方式一:
with torch.no_grad():  # 建议使用这种方式
    #  *** 作
# 方式二:
	x=x.detach() 

求梯度例子
>>>  y = x + 2
>>>  z = y * y * 3
>>>  out = z.mean()
>>>  out.backward()

>>>  out 
tensor(27., grad_fn=)   # grad_fn 表示执行了哪些 *** 作

>>>  x.grad
tensor([[4.5000, 4.5000],
        [4.5000, 4.5000]])

## out对x求导
out.backward()
# 获得求导后的结果
w.grad

## 防止产生计算图
w.data 获得的还是Tensor,但是可以防止产生计算图
    #例如,权重更新要使用data,不能直接使用张量
    w.data=w.data-0.01 * w.grad.data

# 获取Tensor的数值    
w.item() 获得的是数值 不是Tensor
    # 例如 a 是 tensor([-8.])
        a.item()   # 得到 -8

# 清空w的梯度值(把w的导数清零)
w.grad.data.zero_()

关于文本处理

构建计算图

构建模型的模板

pytroch中的各种优化器

相应的模型函数

各种函数模型

模型函数看上图 “相应的模型函数”

1、Linear Unit

公式: y = x* wT+ b (wT表示w的转置)

torch.nn.Linear(2,3)  ## 生成一个3行 2列的weight   ,weight的值是随机产生的位于 -1 ~ 1之间 
2、Logistic Regression Unit (sigmoid)

y_pred=torch.sigmoid(x)
3、Binary Cross

torch.nn.BCELoss(x,y)
4、SGD

Implements stochastic gradient descent (optionally with momentum).

inorder to update w.data

torch.optim.SGD(model.parameters(),lr=0.01)
5、Softmax

6、Softmax 计算公式

7、NLLLOSS
# 结果只与输入的 数据有关
## 将选取input_softmax中与 target对应的数据加负号 求和 取平均数
output = nn.NLLLoss(input_softmax, target)

where x is the input, y* is the target, w* is the weight, and N is the batch size. If reduction is not 'none' (default 'mean'), then

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sJrGWtxa-1636725888431)(F:DesktopNLP编程学习编程imgimage-20211102191241343.png)]

8、CrossEntropyLoss

where x is the input, y is the target, w is the weight, C* is the number of classes, and N* spans the minibatch dimension as well as d*1,…,d**k for the K-dimensional case. If reduction is not 'none' (default 'mean'), then

9、Relu

负数改为0,正数不变


  • Input :(∗), where *∗ means any number of dimensions.
  • Output : (∗), same shape as the input.
模型构建的四部
  • Prepare dataset

  • Design model using Class

    inherit from nn.Module

  • Construct loss and optimizer

    using PyTorch API

  • Training cycle

    forward , backward , update

卷积神经网络CNN Conv2d 卷积层
 torch.nn.Conv2d()

卷积核与input内数据直接点乘,相加求和

# 输出测试结果,kernel_size=3 , (padding=0 填充 , strid=1 步长 :都是默认值)
input: torch.Size([1, 2, 5, 5])
output: torch.Size([1, 10, 3, 3])
weight: torch.Size([10, 2, 3, 3])
MaxPool2d 池化层
torch.nn.MaxPool2d()

直接获得卷积核内的最大值,作为结果

1x1的卷积

对应相乘、相加,不改变宽和高

循环神经网络RNN

RNNCell,只执行一次

RNN会自动帮你做循环

RNN的输入输出形状

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5479961.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-12
下一篇 2022-12-12

发表评论

登录后才能评论

评论列表(0条)

保存