m,n =size(l.x)
for batch=1:m
l.ly = l.y[batch,:]
l.jacobian .= -l.ly .* l.ly'
l.jacobian[diagind(l.jacobian)] .= l.ly.*(1.0.-l.ly)
# # n x 1 = n x n * n x 1
l.dldx[batch,:] = l.jacobian * DLDY[batch,:]
end
return l.dldx
l.x
是m
个n
矩阵。 l.y
是另一个与l.x
大小相同的矩阵。我的目标是通过m
矩阵n
创建另一个l.dldx
,其中每一行都是for循环内操作的结果。任何人都可以对这段代码进行进一步的优化吗?上面的代码是https://github.com/stevenygd/NN.jl的一部分。
答案 0 :(得分:1)
以下内容应实现相同的计算并且效率更高:
l.dldx = l.y .* (DLDY .- sum( l.y .* DLDY , 2))
通过将sum
重构为循环,可能会有轻微的改进。
由于问题没有可运行的代码或测试用例,因此很难给出明确的基准,所以欢迎反馈。
更新
以上是带有显式循环的代码:
function calc_dldx(y,DLDY)
tmp = zeros(eltype(y),size(y,1))
dldx = similar(y)
@inbounds for j=1:size(y,2)
for i=1:size(y,1)
tmp[i] += y[i,j]*DLDY[i,j]
end
end
@inbounds for j=1:size(y,2)
for i=1:size(y,1)
dldx[i,j] = y[i,j]*(DLDY[i,j]-tmp[i])
end
end
return dldx
end
长版应该运行得更快。衡量代码性能的一个好方法是使用BenchmarkTools包。