小编Bob*_*Bob的帖子

如何为新的 conda 环境指定架构或平台?(苹果硅)

在创建新的 conda 环境时,有没有办法指定架构/平台?或者,conda 在运行时如何检测其当前的架构/平台?

我的目标是:我在 Apple Silicon 笔记本电脑上运行。我现有的环境通过 Rosetta2 运行良好,但我想开始试验在 Apple Silicon 上本地运行的 python。miniforge提供了一个带有 Apple Silicon 构建的 conda-forge 存储库,我可以conda-forge在创建环境时告诉 conda 使用该通道。但是除了从 miniforge 的安装程序开始之外,我没有看到一种方法来指定我希望这是一个 arm64 环境而不是 x86_64 环境。

提前致谢。

anaconda conda miniconda anaconda3

8
推荐指数
2
解决办法
2394
查看次数

告诉GCC*不*链接libgomp所以它链接libiomp5而不是

我需要弄清楚我可以提供给gcc的编译器/链接器指令,以便在指定-fopenmp时它不会自动链接libgomp.

原因是我正试图建立英特尔的MKL BLAS.MKL需要添加单独的英特尔库来处理多线程(例如,libmkl_intel_thread或libmkl_gnu_thread).但是,用于链接MKL和libgomp的库并不适用于包括我在内的每个操作系统.这迫使我链接libmkl_intel_thread,而libmkl_intel_thread又必须链接libiomp5.

虽然我能够构建我的包,但是一些二进制文件链接到libgomp和libiomp5.我不积极,这是造成问题,但也出现了一些事故,联动组合是可疑的,即使它不会导致崩溃的肯定是一个可怕的低效率.

我正在尝试使用gcc 4.9.1.

不幸的是,避免-fopenmp不是一种选择.原因是这是用于编译由几个子包组成的相当大的包,其Makefile不是最好的形状,并且可以在以后编译来自其他源(插件)的其他包.强制通用编译器/链接器指令并不困难.但是,启用--enable-openmp会激活-fopenmp和定义用于触发与多线程相关的代码的定义.试图将三者(--enable-openmp,-fopenmp和链接到--enable-openmp的代码)分开是不可行的.

我查看了手册页,我没有看到任何允许选择openmp库的gcc指令.英特尔的论坛有一个非常古老的讨论,他们建议在-fopenmp之后立即指定一个静态库,然后是--as-needed.这似乎非常摇摇晃晃,并且还有很多潜在的干扰插件包.llvm-openmp似乎在某一点上考虑了-fopenmp = libiomp5指令,但它似乎已经在3.5版本中被删除了,我试图使用gcc.

谢谢.

gcc openmp intel-mkl libgomp

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

在keras中乘以两层的输出

我正试图在keras中使用这种设计实现神经(ish)网络:http: //nlp.cs.rpi.edu/paper/AAAI15.pdf

该算法基本上具有三个输入.输入2和输入3乘以相同的权重矩阵W1以产生O2和O3.输入1乘以W2以产生O1.然后,我们需要取O1*O2和O1*O3的点积.

我正试图在keras中实现这一点.

我的第一个想法是使用keras Graph类并使W1成为具有两个输入和两个输出的共享节点层.好到目前为止.

然后出现了如何用O1取这两个输出的点积的问题.

我试图定义一个自定义函数:

   def layer_mult(X, Y):
       return K.dot(X * K.transpose(Y))
Run Code Online (Sandbox Code Playgroud)

然后:

ntm.add_node(Lambda(layer_mult, output_shape = (1,1)), name = "ls_pos", inputs = ["O1", "O2"])
ntm.add_node(Lambda(layer_mult, output_shape = (1,1)), name = "ls_neg", inputs = ["O1", "O3"])
Run Code Online (Sandbox Code Playgroud)

编译时出现的问题是keras只想给Lambda层一个输入:

   1045         func = types.FunctionType(func, globals())
   1046         if hasattr(self, 'previous'):
-> 1047             return func(self.previous.get_output(train))
   1048         else:
   1049             return func(self.input)

TypeError: layer_mult() takes exactly 2 arguments (1 given)
Run Code Online (Sandbox Code Playgroud)

我认为另一种选择可能是使用一个Merge类,它具有dot允许合并的类型.但是,类的输入层Merge必须传递给构造函数.因此,似乎没有办法从共享节点获取输出Merge到添加MergeGraph …

python neural-network theano deep-learning keras

6
推荐指数
1
解决办法
6557
查看次数

当函数采用不同列的多个参数时使用 dplyr mutate_at

我有data.frame很多列的名称遵循一个模式。如:

df <- data.frame(
  x_1 = c(1, NA, 3), 
  x_2 = c(1, 2, 4), 
  y_1 = c(NA, 2, 1), 
  y_2 = c(5, 6, 7)
)
Run Code Online (Sandbox Code Playgroud)

我想申请mutate_at对每对列执行相同的操作。如:

df %>%
  mutate(
    x = ifelse(is.na(x_1), x_2, x_1), 
    y = ifelse(is.na(y_1), y_2, y_1)
  )
Run Code Online (Sandbox Code Playgroud)

有没有办法用mutate_at/做到这一点mutate_each

这个:

df %>%
  mutate_each(vars(x_1, y_1), funs(ifelse(is.na(.), vars(x_2, y_2), .)))
Run Code Online (Sandbox Code Playgroud)

我尝试过的各种变体都失败了。

该问题类似于在 dplyr mutate_at 调用中使用多列的函数,但不同之处在于函数调用的第二个参数不是单个列,而是 vars 中每列的不同列。

提前致谢。

r dplyr

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

在Cython中处理C++数组(使用numpy和pytorch)

我试图用来cython包装一个C++库(fastText如果相关的话).C++库类从磁盘加载一个非常大的数组.我的包装器从C++库中实例化一个类来加载数组,然后使用cython内存视图并将numpy.asarray数组转换为numpy数组,然后调用torch.from_numpy以创建张量.

出现的问题是如何处理为阵列释放内存.

现在,我得到pointer being freed was not allocated程序退出时.我希望这是因为C++代码和numpy/ pytorch都试图管理同一块RAM.

我可以简单地在C++库中注释掉析构函数,但这感觉就像它将导致我在路上遇到不同的问题.

我该如何处理这个问题?是否有任何关于如何使用C++处理内存共享的最佳实践文档cython

如果我修改C++库来包装在一个阵列shared_ptr,将cython(和numpy,pytorch等)共享shared_ptr正确?

如果问题是天真的,我道歉; Python垃圾收集对我来说非常神秘.

任何建议表示赞赏.

c++ numpy cython fasttext pytorch

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