小编use*_*893的帖子

Julia:优化简单动力系统的仿真

我正在尝试优化简单动态系统的仿真,其中网络的响应及其参数(权重)根据简单的线性方程演变.模拟需要运行数千万个时间步,但网络规模通常很小.因此,性能受矩阵向量产品的约束,而不是临时数组,绑定检查和其他不太明显的因素.由于我是朱莉娅的新手,我很欣赏任何进一步优化性能的提示.

function train_network(A, T, Of, cs, dt)
    N, I = size(T)
    z    = zeros(I)
    r    = zeros(N)

    @inbounds for t in 1:size(cs, 1)
        # precompute
        Az  = A*z
        Ofr = Of*r

        # compute training signal
        @devec z += dt.*(Az + cs[t] - 0.5.*z)
        I_teach   = T*(Az + cs[t])
        Tz        = T*z

        # rate updates
        @devec r += dt.*(I_teach - Ofr - 0.1.*r)

        # weight updates
        for i in 1:I
            @devec T[:, i] += dt.*1e-3.*(z[i].*r - T[:, i])
        end

        for n …
Run Code Online (Sandbox Code Playgroud)

optimization performance dynamic-programming julia

8
推荐指数
1
解决办法
388
查看次数

Julia-Lang Metaprogramming:将表达式转换为具有表达式依赖参数的函数

给出一个价值字典,

values = {:A => 3,:B => 1}

转动(任意)表达式

expr = :( 2*A)

到一个函数foo(values)来计算表达式,所以在这种情况下foo(values)= 6.结果函数将被调用数百万次,因此速度是一个重要的考虑因素.如果有必要,我很乐意采用稍微不同的方法,只要它可以自动化.

我试过的事情:

  1. 使用convert(Function,expr)进行转换,如此处所示.失败了(Julia 0.3.8-pre):

    convert 没有匹配convert(:: Type {Function},:: Expr)的方法

  2. 使用@eval可以做到

    @eval foo(A)= $(expr)

    然后调用foo(values [:A]),但这需要知道expr依赖于A(并且仅在A上).

  3. 我编写了一个函数find_vars(exp)来返回expr中的符号(在本例中为[:A]),但是在@eval方法中找不到如何使用它们.

dictionary expression metaprogramming julia

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

Jupyter Notebook 中的 Argparse 引发 TypeError

在 Jupyter Notebook 中使用 argparse 会引发 TypeError。如果我执行与脚本相同的代码,则相同的代码可以正常工作。MWE:

import argparse

parser = argparse.ArgumentParser(description='Foo')
parser.add_argument('--name', '-n', default='foo', help='foo')

args = parser.parse_args()
Run Code Online (Sandbox Code Playgroud)

结果:

TypeError: 'level' is an invalid keyword argument for this function
Run Code Online (Sandbox Code Playgroud)

python argparse jupyter-notebook

6
推荐指数
2
解决办法
4414
查看次数

多维数组的就地改组

我试图在Cython中实现一个NaN安全的混洗程序,它可以沿着任意维度的多维矩阵的几个轴进行混洗.

在1D矩阵的简单情况下,可以使用Fisher-Yates算法简单地将所有具有非NaN值的索引混洗:

def shuffle1D(np.ndarray[double, ndim=1] x):
    cdef np.ndarray[long, ndim=1] idx = np.where(~np.isnan(x))[0]
    cdef unsigned int i,j,n,m

    randint = np.random.randint
    for i in xrange(len(idx)-1, 0, -1):
        j = randint(i+1)
        n,m = idx[i], idx[j]
        x[n], x[m] = x[m], x[n]
Run Code Online (Sandbox Code Playgroud)

我想扩展这个算法来处理没有重新形状的大型多维数组(它触发了一个副本,用于更复杂的情况,这里没有考虑).为此,我需要摆脱固定的输入维度,这对于Cython中的numpy数组和内存视图来说似乎都不可能.有解决方法吗?

提前谢谢了!

python arrays numpy cython multidimensional-array

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

具有架构优化的 Docker 镜像?

一些库(例如 BLAS/LAPACK 或某些优化库)会在编译时针对本地计算机架构进行优化。让我们以 OpenBlas 为例。使用 OpenBlas 创建 Docker 容器有两种方法:

  1. 使用 Dockerfile,在其中指定 OpenBlas 库的 git 克隆以及所有必要的编译标志和构建命令。

  2. 从 Docker Hub 拉取并运行其他人的 Ubuntu + OpenBlas 映像。

选项 (1) 确保 OpenBlas 是针对您的机器构建和优化的。那么选项(2)呢?作为 Docker 新手,我将映像视为固定和静态的东西,因此运行此映像不会针对我的机器(可能是基于 AMD 的而不是维护者的 Intel CPU)进行优化。让我困惑的是,镜像ipython/scipyserver在构建过程中确实从 Github 克隆了最新的 OpenBlas master。

我似乎误解了 Docker 镜像和/或自动构建的概念,非常感谢您的澄清。

optimization blas lapack docker

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

内存中numpy数组(图像,uint8)的有损压缩

我正在尝试将 1.000.000 张图像的数据集加载到内存中。作为标准的 numpy 数组 (uint8),所有图像组合填充了大约 100 GB 的 RAM,但我需要将其降低到 < 50 GB,同时仍然能够快速将图像读回 numpy(这就是将所有内容保留在内存中的重点)。像 blosc 这样的无损压缩只会减少大约 10% 的文件大小,所以我选择了 JPEG 压缩。最小示例:

import io
from PIL import Image

numpy_array = (255 * np.random.rand(256, 256, 3)).astype(np.uint8)
image = Image.fromarray(numpy_array)
output = io.BytesIO()
image.save(output, format='JPEG')
Run Code Online (Sandbox Code Playgroud)

在运行时,我正在阅读图像:

[np.array(Image.open(output)) for _ in range(1000)]
Run Code Online (Sandbox Code Playgroud)

JPEG 压缩非常有效(< 10 GB),但将 1000 张图像读回 numpy 数组所需的时间约为 2.3 秒,这严重影响了我的实验性能。我正在寻找可以在压缩和读取速度之间进行更好权衡的建议。

python compression performance numpy image-compression

4
推荐指数
1
解决办法
4378
查看次数

朱莉娅:把代码注入功能

我想将代码注入函数中.为了具体,请考虑一个简单的模拟器:

function simulation(A, x)
    for t in 1:1000
        z = randn(3)
        x = A*x + z
    end
end
Run Code Online (Sandbox Code Playgroud)

有时我想每十个时间步记录x的值,有时是每20个时间步的z的值,有时我不想记录任何值.当然,我可以将一些标志作为函数的参数,并有一些if-else语句.但我想保持模拟代码干净,只注入一段代码

if t%10 == 0
    append!(rec_z, z)
end
Run Code Online (Sandbox Code Playgroud)

在我需要的时候进入函数的特定位置.为此,我想编写一个宏来监视一个特定的值

@monitor(:z, 10)
simulation(A, x)
Run Code Online (Sandbox Code Playgroud)

这可能与Julia的Metaprogramming功能有关吗?

macros metaprogramming julia

3
推荐指数
1
解决办法
290
查看次数