pytorch -nn基础

本文详细介绍了PyTorch中的数据加载、模型构建、训练过程以及常见操作。讲解了DataLoader的使用,nn.Module的继承和forward方法,以及训练过程中梯度计算和反向传播。此外,还提到了一些PyTorch中的错误处理和编程技巧,包括变量的requires_grad属性、类型转换和参数初始化。最后,讨论了nn与nn.functional的区别以及__init__.py在Python包中的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

官方网址:http://pytorch.org/docs/nn.html

数据加载

torch.utils.data.DataLoader

train_iter = torch.utils.data.DataLoader(
    dataset,
    batch_size=batch_size,
    shuffle=True,
    num_workers=0
)

函数解释

DataLoader(dataset, batch_size=1, shuffle=False, sampler=None, num_workers=0, 
collate_fn=default_collatem, pin_memory=False, drop_last=False)
数据加载器(数据集,批处理大小=1,随机播放=False,采样器=None,num\u workers=0,
collate\u fn=default\u collatem,pin\u内存=False,drop\u last=False)

数据迭代

for batch_idx,(inputs,labels) in enumerate(train_loader,0): # 从0开始迭代
    print(batch_idx)

函数解释

以上程序中inputs的大小为[batchsize,每个运算数据的大小]

>>>seasons = ['Spring', 'Summer', 'Fall', 'Winter']
>>> list(enumerate(seasons))
[(0, 'Spring'), (1, 'Summer'), (2, 'Fall'), (3, 'Winter')]
>>> list(enumerate(seasons, start=1))       # 下标从 1 开始
[(1, 'Spring'), (2, 'Summer'), (3, 'Fall'), (4, 'Winter')]

train_loader为一个batchszie,batch_idx是迭代次数的索引可以帮助输出阶段参数,
enumerate:返回值有两个:一个是序号,也就是在这里的batch地址,一个是数据train_ids
for i, data in enumerate(train_loader,1):  # 注意enumerate返回值有两个,一个是序号,一个是数据(包含训练数据和标签)
    x_data, label = data

nn.Module

可通过继承 MODULE 类来构造模型,Module 类是 nn 模块⾥提供的⼀个模型构造类,是所有神经⽹络模块的基类

模型:
class MyConv2D(nn.Module):
    def __init__(self, in_channels, out_channels, kernel_size):
        super(MyConv2D, self).__init__()
        # 初始化卷积层的2个参数:卷积核、偏差
        if isinstance(kernel_size, int):
            kernel_size = (kernel_size, kernel_size)
        self.weight = nn.Parameter(torch.randn((out_channels, in_channels) + kernel_size))
        self.bias = nn.Parameter(torch.randn(out_channels, 1, 1))

    def forward(self, x):
        """
        :param x: 输入图片,shape(batch_size, C_in, H, W)
        :return: shape(batch_size,C_out, H_out, W_out)
        """
        return corr2d_multi_in_out(x, self.weight) + self.bias
        #      corr2d_multi_in_out是可在类的初始化或全局定义的函数
调用:
net = MyConv2D()
net(X) # 实例化后传入参数X,系统将自动调用forward来完成前向计算。

Module的子类: Sequential(ModuleList 和 ModuleDict与Sequential类似,主要参数形式不同)

# 先导入from torch.nn import init
# 用net.parameters() & net.named_parameters() & net.state_dict()初始化模型的参数
class MyConv2D(nn.Module):
    def __init__(self, in_channels, out_channels, kernel_size):
		self.weight = nn.Parameter(torch.randn((out_channels, in_channels) + kernel_size))
		self.bias = nn.Parameter(torch.randn(out_channels, 1, 1))
# 或默认的初始化方法,如线性层
m=nn.Linear(3, 4)# 线性层有weight和bias两个参数
print(m.weight) #size:(3, 4)
print(m.bias)   #size:(1, 4)
net = MySequential(
 nn.Linear(784, 256),
 nn.ReLU(),
 nn.Linear(256, 10),
 )
 
net(X)

训练过程

x = Variable(torch.ones(2,2),requires_grad = False) temp = Variable(torch.zeros(2,2),requires_grad = True)  y = x + temp + 2 y = y.mean()  #求平均数  y.backward()  #反向传递函数,用于求y对前面的变量(x)的梯度 print(x.grad)  # d(y)/d(x)

定义模型与训练过程

# 定义模型
net = ConvMoule().to(device)# nn
criterion = nn.CrossEntropyLoss()
optimizer = torch.optim.Adam(net.parameters(), lr=lr)

# 在定义好模型之后
optimizer.zero_grad()
output = net(data)
loss = criterion(output, target.long())
loss.backward() # Back Propagation
optimizer.step() # Gardient Descent
total_loss += loss.item()

optimizer.zero_grad()

打印参数

def parameters(self):
  for name, param in self.named_parameters():
    yield param
for name, param in model.named_parameters():
  if param.requires_grad:
    print(name)

PyTorch 中,nn 与 nn.functional 有什么区别?

面向对象

在这里插入图片描述

类的- -init- -方法:

初始化对象属性的构造方法,实例化类时此方法会自动执行,如果实例化类时给类传了参数,则此参数也是呈交给此方法来处理输入的数据

类的其他方法:

类方法的创建,此与函数的定义相类似,区别在于类方法的创建首个形参必须是self

super函数与多继承

python super函数,Python3.x 和 Python2.x 的一个区别是: Python 3 可以使用直接使用 super().xxx 代替 super(Class, self).xxx
python 多继承
Python3.x 和 Python2.x 的一个区别是: Python 3 可以使用直接使用 super().xxx 代替 super(Class, self).xxx

flatten

1)flatten(x,1)是按照x的第1个维度拼接(按照列来拼接,横向拼接);
2)flatten(x,0)是按照x的第0个维度拼接(按照行来拼接,纵向拼接);
3)有时候会遇到flatten里面有两个维度参数,flatten(x, start_dim, end_dimension),此时flatten函数执行的功能是将从start_dim到end_dim之间的所有维度值乘起来,其他的维度保持不变。例如x是一个size为[4,5,6]的tensor, flatten(x, 0, 1)的结果是一个size为[20,6]的tensor。

常见错误与注意

测试集不进行梯度变化:

with torch.no_grad():包起来

x.view(x.shape[0], -1)

pytorch提示:torch.device’ object has no attribute ‘_apply’

原因是模型没有实例化,net = model() 写成了 net = model;
忘了加括号,笑哭。。。

pytorch提示:named_parameters() missing 1 required positional argument: ‘self’

调用类的方法时一定要加括号,net = AlexnetOfTV.AlexNet应为net = AlexnetOfTV.AlexNet(),然后再使用net.named_parameters()读取参数。

<built-in method size of Tensor object at 0x000001B4AC242098>

size后少了()

Pytorch出现‘Tensor‘ object is not callable解决办法

Can’t call numpy() on Tensor that requires grad. Use tensor.detach().numpy() instead.

all_prediction = np.concatenate((all_prediction,prediction),axis=0)改成
all_prediction = np.concatenate((all_prediction,prediction.detach().cpu().numpy()),axis=0)

NotImplementedError:未实现错误,比如net实例化结果代码中没有实现forward函数

takes 1 positional argument but 2 were given

在类函数中加上self,因为在类调用类内部函数时,会自动传入self参数;在函数调用是传入参数是(self,x)

参数 batch_first=True

pytorch的bug

expected scalar type Double but found Float
transf = transforms.ToTensor()
img_tensor = transf(img)
x = img_tensor.unsqueeze(0)
y = net.features(x)# 提取特征
img_tensor = transf(arr).to(torch.float32)# 第二次报错,需类型转换[PyTorch]中的数据类型
x = img_tensor.unsqueeze(0)
y = net.features(x)# 提取特征

python+pycharm小技巧

函数的参数类型

打印结果到文件:


f = open("./output/recard", 'w+')  
print("结果", file=f)  

__all__

如果这个包内的类或方法不在__all__里面,就相当于没有上白名单,外面的包就不能正常使用这些没有上白名单的方法和类。

如果没有设置__all__,那么外面可以通过包内的约定来显示可见性。即:python通过private对应两个下划线__,protected对应一个下划线_,public 对应没有下划线,来约定类似于java的可见性控制。

python中的_all_用法

【Python】用 all 暴露接口

__init__.py

__init__.py的在文件夹中,可以使文件夹变为一个python模块,python的每个模块对应的包中都有一个__init__.py文件的存在

通常__init__.py文件为空,但是我们还可以为它增加其他的功能,我们在导入一个模块时候(也叫包),实际上导入的是这个模块的__init__.py文件。我们可以在__init__.py导入我们需要的模块,不需要一个个导入

_init_.py 中还有一个重要的变量,叫做 _all_。我们有时会使出一招“全部导入”,也就是这样:from PackageName import *,这时 import 就会把注册在包 init.py 文件中 all 列表中的子模块和子包导入到当前作用域中来

python无法导入自己的模块的解决办法


https://blog.youkuaiyun.com/weixin_40841247/article/details/88682551

RuntimeError: expected padding to be a single integer value or a list of 1 values to match the convolution dimensions, but got padding=[0, 0]
————————————————
版权声明:本文为优快云博主「gdymind」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.youkuaiyun.com/gdymind/article/details/82933534

还有一种可能:你的赋值少了一个维度,卷积核的维度应该是这样的
在这里插入图片描述

pycharm dubug不成功原因

可能是系统原因,还有可能是断点在注释上

python 删除字典中的某个元素

<think>好的,我现在需要回答用户关于PyTorch-Triton和Triton之间差异的问题。首先,我得明确这两个概念到底指什么,用户可能混淆了它们,所以需要准确区分。根据用户提供的引用,引用[2]提到Triton是OpenAI开发的GPU编程语言,而引用[1]和[3]提到了PyTorch-TensorRT和Triton推理服务器的使用。但用户的问题是关于PyTorch-Triton和Triton的区别,这可能涉及到两个不同的工具或框架。首先,我需要确认Triton在这里指的是哪个。根据引用[1],Triton推理服务器是NVIDIA的一个工具,用于部署优化模型,解决并发执行和客户端支持等问题。而引用[2]中的Triton是OpenAI开发的编程语言,用于GPU编程,可能用于编写高效内核。此外,引用[3]和[4]提到的Triton可能是指不同的实现,比如Intel的后端。PyTorch-Triton可能是指PyTorch与Triton(无论是编程语言还是推理服务器)的集成。例如,引用[1]中的Torch-TensorRT模型部署到Triton服务器,或者引用[3]中用Triton实现算子的情况。需要明确两者的定义和用途。Triton作为编程语言,是用于编写GPU内核,而Triton推理服务器是部署模型的工具。PyTorch-Triton可能指的是PyTorch与这两种Triton技术的结合,比如用Triton语言编写PyTorch算子,或者将PyTorch模型部署到Triton服务器上。接下来,我需要根据引用内容来组织答案。用户提供的引用中,引用[1]提到Triton推理服务器支持部署Torch-TensorRT模型,引用[2]提到Triton编程语言作为CUDA替代,引用[3]和[4]涉及用Triton实现算子和Intel的后端。 因此,PyTorch-Triton可能涉及PyTorch与Triton编程语言的结合,例如使用Triton编写高效内核并集成到PyTorch中,或者使用Triton推理服务器部署PyTorch模型。而Triton单独存在时,可能指编程语言或推理服务器本身,取决于上下文。 主要区别可能在于:PyTorch-Triton是PyTorch与Triton技术的整合,而Triton本身是一个独立的工具或语言。例如,Triton语言用于编写GPU内核,而PyTorch-Triton允许在PyTorch中使用这些内核;或者Triton推理服务器作为部署平台,PyTorch-Triton是部署PyTorch模型到该服务器上的方法。 需要分点说明两者的定义、应用场景、技术栈差异,以及可能的协同工作方式。同时,引用中的内容需要正确对应,比如引用[2]中的Triton语言,引用[1]中的Triton服务器,引用[3]中的Triton算子实现。 可能的结构:1.定义差异:Triton的不同形态(编程语言 vs推理服务器)与PyTorch-Triton的整合方式。2.功能差异:编程语言用于内核优化,推理服务器用于部署;PyTorch-Triton如何利用两者。3.应用场景差异:何时使用Triton单独功能,何时需要PyTorch-Triton的协作。4.技术栈归属:Triton由不同组织开发(OpenAI语言,NVIDIA服务器),PyTorch-Triton是PyTorch的扩展。 需要确保每个区别点都引用正确的来源,如引用[2]说明Triton语言,引用[1]说明服务器,引用[3]说明算子的实现。 可能的问题点:用户可能将不同Triton概念混淆,需要明确区分。例如,Triton编程语言和Triton推理服务器是不同的项目,而PyTorch-Triton可能指的是PyTorch与其中某一部分的集成。 总结:PyTorch-Triton和Triton的主要区别在于它们的定义、功能和应用场景。Triton可能指编程语言或推理服务器,而PyTorch-Triton是PyTorch与这些技术的结合使用。</think>### PyTorch-Triton 与 Triton 的主要区别 #### 1. **定义与归属** - **Triton** - **编程语言**:由 OpenAI 开发,专注于 GPU 编程,提供高效编写计算内核的能力,旨在降低 CUDA 的复杂性[^2]。例如,可直接编写高性能矩阵乘法内核。 - **推理服务器**:由 NVIDIA 维护,用于模型部署,支持多框架、多模型并发执行,并通过 HTTP/gRPC 提供推理服务[^1]。 - **PyTorch-Triton** -PyTorch 与 Triton 技术结合的产物,具体分为两类: - **Triton 语言集成**:通过 Triton 编写高性能算子并嵌入 PyTorch 模型,例如用 Triton 实现自定义的 `nn.Linear` 层以优化计算效率[^3]。 - **Triton 推理服务器支持**:将 PyTorch 模型(如 Torch-TensorRT 优化模型)部署到 Triton 服务器上,利用其基础设施实现高效推理[^1]。 #### 2. **核心功能差异** - **Triton(编程语言)** - 提供类似 Python 的语法简化 GPU 内核开发,例如: ```python @triton.jit def add_kernel(x_ptr, y_ptr, output_ptr, n_elements): pid = triton.program_id(0) if pid >= n_elements: return x = triton.load(x_ptr + pid) y = triton.load(y_ptr + pid) triton.store(output_ptr + pid, x + y) ``` - 直接操作内存分配和线程调度,适用于需要极致优化的计算场景[^2]。 - **Triton(推理服务器)** - 支持模型版本管理、动态批处理(Dynamic Batching)和跨 GPU/CPU 的负载均衡[^1]。 - **PyTorch-Triton** - **语言集成**:通过 `torch.compile` 或自定义算子调用 Triton 内核,提升 PyTorch 模型的计算性能[^3]。 - **部署流程**:将 PyTorch 模型转换为 Triton 支持的格式(如 TorchScript),并配置模型仓库(Model Repository)实现服务化[^1]。 #### 3. **应用场景对比** - **Triton(编程语言)** - 适用于需要定制化高性能算子的场景,例如: - 实现特定数学运算(如稀疏矩阵乘法)。 - 优化现有 PyTorch 算子(如卷积层)的 GPU 效率[^3]。 - **Triton(推理服务器)** - 适用于大规模模型部署,例如: - 同时服务多个模型的在线推理(如推荐系统)。 - 需要低延迟、高吞吐的工业级应用[^1]。 - **PyTorch-Triton** - **模型优化阶段**:利用 Triton 语言改写关键算子,提升训练/推理速度。 - **模型部署阶段**:通过 Triton 服务器实现生产级服务,支持多模型并发和客户端交互[^1][^3]。 #### 4. **技术栈依赖** - **Triton(编程语言)** - 依赖 GPU 驱动和 Triton 编译器,但与深度学习框架解耦。 - **Triton(推理服务器)** - 依赖 NVIDIA 生态(如 TensorRT),支持 PyTorch、TensorFlow 等框架的模型[^1]。 - **PyTorch-Triton** - 强依赖 PyTorch 生态,例如: - 使用 `torch.compile` 调用 Triton 内核时需安装 Triton 语言库[^3]。 - 部署到 Triton 服务器时需遵循 PyTorch 模型导出规范[^1]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值