根据kernel size,stride和padding计算卷积后的尺寸

对于PyTorch中的1维卷积层nn.Conv1d,输出序列长度可以根据以下公式计算:假设:- 输入序列长度:L_in 
- 卷积核大小:K
- 步长:S
- 填充:P
则输出序列长度为:

python
L_out = (L_in + 2 * P - K) // S + 1

这里://表示地板除(向下取整)。举例:- 输入序列长度L_in = 28
- 卷积核大小K = 5
- 步长S = 2
- 填充P = 1
则:

L_out = (L_in + 2 * P - K) // S + 1
     = (28 + 2 * 1 - 5) // 2 + 1
     = 13

创建tensor的常见的方法

直接创建:

import torch

# 从列表创建
tensor_a = torch.tensor([1, 2, 3])

# 从数组创建
import numpy as np
array_b = np.array([4, 5, 6])
tensor_b = torch.tensor(array_b)

全零或全一张量:

zeros_tensor = torch.zeros((2, 3))  # 2x3 的全零张量
ones_tensor = torch.ones((3, 2))   # 3x2 的全一张量

随机张量:

random_tensor = torch.rand((3, 4))  # 3x4 的均匀分布随机张量
torch.randn等

等间隔张量:

tensor_arange = torch.arange(0, 10, 2)  # 从0到10,步长为2
tensor_linspace = torch.linspace(0, 1, 5)  # 从0到1,均分成5个点

如何将一个tensor分为多个tensor

torch.chunk

#按数量来分
import torch

# 假设 x 是你的原始张量
x = torch.randn(2, 4, 128, 128)

# 使用 torch.chunk 来分割张量
x1, x2 = torch.chunk(x, 2, dim=0)

# x1 和 x2 现在是两个形状为 [1, 4, 128, 128] 的张量

torch.split

#按分后的小块大小来分
import torch

# 假设 x 是你的原始张量
x = torch.randn(2, 4, 128, 128)

# 使用 torch.split 来分割张量
x_chunks = torch.split(x, 1, dim=0)

# x_chunks 是一个包含两个形状为 [1, 4, 128, 128] 的张量的元组

<class 'pandas.core.series.Series'>如何转tensor

import pandas as pd
import torch

# 示例 Pandas Series
series = pd.Series([1, 2, 3, 4, 5])

# 将 Pandas Series 转换为 Numpy 数组
numpy_array = series.to_numpy()

# 将 Numpy 数组转换为 PyTorch Tensor
tensor = torch.tensor(numpy_array)

训练的一般过程及模型的保存与加载

import torch
import torch.nn as nn
import torch.optim as optim

# 定义模型
model = nn.Linear(in_features, out_features)

# 选择优化器
optimizer = optim.SGD(model.parameters(), lr=0.01)

# 假设 data 是输入数据,target 是目标标签
data, target = ...

# 前向传播
output = model(data)

# 计算损失
loss = nn.MSELoss()(output, target)

# 梯度清零
optimizer.zero_grad()

# 反向传播
loss.backward()

# 优化器步骤
optimizer.step()

# 保存模型状态字典
torch.save(model.state_dict(), 'model_state_dict.pth')

# 首先需要创建一个与之前相同的模型实例
model = nn.Linear(in_features, out_features)

# 加载模型状态字典
model.load_state_dict(torch.load('model_state_dict.pth'))

torch中一般可以直接定义forward,不定义call,也可以实现 类的实例被当作函数调用?

是的,在 PyTorch 中,通常只需要定义 forward 方法而不需要显式定义 call 方法。这是因为 PyTorch 的 nn.Module 类(所有自定义模型类的基类)已经为你实现了 call 方法。当你创建一个继承自 nn.Module 的类并实现了 forward 方法时,调用这个类的实例(即使它看起来像是函数调用)实际上会触发 nn.Module 的 call 方法,该方法进而调用你定义的 forward 方法。

这是一个典型的 PyTorch 模型定义和使用示例:

python

import torch.nn as nn

class MyModel(nn.Module):
    def __init__(self):
        super(MyModel, self).__init__()
        # 初始化模型层等

    def forward(self, x):
        # 定义前向传播逻辑
        return x

# 创建模型实例
model = MyModel()

# 调用模型实例,实际上触发的是 `__call__`,它又调用了 `forward`
output = model(input_data)

在这个例子中,你不需要定义 call 方法;PyTorch 的 nn.Module 类已经帮你处理了这个部分。你只需要关注于定义 forward 方法,它描述了数据如何通过模型流动。这种设计使得模型的实现更加简洁和直观。

将张量从 GPU 显存中删除并释放显存

将张量从 GPU 显存中删除并释放显存,通常涉及以下几个步骤:

移动张量回 CPU:首先,将需要从显存中删除的张量移动回 CPU。这可以通过 .to('cpu') 方法实现。这一步不会自动释放显存,但会减少对显存的引用。
    python

tensor = tensor.to('cpu')

删除张量的引用:然后,删除指向该张量的所有引用。这通常意味着将引用该张量的变量设置为 None 或使用 del 语句删除。

python

del tensor  # 删除变量引用

清理缓存:在删除引用后,可以调用 torch.cuda.empty_cache() 来清理由 PyTorch 维护的 CUDA 缓存。这个步骤并不总是必要的,因为缓存清理会在需要时自动发生。过度使用此函数可能导致效率降低,因为它会中断 PyTorch 的内存重用策略。

python

torch.cuda.empty_cache()

确保垃圾回收:在 Python 中,垃圾回收通常是自动进行的。但在某些情况下,可能需要手动触发垃圾回收来释放不再使用的内存。这可以通过调用 gc.collect() 实现。

python

import gc
gc.collect()

pytorch 显存分析

posted on 2023-10-17 20:14  FrostyForest  阅读(9)  评论(0编辑  收藏  举报