对于我的任务,我需要实现一个带有一些任意激活函数的神经网络。更具体地说,这些激活是ReLU,但都有不同的一阶导数。
我为此目的实现了神经网络,但由于某种原因,它训练得很差(达到一个相当大的阈值)。
所以我需要一个框架来帮助我快速使用我的ReLU构建NN并将其应用于一些实际任务,如MNIST数据集。语言并不重要,但我想坚持使用C ++ \ C \ C#\ Golang。
谢谢!
答案 0 :(得分:1)
如果Java没问题。 DL4J通过扩展BaseActivationFunction轻松支持自定义激活功能。
public class Sample {
static class MyActivationFunction extends BaseActivationFunction {
@Override
public INDArray getActivation( INDArray in, boolean training ) {
Nd4j.getExecutioner().execAndReturn( new RectifedLinear( in ) );
return in;
}
@Override
public Pair<INDArray, INDArray> backprop( INDArray in, INDArray epsilon ) {
INDArray dLdz = Nd4j.getExecutioner().execAndReturn( new RectifedLinear( in ).derivative() );
dLdz.muli( epsilon );
return new Pair<>( dLdz, null );
}
@Override
public String toString() {
return "myrelu";
}
}
public static void main( String[] args ) throws Exception {
MultiLayerConfiguration conf = new NeuralNetConfiguration.Builder()
.optimizationAlgo( OptimizationAlgorithm.STOCHASTIC_GRADIENT_DESCENT ).iterations( 1 )
.learningRate( 0.0001 )
.seed( 123 )
.regularization( true )
.l2( 0.005 )
.weightInit( WeightInit.XAVIER )
.updater( Updater.NESTEROVS )
.activation( new MyActivationFunction() ) // << USE CUSTOM ACTIVATION FUNCTION
.list()
.layer( 0, new DenseLayer.Builder().nIn( 768 ).nOut( 200 ).build() )
.layer( 1, new DenseLayer.Builder().nIn( 200 ).dropOut( 0.2 ).nOut( 200 ).build() )
.layer( 2, new RnnOutputLayer.Builder( LossFunction.MCXENT ).activation( Activation.SOFTMAX ).nIn( 200 ).nOut( 10 ).build() )
.pretrain( false ).backprop( true )
.build();
}
}
答案 1 :(得分:0)
如果你可以使用Python,那么Keras将是最好的方式。它可以使用c ++中的tensorflow后端并支持GPU https://keras.io/
答案 2 :(得分:0)
通常,为了构建用于检测数字的NeuralNet,可以按照以下步骤操作:
Tensorflow
中使用Keras
。它有一个可用的示例,其中包含有关如何运行它并查看结果的良好指南。它已经准备好并且易于运行,可以看到结果,Tensorflow指南解释了所使用的功能。因此您只需稍作搜索即可更改所需的功能。