小编5Ke*_*5Ke的帖子

使用部分在 Python 模块中构建 Sphinx autodoc 文档

我正在尝试改进 python 模块的文档结构。

现在我有一个 Sphinxindex.rst文件,如下所示:

Contents:

.. toctree::
:maxdepth: 3

.. automodule:: myModule1
    :members:

.. automodule:: myModule2
    :members:
Run Code Online (Sandbox Code Playgroud)

这会生成一个 HTML 页面,其中包含我记录的所有函数的一长串混乱列表。这意味着文档在代码中比在 HTML 输出中更容易阅读。

第一个改进很简单:我可以在每个模型的开头添加标题和描述,以便模块的视觉分离在 html 输出中变得更加清晰。像这样:

"""
##############################################
myModule1 Title
##############################################
Description of myModule1.
"""
Run Code Online (Sandbox Code Playgroud)

但现在我想更进一步,将模块分成几个部分,这些部分有自己的部分标题和描述,属于模块功能的子集。我尝试了以下方法:

"""
##############################################
myModule1 Title
##############################################
Description of myModule1.
"""
... # meaning import statements etc
"""
**********************************************
First Section title
**********************************************
Some descriptive text
"""
def myFunction1()
    """ function doc """
    ... # meaning the actual function implementation

def myFunction2()
    """ function …
Run Code Online (Sandbox Code Playgroud)

python restructuredtext python-3.x python-sphinx autodoc

7
推荐指数
1
解决办法
2424
查看次数

提高将numpy数组转换为MATLAB的性能

从Python调用MATLAB必然会通过在Python中重写(很多)代码来减少性能.然而,这对我来说不是一个现实的选择,但令我很恼火的是,效率的巨大损失在于从numpy数组到MATLAB double的简单转换.

我在谈论从data1到data1m的以下转换,其中

data1 = np.random.uniform(low = 0.0, high = 30000.0, size = (1000000,))
data1m = matlab.double(list(data1))
Run Code Online (Sandbox Code Playgroud)

这里matlab.double来自Mathworks自己的MATLAB包/引擎.第二行代码在我的系统上花费了20秒,对于一个除了使数字"可食用"MATLAB之外没有真正做任何事情的转换似乎太多了.

所以基本上我正在寻找与此处给出的相反的技巧,该技巧适用于将MATLAB输出转换回Python.

python matlab numpy

7
推荐指数
2
解决办法
1759
查看次数

Pytorch Lightning 为每个 GPU 重复主脚本

我有一台带有两个显卡的机器。我想用两者来训练我的模型。为了让我的生活更轻松,我正在使用 pytorch lighting。

当我在没有 GPU 的情况下运行脚本时,一切正常:

trainer = Trainer(gpus=None)
Run Code Online (Sandbox Code Playgroud)

但我想在多个 GPU 上运行它。令人困惑的是,手册首先指出,对于一台具有多个 GPU 的机器,您应该使用“dp”加速器:

trainer = Trainer(gpus=2, accelerator='dp')
Run Code Online (Sandbox Code Playgroud)

这会启动训练课程,但会出现一个 BroadcastBackward 错误,只有当我尝试使用 dp 加速器时才会出现该错误(详细信息如下)。

然而手册继续说

PyTorch 和 Lightning 不鼓励使用 DP。使用更稳定且至少快 3 倍的 DDP

听起来很棒!所以我这样做:

trainer = Trainer(gpus=2, accelerator='ddp')
Run Code Online (Sandbox Code Playgroud)

但现在当我运行时trainer.fit,训练器启动第二个进程(proc = subprocess.Popen(command, env=env_copy, cwd=cwd)在 ddp_accelerator.py 中)。

一方面,这是预期的行为(每个 GPU 一个进程),但另一方面,它确实重新运行了我的主脚本(它不仅仅是重新导入,因此保护并if __name__ == "__main__":没有帮助)。我的脚本是一个优化方案,流程如下:

  1. 生成超参数(基于早期运行的结果)
  2. 构建、训练、评估模型:回报绩效衡量
  3. 从 1 开始重复

这意味着第二个进程获得的超参数与第一个进程不同,这显然会引发错误。

顺便说一句,在 1 个 GPU 上运行效果很好(训练完成且没有错误):

trainer = Trainer(gpus=1, accelerator='ddp')
Run Code Online (Sandbox Code Playgroud)

我应该如何解决这个问题?坚持使用“dp”并修复我的 BroadcastBackward 错误?或者坚持使用 ddp,但是如何修复脚本重复错误呢?

dp错误详细信息:

在文件 X,第 …

gpu machine-learning pytorch pytorch-lightning

5
推荐指数
0
解决办法
1060
查看次数

自定义损失功能Keras Tensorflow

我需要一个自定义加权MSE损失函数.我在keras.backend中定义了它

from keras import backend as K
def weighted_loss(y_true, y_pred):
    return K.mean( K.square(y_pred - y_true) *
    K.exp(-K.log(1.7) * (K.log(1. + K.exp((y_true - 3)/5 ))))      
    ,axis=-1  )
Run Code Online (Sandbox Code Playgroud)

但是,测试运行会返回

    weighted_loss(1,2)
ValueError: Tensor conversion requested dtype int32 for Tensor with dtype float32: 'Tensor("Exp_37:0", shape=(), dtype=float32)'  
Run Code Online (Sandbox Code Playgroud)

要么

    weighted_loss(1.,2.)
ZeroDivisionError: integer division or modulo by zero   
Run Code Online (Sandbox Code Playgroud)

我想知道我在这里犯了什么错误.

keras tensorflow

2
推荐指数
1
解决办法
6627
查看次数