目录
根据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()