带你了解pytorch之pytorch基本内容介绍 Pytorch作为深度学习库常被使用。原因在于pytorch代码更为简单。不管是深度学习新手还是老手pytorch都是一大利器。为增进大家对pytorch的了解本文将对pytorch的简单知识加以讲解。如果你对本文内容具有兴趣不妨继续往下阅读哦。1. overview不同于 theanotensorflow 等低层程序库或者 keras、sonnet 等高层 wrapperpytorch 是一种自成体系的深度学习库(图1)。图1. 几种深度学习程序库对比如图2所示pytorch 由低层到上层主要有三大块功能模块。图2. pytorch 主要功能模块1.1 张量计算引擎(tensor computaTIon)Tensor 计算引擎类似 numpy 和 matlab基本对象是tensor(类比 numpy 中的 ndarray 或 matlab 中的 array)。除提供基于 CPU 的常用操作的实现外pytorch 还提供了高效的 GPU 实现这对于深度学习至关重要。1.2 自动求导机制(autograd)由于深度学习模型日趋复杂因此对自动求导的支持对于学习框架变得必不可少。pytorch 采用了动态求导机制使用类似方法的框架包括 chainerdynet。作为对比theanotensorflow 采用静态自动求导机制。1.3 神经网络的高层库(NN)pytorch 还提供了高层的。对于常用的网络结构如全连接、卷积、RNN 等。同时pytorch 还提供了常用的、opTImizer 及参数。这里我们重点关注如何自定义神经网络结构。2. 自定义 Module图3. pytorch Modulemodule 是 pytorch 组织神经网络的基本方式。Module 包含了模型的参数以及计算逻辑。FuncTIon 承载了实际的功能定义了前向和后向的计算逻辑。下面以最简单的 MLP 网络结构为例介绍下如何实现自定义网络结构。完整代码可以参见repo。2.1 FuncTIonFunction 是 pytorch 自动求导机制的核心类。Function 是无参数或者说无状态的它只负责接收输入返回相应的输出;对于反向它接收输出相应的梯度返回输入相应的梯度。这里我们只关注如何自定义 Function。Function 的定义见。下面是简化的代码段class Function(object):def forward(self, *input):raise NotImplementedErrordef backward(self, *grad_output):raise NotImplementedErrorforward 和 backward 的输入和输出都是 Tensor 对象。Function 对象是 callable 的即可以通过()的方式进行调用。其中调用的输入和输出都为 Variable 对象。下面的示例了如何实现一个 ReLU 激活函数并进行调用import torchfrom torch.autograd import Functionclass ReLUF(Function)def forward(self, input):self.save_for_backward(input)output input.clamp(min0)return outputdef backward(self, output_grad):input self.to_save[0]input_grad output_grad.clone()input_grad[input 0] 0return input_grad## Testif __name__ __main__:from torch.autograd import Variabletorch.manual_seed(1111)a torch.randn(2, 3)va Variable(a, requires_gradTrue)vb ReLUF()(va)print va.data, vb.datavb.backward(torch.ones(va.size()))print vb.grad.data, va.grad.data如果 backward 中需要用到 forward 的输入需要在 forward 中显式的保存需要的输入。在上面的代码中forward 利用self.save_for_backward函数将输入暂时保存并在 backward 中利用saved_tensors (python tuple 对象) 取出。显然forward 的输入应该和 backward 的输入相对应;同时forward 的输出应该和 backward 的输入相匹配。由于 Function 可能需要暂存 input tensor因此建议不复用 Function 对象以避免遇到内存提前释放的问题。如所示forward的每次调用都重新生成一个 ReLUF 对象而不能在初始化时生成在 forward 中反复调用。2.2 Module类似于 FunctionModule 对象也是 callable 是输入和输出也是 Variable。不同的是Module 是[可以]有参数的。Module 包含两个主要部分参数及计算逻辑(Function 调用)。由于ReLU激活函数没有参数这里我们以最基本的全连接层为例来说明如何自定义Module。全连接层的运算逻辑定义如下 Function:import torchfrom torch.autograd import Functionclass LinearF(Function):def forward(self, input, weight, biasNone):self.save_for_backward(input, weight, bias)output torch.mm(input, weight.t())if bias is not None:output bias.unsqueeze(0).expand_as(output)return outputdef backward(self, grad_output):input, weight, bias self.saved_tensorsgrad_input grad_weight grad_bias Noneif self.needs_input_grad[0]:grad_input torch.mm(grad_output, weight)if self.needs_input_grad[1]:grad_weight torch.mm(grad_output.t(), input)if bias is not None and self.needs_input_grad[2]:grad_bias grad_output.sum(0).squeeze(0)if bias is not None:return grad_input, grad_weight, grad_biaselse:return grad_input, grad_weight为一个元素为 bool 型的 tuple长度与 forward 的参数数量相同用来标识各个输入是否输入计算梯度;对于无需梯度的输入可以减少不必要的计算。Function(此处为 LinearF) 定义了基本的计算逻辑Module 只需要在初始化时为参数分配内存空间并在计算时将参数传递给相应的 Function 对象。代码如下import torchimport torch.nn as nnclass Linear(nn.Module):def __init__(self, in_features, out_features, biasTrue):super(Linear, self).__init__()self.in_features in_featuresself.out_features out_featuresself.weight nn.Parameter(torch.Tensor(out_features, in_features))if bias:self.bias nn.Parameter(torch.Tensor(out_features))else:self.register_parameter(bias, None)def forward(self, input):return LinearF()(input, self.weight, self.bias)需要注意的是参数是内存空间由 tensor 对象维护但 tensor 需要包装为一个Parameter 对象。Parameter 是 Variable 的特殊子类仅有是不同是 Parameter 默认requires_grad为 True。Varaible 是自动求导机制的核心类此处暂不介绍参见。3. 自定义循环神经网络(RNN)我们尝试自己定义一个更复杂的 Module ——RNN。这里我们只定义最基础的 vanilla RNN(图4)基本的计算公式如下htrelu(W⋅xU⋅ht−1)图4. RNN更复杂的 LSTM、GRU 或者其他变种的实现也非常类似。3.1 定义 Cellimport torchfrom torch.nn import Module, Parameterclass RNNCell(Module):def __init__(self, input_size, hidden_size):super(RNNCell, self).__init__()self.input_size input_sizeself.hidden_size hidden_sizeself.weight_ih Parameter(torch.Tensor(hidden_size, input_size))self.weight_hh Parameter(torch.Tensor(hidden_size, hidden_size))self.bias_ih Parameter(torch.Tensor(hidden_size))self.bias_hh Parameter(torch.Tensor(hidden_size))self.reset_parameters()def reset_parameters(self):stdv 1.0 / math.sqrt(self.hidden_size)for weight in self.parameters():weight.data.uniform_(-stdv, stdv)def forward(self, input, h):output LinearF()(input, self.weight_ih, self.bias_ih) LinearF()(h, self.weight_hh, self.bias_hh)output ReLUF()(output)return output3.2 定义完整的 RNNimport torchfrom torch.nn import Moduleclass RNN(Moudule):def __init__(self, input_size, hidden_size):super(RNN, self).__init__()self.input_size input_sizeself.hidden_size hidden_sizesef.cell RNNCell(input_size, hidden_size)def forward(self, inputs, initial_state):time_steps inputs.size(1)state initial_stateoutputs []for t in range(time_steps):state self.cell(inputs[:, t, :], state)outputs.append(state)return outputs讨论pytorch 的 Module 结构是传承自 torch这一点也同样被 keras (functional API)所借鉴。 在 caffe 等一些[早期的]深度学习框架中network 是由于若干 layer 经由不同的拓扑结构组成的。而在 (pyt)torch 中没有 layer 和 network 是区分一切都是 callable 的 Module。Module 的调用的输入和输出都是 tensor (由 Variable 封装)用户可以非常自然的构造任意有向无环的网络结构(DAG)。同时 pytorch 的 autograd 机制封装的比较浅可以比较容易的定制反传或修改梯度。这对有些算法是非常重要。总之仅就自定义算法而言pytorch 是一个非常优雅的深度学习框架。

相关新闻

最新新闻

Qt模型/视图框架深度解析:从MVC对比到自定义Model实战

Qt模型/视图框架深度解析:从MVC对比到自定义Model实战

在 Qt 开发面试中,模型/视图(Model/View)框架是考察开发者对 Qt 核心架构理解深度的经典领域。很多开发者虽然用过 QTableView 、 QListView ,但当被问到“它和传统 MVC 有什么区别?”或“如何从零实现一个自定义 …

2026/7/21 20:31:29
终极多模型数据库解决方案:SurrealDB如何重新定义实时数据管理

终极多模型数据库解决方案:SurrealDB如何重新定义实时数据管理

终极多模型数据库解决方案:SurrealDB如何重新定义实时数据管理 【免费下载链接】surrealdb A scalable, distributed, collaborative, document-graph database, for the realtime web 项目地址: https://gitcode.com/GitHub_Trending/su/surrealdb 在当今数…

2026/7/21 20:31:29
TI C2000 ePWM事件触发与HRPWM配置实战:从寄存器到电机控制应用

TI C2000 ePWM事件触发与HRPWM配置实战:从寄存器到电机控制应用

1. 项目概述与核心价值在电机驱动、数字电源和逆变器这些对时序精度要求近乎苛刻的领域,PWM信号的“准”与“不准”,直接决定了系统的效率、噪声乃至稳定性。很多工程师在初次接触TI C2000系列微控制器的增强型PWM(ePWM)模块时&am…

2026/7/21 20:31:28
Windows平台Android应用高效安装方案:APK Installer架构深度解析

Windows平台Android应用高效安装方案:APK Installer架构深度解析

Windows平台Android应用高效安装方案:APK Installer架构深度解析 【免费下载链接】APK-Installer An Android Application Installer for Windows 项目地址: https://gitcode.com/GitHub_Trending/ap/APK-Installer 在跨平台应用开发日益普及的今天&#xff…

2026/7/21 20:31:28
国寿安保基金固收+策略解析与实战应用

国寿安保基金固收+策略解析与实战应用

1. 国寿安保基金的"固收"战略定位解析 国寿安保基金作为国内领先的资产管理机构,近年来在"固收"领域形成了独特的竞争优势。所谓"固收"策略,本质上是在传统固定收益投资的基础上,通过适度配置权益类资产、可转…

2026/7/21 20:31:28
如何高效使用Discord Mass DM GO进行批量消息自动化

如何高效使用Discord Mass DM GO进行批量消息自动化

如何高效使用Discord Mass DM GO进行批量消息自动化 【免费下载链接】discord-mass-DM-GO The most powerful Discord selfbot written in GO allowing users to automate their campaigns & send low-cost mass messages to Discord users! 项目地址: https://gitcode.c…

2026/7/21 20:26:28

月新闻