如何让神经网络功能更快?

时间:2018-01-30 08:38:03

标签: python python-3.x performance

我有一个神经网络的功能,它是从输入列表和权重列表计算下一层的功能。有没有办法让这更快或更有效? 参数inp是输入,权重是权重,layerlength是下一层的长度,rounds只是将输出舍入到的长度。

def output(inp,weights,layerlength,rounds):
    layer=[]
    count=0
    lappend=layer.append
    for a in range(layerlength):
        total=0
        for b in range(len(inp)):  
            total+=inp[b]*weights[count]
            count+=1
        lappend(round(total,rounds))
    return layer

2 个答案:

答案 0 :(得分:1)

通常,尽量不要在Python中使用for循环结构。它们非常慢。使用用numpy编程的矩阵运算代替,然后循环将在C ++的引擎下运行(快50到100倍)。 通过将layerinp向量以及weights矩阵全部定义为numpy.array(),您可以轻松地重构上面的代码而无需任何Python for循环,然后执行矩阵乘法它们。

编辑: 我希望我不会帮你在这里作弊作弊;)

import numpy as np
# 10 dimensional input
inpt = np.arange(10)
# 20 neurons in the first (fully connected) layer
weights = np.random.rand(10, 20)
# mat_mul: to calculate the input to the non-linearity of the first layer
# you need to multiply each input dimension with all the weights assigned to a specific neuron of the first layer
# and then sum them up, and this for all the neurons in that layer
# you can do all of that in this single Matrix multiplication
layer = np.matmul(inpt, weights)
print(inpt.shape)
print()
print(weights.shape)
print()
print(layer.shape)

答案 1 :(得分:0)

所以我假设你正在计算一层的激活。

确保使用线性代数库,如Numpy(或Tensorflow,PyTorch等)。这些将确保您的计算在CPU(或GPU)上运行得更高效。通常使用for循环会产生大量的计算开销。

例如,在numpy中,您可以将一个图层的前馈传递编写为:

output = inp.dot(weights)

inp位于您的n m输入矩阵中,weights是您的mk权重矩阵。 output将成为n k矩阵的前向步骤激活。