Итак, уже поздно, и мои навыки работы с Google, похоже, подводят меня. Я нашел несколько хороших ответов на SO раньше (снова и снова), я думал, что вы, ребята, могли бы помочь.
У меня есть нейронная сеть, которую я пытаюсь запустить в native-c. Это работает, но это слишком медленно. Эти сети не повторяются. Каждую сеть я запускаю около 20000 раз (128х80 раз или около того). Проблема заключается в том, что эти сети на самом деле сводятся к математическим функциям (каждая сеть представляет собой четырехмерную функцию, принимающую x, y, dist (x, y) и смещение в качестве входных данных и выводящую 3 значения).
Что я хочу сделать, так это преобразовать каждую сеть (только один раз) в вызов функции или блок кода во время выполнения в target-c.
Как мне это сделать? Я мог бы сделать большую строку математических операций, которые должны быть выполнены, но как мне выполнить эту строку или преобразовать строку в блок кода для выполнения?
Опять же, мой поздний ночной поиск не дал мне результата, извините, если на этот вопрос уже был дан ответ. Любая помощь очень ценится.
-Поль
Редактировать: Ага! Огромный успех! Почти через 24 часа у меня есть рабочий код, чтобы превратить нейронную сеть с 4 входами в одну 4-мерную функцию. Я использовал блочный метод, предложенный Дейвом Делонгом в ответах.
Для любого, кто когда-либо захочет следить за тем, что я сделал в будущем, вот (быстрый) анализ того, что я сделал (извините, если это неправильный этикет в 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) и т. Д. Затем я создал функции для объединения двух блоков 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;
};
Затем для каждого узла в сети я просто применил функцию активации к сумме четырехмерных функций из исходных нейронов, умноженной на их вес соединения.
После составления всех этих блоков я взял финальные функции из каждого выхода. Поэтому мои выходы являются отдельными 4D функциями входов.
Спасибо за помощь, это было очень круто.