我正在尝试改进 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调用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.
我有一台带有两个显卡的机器。我想用两者来训练我的模型。为了让我的生活更轻松,我正在使用 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 个 GPU 上运行效果很好(训练完成且没有错误):
trainer = Trainer(gpus=1, accelerator='ddp')
Run Code Online (Sandbox Code Playgroud)
我应该如何解决这个问题?坚持使用“dp”并修复我的 BroadcastBackward 错误?或者坚持使用 ddp,但是如何修复脚本重复错误呢?
dp错误详细信息:
在文件 X,第 …
我需要一个自定义加权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)
我想知道我在这里犯了什么错误.
python ×2
autodoc ×1
gpu ×1
keras ×1
matlab ×1
numpy ×1
python-3.x ×1
pytorch ×1
tensorflow ×1