小编chi*_*irp的帖子

Cython -std=c++11 错误,同时使用 C 和 C++

我是 Cython 的新手,我正在尝试从该项目编译 Cython但没有成功。

通过这个 setup.py,

from distutils.core import setup, Extension
from Cython.Distutils import build_ext
from distutils.extension import Extension

sources_list = ["timgraph.pyx", "Graph.cpp", "InfGraph.cpp", "sfmt/SFMT.c"]

setup(ext_modules=[Extension("pytim",
                             sources=sources_list,
                             language="c++",
                             extra_compile_args=["-std=c++11"])
                  ],
      cmdclass={'build_ext':build_ext})
Run Code Online (Sandbox Code Playgroud)

我运行以下命令:

python setup.py build_ext --inplace
Run Code Online (Sandbox Code Playgroud)

并得到以下错误:

error: invalid argument '-std=c++11' not allowed with 'C/ObjC'
error: command 'clang' failed with exit status 1
Run Code Online (Sandbox Code Playgroud)

我正在运行 macOS High Sierra 10.13.2、Python 3.6.2、Cython 0.27.3 和 Apple LLVM 版本 9.0.0,以防有帮助。

编辑:我想这可能是因为尝试同时编译 C 和 C++,因为我可以运行C++ 的 Cython 示例并且工作正常。但我不知道如何解决 extra_compile_args 适用于所有源(包括“sfmt/SFMT.c”)的事实。

c c++ python cython

5
推荐指数
1
解决办法
2820
查看次数

在 PyTorch 中为批处理中的每个单独样本计算梯度

我正在尝试实现一个版本的差异私有随机梯度下降(例如this),如下所示:

计算大小为 L 的批次中每个点的梯度,然后分别裁剪 L 个梯度中的每一个,然后将它们平均在一起,最后执行(噪声)梯度下降步骤。

在 pytorch 中执行此操作的最佳方法是什么?

最好有一种方法可以同时计算批处理中每个点的梯度:

x # inputs with batch size L
y #true labels
y_output = model(x)
loss = loss_func(y_output,y) #vector of length L
loss.backward() #stores L distinct gradients in each param.grad, magically
Run Code Online (Sandbox Code Playgroud)

但是失败了,分别计算每个梯度,然后在累积之前裁剪范数,但是

x # inputs with batch size L
y #true labels
y_output = model(x)
loss = loss_func(y_output,y) #vector of length L   
for i in range(loss.size()[0]):
    loss[i].backward(retain_graph=True)
    torch.nn.utils.clip_grad_norm(model.parameters(), clip_size)
Run Code Online (Sandbox Code Playgroud)

累积第 i 个梯度,然后剪辑,而不是先剪辑再累积到梯度中。解决此问题的最佳方法是什么?

python gradient-descent pytorch

5
推荐指数
1
解决办法
3589
查看次数

标签 统计

python ×2

c ×1

c++ ×1

cython ×1

gradient-descent ×1

pytorch ×1