Python 如何提高神经网络的性能?

Python 如何提高神经网络的性能?,python,performance,numpy,neural-network,gpu,Python,Performance,Numpy,Neural Network,Gpu,在我学习用Python编写神经网络的过程中,我刚刚编写了以下线性关联网络,该网络接收相应长度的K输入向量x_1,…,x_K和相应长度的K输出向量N,并使用梯度下降法找到最佳权重 当调整K、L和N时,计算时间非常快,因此我正在研究如何加快计算速度。我发现了丘比,但在这个例子中,丘比比努比慢得多为什么会这样?当将代码更改为cupy变体时,我什么也不做,只是将每个np替换为cp,因为我将cupy导入为cp 我还使用了f=njit()(manyasociations.fit),但是我必须以fit返回W,

在我学习用Python编写神经网络的过程中,我刚刚编写了以下线性关联网络,该网络接收相应长度的
K
输入向量
x_1,…,x_K
和相应长度的
K
输出向量
N
,并使用梯度下降法找到最佳权重

当调整
K
L
N
时,计算时间非常快,因此我正在研究如何加快计算速度。我发现了丘比,但在这个例子中,丘比比努比慢得多为什么会这样?当将代码更改为cupy变体时,我什么也不做,只是将每个
np
替换为
cp
,因为我将cupy导入为
cp

我还使用了
f=njit()(manyasociations.fit)
,但是我必须
以fit返回W
,而不是编写
manyasociations.weights=W
有没有办法在课堂内使用njit,或者除此之外还有没有更好的办法使用numba/cuda?结果表明,在第一次函数调用“预热”之后,它的速度要快得多,但在
K=L=N=9
周围有上述形状的向量时,它仍然达到极限

还有什么其他的好方法可以加速代码,比如下面的方法?我能更有效地写作吗?我能更好地使用GPU吗?

将numpy导入为np
阶级社会:
def配合(x_系列、y_系列、学习率、tol):
L_L=x_列车形状[1]
L_N=y_train.形状[1]
W=np.零((L_N,L_L))
对于范围内的n(L_n):
学习=真实
w=np.random.rand(L_L)
在学习过程中:
delta=(x_列@w-y_列[:,n])
梯度E=x_列的增量
w=w-学习率*毕业率
如果(grad_E@grad_E)
我发现了丘比,但在这个例子中,丘比比努比慢得多。为什么会这样

GPU上的计算分为基本的计算密集型构建块,称为内核。内核由CPU提交到GPU每个内核调用都需要一些时间:CPU必须与GPU通信,并且经常使用相对较慢的PCI互连(两者都应同步),应在GPU上进行分配,以便写入生成的数据,等等。CuPy包天真地将每个基本Numpy指令转换为GPU内核由于循环执行许多小内核,因此开销很大。因此,如果您希望使用CuPy在GPU上更快地编写代码,您需要处理大量数据块,或者直接编写自己的内核(这很难,因为GPU非常复杂)

是否有任何方法可以在课堂内使用njit,或者除此之外还有更好的方法使用numba/cuda

您可以使用
@jitclass
。您可以在中找到更多信息

此外,您可以利用并行性加快代码编写速度。为此,您可以使用
prange
替换
range
,并将属性
parallel=True
添加到Numba的
njit
。你可以找到更多的信息

还有什么其他的好方法可以加快代码的速度,比如下面的方法?我能更有效地写作吗?我能更好地使用GPU吗

神经网络通常是计算密集型的。Numba应该相当好,以获得相当高的性能。但是,如果您想要一个快速的代码,那么您要么需要使用更高级别的库,要么需要自己重写库所做的事情(可能是使用更低级别的代码)。
使用神经网络的标准方法是使用专门的库,如TensorFlow、PyTorch、Keras等。当然,前者是灵活的,高度优化的,尽管它比另一个稍微低一点。

您可以尝试使用。它有一个类似numpy的API,具有自动区分和GPU支持。请提供一个最小的可复制示例,否则人们将无法帮助您。@jakub感谢您的建议。不幸的是,JAX还不支持Windows。