ここではニューラル ネットワークを扱っていますが、実際の問題は Objective-C のブロックを処理する必要があるため、無視しても問題ありません。これが私の問題です。ニューラル ネットワークを一度に実行できる大きなブロックに変換する方法を見つけました。ただし、ネットワークのアクティブ化に比べて、非常に遅くなります。これは少し直感に反するようです。
次のようなネストされた関数のグループを指定した場合
CGFloat answer = sin(cos(gaussian(1.5*x + 2.5*y)) + (.3*d + bias))
//or in block notation
^(CGFloat x, CGFloat y, CGFloat d, CGFloat bias) {
return sin(cos(gaussian(1.5*x + 2.5*y)) + (.3*d + bias));
};
理論的には、その関数を複数回実行する方が、一連の接続をループしてノードをアクティブ/非アクティブに設定するよりも簡単/高速である必要があります。これらはすべて、最終的にこの同じ関数を本質的に計算します。
ただし、ブロックを作成して (スレッド:実行時に関数を作成する方法を参照)、このコードを実行すると、適度なサイズのネットワークでは非常に遅くなります。
今、私がよく理解していないのは次のとおりです。
- ブロックをコピーするとき、正確には何をコピーしていますか?
- たとえば、ブロックを copy1 と copy2 の 2 回コピーするとします。同じスレッドでcopy1 と copy2 を呼び出した場合、同じ関数が呼び出されますか? ドキュメントがブロック コピーに対して何を意味するのか正確にはわかりません: Apple Block Docs
- ここで、copy1 と copy2 のコピーをもう一度作成しますが、代わりに別のスレッドでコピーを呼び出すと、関数はどのように動作するのでしょうか? 各スレッドが同じブロックにアクセスしようとするため、これにより何らかの速度低下が発生しますか?