所以这里已经很晚了,我的谷歌技能似乎让我失望了。我之前(一次又一次)在 SO 上找到了一些很好的回应,我认为你们可以提供帮助。
我有一个神经网络,我试图在本机 Objective-c 中运行。它有效,但它太慢了。这些网络不是循环的。每个网络我运行大约 20,000 次(128x80 次,或大约)。问题是这些网络实际上只是归结为数学函数(每个网络都是一个 4 维函数,以 x,y,dist(x,y) 和偏差作为输入,并输出 3 个值)。
我想要做的是将每个网络(仅一次)转换为函数调用,或在运行时在 Objective-C 中的代码块。
我该怎么做呢?我可以制作一大串需要执行的数学运算,但是我该如何去执行那个字符串,或者将字符串转换成一个代码块来执行呢?
再次,我深夜的搜索失败了,如果这已经得到回答,我很抱歉。任何帮助是极大的赞赏。
-保罗
编辑:啊哈!巨大的成功!将近 24 小时后,我有了工作代码,可以将具有多达 4 个输入的神经网络转换为单个 4 维函数。我在答案中使用了 Dave DeLong 建议的块方法。
对于任何想要关注我未来所做的事情的人,这里是我所做的(快速)细分(如果这是 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 函数。
感谢您的帮助,这非常酷。