2
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の一部です。ループ/ mallocを避けるために以下のjuliaコードをリファクタリングする方法はありますか?
2つの 'for'ループに計算をパックすると2つの割り振りになり、さらに5倍の速度向上*が得られます。それは簡単ですが、要求された場合はコードを追加します。 –
コードも追加してください!あなたはジュリアのパフォーマンスの神です。 –
コードブロック全体を1行にリファクタリングする方法についても説明できますか?あなたのコードで、どこにジャコビ行列の対角要素を計算したのか分かりません。 –