Attualmente sto scrivendo un'implementazione della rete neurale in c ++ e mi è venuta una domanda curiosa:
Voglio che il mio NN sia "generico", quindi voglio essere in grado di definire le funzioni personalizzate di trasferimento e di errore. Il mio primo istinto è quello di creare un'interfaccia (classe astratta) e passare oggetti derivati come argomento (fondamentalmente functors):
class VectorizedFunction {
public:
virtual MatrixXf F(const Ref<MatrixXf>&) = 0;
virtual MatrixXf dF(const Ref<MatrixXf>&) = 0;
virtual ~VectorizedFunction() = 0;
}
class VTanh : public VectorizedFunction {
MatrixXf F(const Ref<MatrixXf>&){
return M.array().tanh().matrix();
}
MatrixXf dF(const Ref<MatrixXf>&){
auto th = M.array().tanh();
return (1 - th*th).matrix();
}
}
Ma poi mi sono ricordato che gli oggetti funzione sono stati introdotti in C ++ 11 permettendomi di fare cose come:
class VectorizedFunction {
public:
function<MatrixXf(const Ref<MatrixXf>&)> F;
function<MatrixXf(const Ref<MatrixXf>&)> dF;
};
VectorizedFunction tf;
tf.F = [&](const Ref<MatrixXf>& M)->MatrixXf { return M.array().tanh().matrix(); };
tf.dF = [&](const Ref<MatrixXf>& M)->MatrixXf { auto th = M.array().tanh(); return (1 - th*th).matrix(); };
Quale delle due opzioni produrrà meno overhead e quale sarà più facile da mantenere?