区分線形伝達関数の固有値ベースの実装を最適化する助けが必要です (出力値は入力と同じですが、この場合は [-0.5,0.5] の範囲に制限されています)。以下は、私がプロファイリングした機能です。
typedef float SignalT;
typdedef Eigen::Array<SignalT, Eigen::Dynamic, Eigen::Dynamic> Signal2D;
void ActivateSum(unsigned char const idx, Signal2D::ColXpr& outputSum)
{
switch (idx)
{
case 0U:
//Threshold
outputSum = (outputSum >= (SignalT) 0.0).cast<SignalT>();
break;
case 1U:
//Piecewise linear
outputSum = outputSum.unaryExpr([](SignalT const elem)
{
if (elem >(SignalT) 0.5)
return (SignalT) 0.5;
else if (elem < (SignalT)-0.5)
return (SignalT)-0.5;
else
return elem;
}
);
break;
case 2U:
//Fast Sigmoid
outputSum *= ((SignalT) 1.0 + outputSum.abs()).inverse();
break;
default:
assert(0);
throw;
}
}
私のプログラム全体は、各スイッチ ケースで次のサンプルの一部を使用します。
Threshold: 3.3%
Piecewise Linear: 18%
Fast Sigmoid: < 0.1%
高速シグモイドはめったに使用されませんが、区分的線形ケースはしきい値ケースと同じくらい頻繁に発生するはずです (ただし、Visual Studio を使用してこれを測定する方法はわかりません)。そのため、私はその Piecewise 線形単項式にかなりの時間を費やしているように思われ、Eigen で機能を実現する別の方法があるかどうか疑問に思っていました。おそらく、いくつかの組み込みメソッドを使用して速度を上げます. これは非常に単純な伝達関数であるため、実際には計算上非常に安価である必要があります-私の推測では、コストは、カスタムラムダによる最適化の悪さと他の何よりも関係があると思います.
考え?
編集:これまでのところ、Leeorの答えのおかげでこれを思いつきました:
case 1U:
//Piecewise linear
outputSum = outputSum.max((SignalT)-0.5).min((SignalT)0.5);
break;