だからここでは遅く、私のグーグルスキルは私を失敗させているようです。私は以前に(何度も)SOでいくつかの素晴らしい応答を見つけました、私はあなたたちが助けることができると思いました。
ネイティブObjective-cで実行しようとしているニューラルネットワークがあります。動作しますが、遅すぎます。これらのネットワークは再発しません。私が実行する各ネットワークは約20,000回(128x80回、またはその前後)です。問題は、これらのネットワークが実際には数学関数に要約されることです(各ネットワークは、x、y、dist(x、y)、およびバイアスを入力として受け取り、3つの値を出力する4次元関数です)。
私がやりたいのは、各ネットワークを(1回だけ)関数呼び出し、または実行時にObjective-cのコードブロックに変換することです。
どうすればよいですか?実行する必要のある数学演算の大きな文字列を作成することはできますが、その文字列を実行したり、実行用のコードのブロックに文字列を変換したりするにはどうすればよいですか?
繰り返しになりますが、深夜の検索で失敗したので、これがすでに回答されている場合は申し訳ありません。どんな助けでも大歓迎です。
-ポール
編集:ああ!大成功!ほぼ24時間後、最大4つの入力を持つニューラルネットワークを単一の4次元関数に変換するための作業コードがあります。回答では、DaveDeLongによって提案されたブロック方法を使用しました。
私が将来行ったことをフォローしたい人のために、これが私がしたことの(迅速な)内訳です(これがstackoverflowのエチケットが正しくない場合はすみません):最初に、別のブロックに対していくつかのtypedefを作成しました関数:
typedef CGFloat (^oneDFunction)(CGFloat x);
typedef CGFloat (^twoDFunction)(CGFloat x, CGFloat y);
typedef CGFloat (^threeDFunction)(CGFloat x, CGFloat y, CGFloat z);
typedef CGFloat (^fourDFunction)(CGFloat x, CGFloat y, CGFloat z, CGFloat w);
oneDFunctionはf(x)の形式を取り、twoDはf(x、y)などです。次に、2つのfourDFunctionブロック(および2つのoneD、2つのtwoDなど)を組み合わせる関数を作成しました。
fourDFunction (^combineFourD) (fourDFunction f1, fourDFunction f2) =
^(fourDFunction f1, fourDFunction f2){
fourDFunction blockToCopy = ^(CGFloat x, CGFloat y, CGFloat z, CGFloat w){
return f1(x,y,z,w) + f2(x,y,z,w);
};
fourDFunction act = [blockToCopy copy];
[f1 release];
[f2 release];
//Need to release act at some point
return act;
};
そしてもちろん、すべてのノードのfourD関数に活性化関数を適用する必要があり、各ノードについて、それを接続する重みを掛ける必要があります。
//for applying the activation function
fourDFunction (^applyOneToFourD)( oneDFunction f1, fourDFunction f2) =
^(oneDFunction f1, fourDFunction f2){
fourDFunction blockToCopy = ^(CGFloat x, CGFloat y, CGFloat z, CGFloat w){
return f1(f2(x,y,z,w));
};
fourDFunction act = [blockToCopy copy];
[f1 release];
[f2 release];
//Need to release act at some point
return act;
};
//For applying the weight to the function
fourDFunction (^weightCombineFour) (CGFloat x, fourDFunction f1) =
^(CGFloat weight, fourDFunction f1)
{
fourDFunction blockToCopy = ^(CGFloat x, CGFloat y, CGFloat z, CGFloat w){
return weight*f1(x,y,z,w);
};
fourDFunction act = [blockToCopy copy];
[f1 release];
//[act release];
//Need to release act at some point
return act;
};
次に、ネットワーク内のノードごとに、ソースニューロンからの4つのD関数の合計に接続の重みを掛けたものに活性化関数を適用しました。これらすべてのブロックを作成した後、各出力から最終的な関数を取得しました。したがって、私の出力は入力の個別の4D関数です。
助けてくれてありがとう、これはとてもクールでした。