Neural network 我可以设置自己激活的神经网络框架

Neural network 我可以设置自己激活的神经网络框架,neural-network,Neural Network,对于我的任务,我需要实现一个具有一些任意激活函数的神经网络。更具体地说,这些激活是ReLUs,但都有不同的一阶导数 为此,我有自己的神经网络实现,但由于某些原因,ReLU的训练非常差(达到了相当大的阈值) 因此,我需要一个框架,可以帮助我快速建立我的ReLUs神经网络,并将其应用到一些实际任务,如MNIST数据集。语言并不重要,但我想坚持使用C++\C\C\Golang 谢谢大家! 如果Java还可以。通过扩展BaseActivationFunction,轻松支持自定义激活函数 public c

对于我的任务,我需要实现一个具有一些任意激活函数的神经网络。更具体地说,这些激活是ReLUs,但都有不同的一阶导数

为此,我有自己的神经网络实现,但由于某些原因,ReLU的训练非常差(达到了相当大的阈值)

因此,我需要一个框架,可以帮助我快速建立我的ReLUs神经网络,并将其应用到一些实际任务,如MNIST数据集。语言并不重要,但我想坚持使用C++\C\C\Golang

谢谢大家!

如果Java还可以。通过扩展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();
    }
}
公共类示例{
静态类MyActivationFunction扩展了BaseActivationFunction{
@凌驾
公共INDARY getActivation(INDARY in,布尔训练){
Nd4j.getExecutioner().execAndReturn(新的整流线性(in));
返回;
}
@凌驾
公共对backprop(INDArray in,INDArray epsilon){
INDArray dLdz=Nd4j.getExecutioner().ExecuteAndReturn(新的整流线性(in).derivative());
dLdz.muli(ε);
返回新对(dLdz,null);
}
@凌驾
公共字符串toString(){
返回“myrelu”;
}
}
公共静态void main(字符串[]args)引发异常{
多层配置conf=new NeuralNetConfiguration.Builder()
.优化算法(优化算法.随机梯度下降).迭代(1)
.学习率(0.0001)
.种子(123)
.正规化(真实)
.l2(0.005)
.weightInit(weightInit.XAVIER)
.updater(updater.NESTEROVS)

激活(new MyActualActuple函数)(/<)P>如果您可以使用Python,那么Keras将是最好的方式。它可以使用C++中的TysFROUM后端,支持GPU。

一般来说,要构建用于检测数字的神经网络,您可以按照以下步骤操作:

  • 数据集:
    • 如果你有自己的数据集,检查标签的大小和日期是否适合神经网络
    • 如果没有自己的数据集,可以使用准备好的数据集,如MNIST和其他数据集
  • 神经网络:
    • 您可以在此或
      Keras
      中使用
      Tensorflow
      。它有一个现成的示例,其中包含有关运行该示例并查看结果的代码指南

  • 它准备好了,可以很容易地运行并查看结果,Tensorflow指南解释了使用的函数。因此,您只需稍加搜索即可更改所需的函数。

    它看起来足够容易理解和清晰。因此基本上(因为只有导数不同)它可以归结为编写一个函数,返回
    INDArray
    ,我假设这是层中所有神经元的导数数组,然后将其放置到
    .execAndReturn(new rectived linear(in).derivative())
    ,而不是给定的参数?rectived linear接受一个截止变量。我猜想您可以这样做:.execAndReturn(新的修正线性(in,3))(或另一个数字)来改变斜率。这不是关于斜率,而是关于计算x=0的导数的方法(严格地说是未定义的)。我想我们可以称之为“研究”我会检查CudioDeLimk.java类——你可以复制它并在必要时操作它——我试着让它工作,但都是无用的。原来Java类是存根,实际的工作是用C++来完成的。导数计算,然后将它们放回
    数组中的
    ,并将此数组分配给
    dldz