深度学习3-pytorch学习

深度学习3-pytorch学习

Tensor 定义与 PyTorch 操作

1. Tensor 定义:

Tensor 是 PyTorch 中的数据结构,类似于 NumPy 数组。可以通过不同方式创建 tensor 对象:

复制代码
import torch

# 定义一个 1D Tensor
x1 = torch.Tensor([3, 4])

# 定义一个 Float 类型的 Tensor
x2 = torch.FloatTensor([4, 4])

# 使用正态分布随机生成 Tensor
x3 = torch.randn(3, 4)
print(x1)
print(x2)
print(x3)
2. PyTorch 与 NumPy 之间的转换:

可以使用 torch.from_numpy().numpy() 方法在 PyTorch Tensor 和 NumPy 数组之间进行转换:

复制代码
import numpy as np

# 创建一个 NumPy 数组
numpy_tensor = np.random.randn(10, 20)

# 将 NumPy 数组转换为 PyTorch Tensor
pytorch_tensor = torch.from_numpy(numpy_tensor)

# 将 PyTorch Tensor 转换为 NumPy 数组
new_numpy_tensor = pytorch_tensor.numpy()
3. GPU 和 CPU 之间的转换:

PyTorch 支持在 GPU 上进行计算,可以通过 .cuda() 方法将 Tensor 转移到 GPU,使用 .cpu() 将其转回 CPU:

复制代码
x = torch.randn(3, 4)

# 转移到 GPU(GPU 0)
x_gpu = x.cuda(0)

# 转移到 GPU(GPU 1)
x_gpu = x.cuda(1)

# 转回 CPU
x_cpu = x_gpu.cpu()

# 转换为 NumPy 数组
x_array = x_gpu.cpu().numpy()
4. Tensor 的形状和维度:

可以使用 .shape.size() 查看 Tensor 的维度和形状,unsqueezesqueeze 方法分别用于增加和减少维度:

复制代码
x = torch.randn(4, 3)

# 查看形状
print(x.shape)

# 增加一个维度
x_unsqueezed = x.unsqueeze(1)
print(x_unsqueezed.shape)  # 形状变为 [4, 1, 3]

# 减少一个维度
x_squeezed = x_unsqueezed.squeeze()
print(x_squeezed.shape)  # 形状变回 [4, 3]
5. Tensor 的高级操作:
  • 求最大值和索引:

    max_index, max_value = torch.max(x, dim=1) # 获取每行的最大值和索引
    print(max_index)
    print(max_value)

  • 求和:

    sum_tensor = torch.sum(x, dim=1, keepdim=True) # 求每行的和
    print(sum_tensor)

6. 求梯度:

Tensor 的 requires_grad_() 方法使得 Tensor 可以追踪梯度,允许进行反向传播(自动求导):

复制代码
x = torch.tensor(3.0, requires_grad=True)
y = x**2

# 求导
y.backward()

# 打印梯度
print(x.grad)  # 输出:tensor(6.)

注意: 求得的梯度会累积,如果不清零会对后续计算产生影响。

复制代码
python复制编辑x.grad = torch.tensor(0.0)  # 清空梯度
y2 = x**2
y2.backward()
print(x.grad)  # 输出:tensor(6.)
7. 创建不同类型的 Tensor:
复制代码
# 创建全为 1 的 Tensor
tensor1 = torch.ones((10, 4))
print(tensor1)

# 创建全为 0 的 Tensor
tensor2 = torch.zeros((10, 4))
print(tensor2)

# 创建正态分布随机值的 Tensor
tensor3 = torch.normal(0, 0.1, (4, 10, 4))
print(tensor3)
8. Variable:

为了构建神经网络,PyTorch 引入了 Variable 类,主要用于对 Tensor 进行自动求导操作。Variable 包含了三个重要属性:

  • .data:用于访问 Tensor。

  • .grad:用于访问梯度(导数)。

  • .grad_fn:描述如何计算这个 Variable。

    from torch.autograd import Variable

    创建 Variable

    x = Variable(torch.ones(2, 2), requires_grad=True)
    y = Variable(torch.ones(2, 2), requires_grad=True)
    z = torch.sum(x + y)

    查看数据

    print(z.data)

    反向传播

    z.backward()

    打印梯度

    print(x.grad)

9. 动态图/静态图

PyTorch 采用动态图(Dynamic Computation Graph)的方式,每次计算时都会重新构建计算图,这样便于调试,而 TensorFlow 则使用静态图(Static Computation Graph),在定义计算图之后执行。这使得 PyTorch 更适合快速开发和调试。

  • Tensor 是 PyTorch 中最基本的数据结构,类似于 NumPy 数组,但可以在 GPU 上进行加速计算。
  • PyTorch 提供了丰富的 Tensor 操作,如求最大值、求和、改变形状、求梯度等。
  • Variable 是 Tensor 的高级封装,它使得 PyTorch 在进行梯度计算时更加灵活。
  • 动态计算图使得 PyTorch 在调试和开发时非常方便,但相较于 TensorFlow 的静态图,可能会稍慢。
相关推荐
烟锁池塘柳01 小时前
【深度学习】评估模型复杂度:GFLOPs与Params详解
人工智能·深度学习
FAREWELL000751 小时前
C#进阶学习(十六)C#中的迭代器
开发语言·学习·c#·迭代器模式·迭代器
白熊1881 小时前
【计算机视觉】CV实战项目- DFace: 基于深度学习的高性能人脸识别
人工智能·深度学习·计算机视觉
毒果1 小时前
深度学习大模型: AI 阅卷替代人工阅卷
人工智能·深度学习
DXM05212 小时前
牟乃夏《ArcGIS Engine地理信息系统开发教程》学习笔记3-地图基本操作与实战案例
开发语言·笔记·学习·arcgis·c#·ae·arcgis engine
qsmyhsgcs3 小时前
Java程序员转人工智能入门学习路线图(2025版)
java·人工智能·学习·机器学习·算法工程师·人工智能入门·ai算法工程师
Humbunklung3 小时前
PySide6 GUI 学习笔记——常用类及控件使用方法(常用类矩阵QRectF)
笔记·python·学习·pyqt
xMathematics3 小时前
深度学习与SLAM特征提取融合:技术突破与应用前景
人工智能·深度学习
蹦蹦跳跳真可爱5893 小时前
Python----深度学习(基于DNN的吃鸡预测)
python·深度学习·dnn
每天都要写算法(努力版)3 小时前
【神经网络与深度学习】批标准化(Batch Normalization)和层标准化(Layer Normalization)
深度学习·神经网络·batch