我有一个神经网络的功能,它是从输入列表和权重列表计算下一层的功能。有没有办法让这更快或更有效? 参数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
答案 0 :(得分:1)
通常,尽量不要在Python中使用for
循环结构。它们非常慢。使用用numpy
编程的矩阵运算代替,然后循环将在C ++的引擎下运行(快50到100倍)。
通过将layer
和inp
向量以及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
是您的m
乘k
权重矩阵。 output
将成为n
k
矩阵的前向步骤激活。