加入收藏 | 设为首页 | 会员中心 | 我要投稿 河北网 (https://www.hebeiwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 建站 > 正文

PyTorch最佳实践,怎样才能写出一手风格优美的代码

发布时间:2019-05-07 23:10:47 所属栏目:建站 来源:机器之心编译
导读:固然这是一个非官方的 PyTorch 指南,但本文总结了一年多行使 PyTorch 框架的履历,尤其是用它开拓深度进修相干事变的最优办理方案。请留意,我们分享的履历大多是从研究和实践角度出发的。 这是一个开拓的项目,接待其余读者改造该文档: https://github.
副问题[/!--empirenews.page--]

固然这是一个非官方的 PyTorch 指南,但本文总结了一年多行使 PyTorch 框架的履历,尤其是用它开拓深度进修相干事变的最优办理方案。请留意,我们分享的履历大多是从研究和实践角度出发的。

这是一个开拓的项目,接待其余读者改造该文档:

https://github.com/IgorSusmelj/pytorch-styleguide。

本文档首要由三个部门组成:起首,本文会扼要盘点 Python 中的最好设备。接着,本文会先容一些行使 PyTorch 的能力和提议。最后,我们分享了一些行使其余框架的看法和履历,这些框架凡是辅佐我们改造事变流。

一、盘点 Python 设备

1. 提议行使 Python 3.6 以上版本

按照我们的履历,我们保举行使 Python 3.6 以上的版本,由于它们具有以下特征,这些特征可以使我们很轻易写出简捷的代码:

  • 自 Python 3.6 往后支持「typing」模块
  • 自 Python 3.6 往后支持名目化字符串(f string)

2. Python 气魄威风凛凛指南

我们试图遵循 Google 的 Python 编程气魄威风凛凛。请参阅 Google 提供的优越的 python 编码气魄威风凛凛指南:

地点:https://github.com/google/styleguide/blob/gh-pages/pyguide.md。

在这里,我们会给出一个最常用定名类型小结:

PyTorch最佳实践,奈何才气写出一手气魄威风凛凛美妙的代码

3. 集成开拓情形

一样平常来说,我们提议行使 visual studio 或 PyCharm 这样的集成开拓情形。而 VS Code 在相对轻量级的编辑器中提供语法高亮和自动补全成果,PyCharm 则拥有很多用于处理赏罚长途集群使命的高级特征。

4. Jupyter Notebooks VS Python 剧本

一样平常来说,我们提议行使 Jupyter Notebook 举办起源的试探,或实行新的模子和代码。假如你想在更大的数据集上实习该模子,就应该行使 Python 剧本,由于在更大的数据集上,复现性越发重要。

我们保举你采纳下面的事变流程:

  • 在开始的阶段,行使 Jupyter Notebook
  • 对数据和模子举办试探
  • 在 notebook 的单位中构建你的类/要领
  • 将代码移植到 Python 剧本中
  • 在处事器上实习/陈设

5. 开拓常备库

常用的措施库有:

6. 文件组织

不要将全部的层和模子放在统一个文件中。最好的做法是将最终的收集疏散到独立的文件(networks.py)中,并将层、丧失函数以及各类操纵生涯在各自的文件中(layers.py,losses.py,ops.py)。最终获得的模子(由一个或多个收集构成)应该用该模子的名称定名(譬喻,yolov3.py,DCGAN.py),且引用各个模块。

主措施、单独的实习和测试剧本应该只必要导入带有模子名字的 Python 文件。

二、PyTorch 开拓气魄威风凛凛与能力

我们提议将收集解析为更小的可复用的片断。一个 nn.Module 收集包括各类操纵或其余构建模块。丧失函数也是包括在 nn.Module 内,因此它们可以被直接整合到收集中。

担任 nn.Module 的类必需拥有一个「forward」要领,它实现了各个层或操纵的前向传导。

一个 nn.module 可以通过「self.net(input)」处理赏罚输入数据。在这里直接行使了工具的「call()」要领将输入数据转达给模块。

  1. output = self.net(input) 

1. PyTorch 情形下的一个简朴收集

行使下面的模式可以实现具有单个输入和输出的简朴收集:

  1. class ConvBlock(nn.Module): 
  2.     def __init__(self): 
  3.         super(ConvBlock, self).__init__() 
  4.         block = [nn.Conv2d(...)] 
  5.         block += [nn.ReLU()] 
  6.         block += [nn.BatchNorm2d(...)] 
  7.         self.block = nn.Sequential(*block) 
  8.  
  9.     def forward(self, x): 
  10.         return self.block(x) 
  11.  
  12. class SimpleNetwork(nn.Module): 
  13.     def __init__(self, num_resnet_blocks=6): 
  14.         super(SimpleNetwork, self).__init__() 
  15.         # here we add the individual layers 
  16.         layers = [ConvBlock(...)] 
  17.         for i in range(num_resnet_blocks): 
  18.             layers += [ResBlock(...)] 
  19.         self.net = nn.Sequential(*layers) 
  20.  
  21.     def forward(self, x): 
  22.         return self.net(x) 

(编辑:河北网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读