0
点赞
收藏
分享

微信扫一扫

如何选择服务器?服务器选择方法

河南妞 2023-09-28 阅读 30

目录

一、实验介绍

 二、实验环境

1. 配置虚拟环境

2. 库版本介绍

三、实验内容

0. 导入必要的工具包

1. 标量求导

2. 矩阵求导

3. 计算图


一、实验介绍

       PyTorch提供了自动求导机制,它是PyTorch的核心功能之一,用于计算梯度并进行反向传播。自动求导机制使得深度学习中的梯度计算变得更加简单和高效。

 二、实验环境

    本系列实验使用了PyTorch深度学习框架,相关操作如下:

1. 配置虚拟环境

conda create -n DL python=3.7 
conda activate DL
pip install torch==1.8.1+cu102 torchvision==0.9.1+cu102 torchaudio==0.8.1 -f https://download.pytorch.org/whl/torch_stable.html
conda install matplotlib
 conda install scikit-learn

2. 库版本介绍

软件包本实验版本目前最新版
matplotlib3.5.33.8.0
numpy1.21.61.26.0
python3.7.16
scikit-learn0.22.11.3.0
torch1.8.1+cu1022.0.1
torchaudio0.8.12.0.2
torchvision0.9.1+cu1020.15.2

三、实验内容

ChatGPT:

本系列为实验内容,对理论知识不进行详细阐释

(咳咳,其实是没时间整理,待有缘之时,回来填坑)

977468b5ae9843c6a88005e792817cb1.png

0. 导入必要的工具包

import torch

1. 标量求导

        对只有一个输出值的函数进行求导,结果是一个标量值。

# 最简单的情况,X是一个标量
x = torch.tensor(2, dtype=torch.float32, requires_grad=True)
y = x ** 2 + 4 * x
print(x.grad)
y.backward()
print(x.grad)
  • 创建一个名为x的张量,其值为2,数据类型为float32,并设置requires_gradTrue以启用自动求导功能。

  • y = x ** 2 + 4 * x:定义一个新的张量y,其值为x的平方加上4乘以x

  • 在调用backward()函数之前,打印x的梯度值。由于还没有进行反向传播,x.grad的值为None

  • 通过调用backward()函数,计算y相对于所有需要梯度的张量的梯度。在这种情况下,只有x需要梯度,因此x.grad将被计算。

  • 在调用backward()函数之后,打印x的梯度值,即导数。由于y是关于x的函数,并且我们通过backward()函数进行了反向传播,所以x.grad现在将包含y相对于x的导数值。

输出:

None
tensor(8.)

2. 矩阵求导

        对具有多个输出值的函数进行求导,结果是一个矩阵或向量。

x = torch.ones(2, 2, requires_grad=True)
print(x.grad)
# y是一个矩阵
y = x ** 2 + 4 * x
y.backward(torch.ones(2, 2))
print(x.grad)
  • 创建一个2x2的张量x,其所有元素的值都为1,并设置requires_gradTrue以启用自动求导功能。

  • 在调用backward()函数之前,打印x的梯度值。由于还没有进行反向传播,x.grad的值为None

  • 定义一个新的张量y,其值为x的每个元素的平方加上4乘以x的每个元素。由于x的形状为2x2,因此y也将具有相同的形状。

  • y.backward(torch.ones(2, 2)):通过调用backward()函数,计算y相对于所有需要梯度的张量的梯度。在这种情况下,只有x需要梯度,torch.ones(2, 2)表示将梯度初始化为2x2的全1矩阵。

  • print(x.grad):打印x的梯度值,即导数。由于y是关于x的函数,并且我们通过backward()函数进行了反向传播,所以x.grad将包含y相对于x的导数值

输出:

None
tensor([[6., 6.],
        [6., 6.]])

x = torch.ones(2, 2, requires_grad=True)
# y是一个矩阵
y = x ** 2 + 4 * x
y.backward(torch.ones(2, 2))
print(x.grad)

u = x ** 3 + 2 * x
# z是一个标量
z = u.sum()
z.backward()
print(x.grad)
  • u = x ** 3 + 2 * x:定义一个新的张量u,其值为x的每个元素的立方加上2乘以x的每个元素。由于x的形状为2x2,因此u也将具有相同的形状。

  • z = u.sum():定义一个新的标量z,其值为u所有元素的总和。sum()函数将u中的所有元素相加得到一个标量值。

  • z.backward():通过调用backward()函数,计算z相对于所有需要梯度的张量的梯度。在这种情况下,只有x需要梯度,因为u是关于x的函数。

  • print(x.grad):打印x的梯度值,即导数。由于z是关于x的函数,并且我们通过backward()函数进行了反向传播,所以x.grad将包含z相对于x的导数值。

输出:

tensor([[6., 6.],
        [6., 6.]])
tensor([[11., 11.],
        [11., 11.]])

3. 计算图

import torch

x = torch.tensor(2.0, requires_grad=True)
y = torch.tensor(3.0, requires_grad=True)
z = x**2 + y**3
z.backward()
print("Gradient of x:", x.grad)
print("Gradient of y:", y.grad)

输出:

Gradient of x: tensor(4.)
Gradient of y: tensor(27.)

举报

相关推荐

0 条评论