Java dl4j lstm未成功

Java dl4j lstm未成功,java,deep-learning,dl4j,nd4j,Java,Deep Learning,Dl4j,Nd4j,我正试图将演示复制到页面的一半,链接如下: 本练习使用正弦函数在-1到1之间创建1000个数据点,并使用循环网络近似该函数 //get data ArrayList<DataSet> list = new ArrayList(); DataSet dss = DataSetFetch.getDataSet(Constants.DataTypes.math, "sine", 20, 500, 0, 0); DataSe

我正试图将演示复制到页面的一半,链接如下:

本练习使用正弦函数在-1到1之间创建1000个数据点,并使用循环网络近似该函数

      //get data
    ArrayList<DataSet> list = new ArrayList();
   
    DataSet dss = DataSetFetch.getDataSet(Constants.DataTypes.math, "sine", 20, 500, 0, 0);

    DataSet dsMain = dss.copy();

    if (!dss.isEmpty()){
        list.add(dss);
    }

   
    if (list.isEmpty()){

        return;
    }

    //format dataset
   list = DataSetFormatter.formatReccurnent(list, 0);

    //get network
    int history = 10;
    ArrayList<LayerDescription> ldlist = new ArrayList<>();
    LayerDescription l = new LayerDescription(1,history, Activation.RELU);
    ldlist.add(l);     
    LayerDescription ll = new LayerDescription(history, 1, Activation.IDENTITY, LossFunctions.LossFunction.MSE);
    ldlist.add(ll);

    ListenerDescription ld = new ListenerDescription(20, true, false);

    MultiLayerNetwork network = Reccurent.getLstm(ldlist, 123, WeightInit.XAVIER, new RmsProp(), ld);


    //train network
    final List<DataSet> lister = list.get(0).asList();
    DataSetIterator iter = new ListDataSetIterator<>(lister, 50);
    network.fit(iter, 50);
    network.rnnClearPreviousState();


    //test network
    ArrayList<DataSet> resList = new ArrayList<>();
    DataSet result = new DataSet();
    INDArray arr = Nd4j.zeros(lister.size()+1);     
    INDArray holder;

    if (list.size() > 1){
        //test on training data
        System.err.println("oops");

    }else{
        //test on original or scaled data
        for (int i = 0; i < lister.size(); i++) {

            holder = network.rnnTimeStep(lister.get(i).getFeatures());
            arr.putScalar(i,holder.getFloat(0));

        }
    }


    //add originaldata
    resList.add(dsMain);
    //result       
    result.setFeatures(dsMain.getFeatures());
  
    result.setLabels(arr);
    resList.add(result);

    //display
    DisplayData.plot2DScatterGraph(resList);
下面是我使用的代码。我将继续深入研究为什么这个函数不起作用,因为它现在对我来说没有多大意义,因为我可以很容易地使用前馈网络来近似这个函数

      //get data
    ArrayList<DataSet> list = new ArrayList();
   
    DataSet dss = DataSetFetch.getDataSet(Constants.DataTypes.math, "sine", 20, 500, 0, 0);

    DataSet dsMain = dss.copy();

    if (!dss.isEmpty()){
        list.add(dss);
    }

   
    if (list.isEmpty()){

        return;
    }

    //format dataset
   list = DataSetFormatter.formatReccurnent(list, 0);

    //get network
    int history = 10;
    ArrayList<LayerDescription> ldlist = new ArrayList<>();
    LayerDescription l = new LayerDescription(1,history, Activation.RELU);
    ldlist.add(l);     
    LayerDescription ll = new LayerDescription(history, 1, Activation.IDENTITY, LossFunctions.LossFunction.MSE);
    ldlist.add(ll);

    ListenerDescription ld = new ListenerDescription(20, true, false);

    MultiLayerNetwork network = Reccurent.getLstm(ldlist, 123, WeightInit.XAVIER, new RmsProp(), ld);


    //train network
    final List<DataSet> lister = list.get(0).asList();
    DataSetIterator iter = new ListDataSetIterator<>(lister, 50);
    network.fit(iter, 50);
    network.rnnClearPreviousState();


    //test network
    ArrayList<DataSet> resList = new ArrayList<>();
    DataSet result = new DataSet();
    INDArray arr = Nd4j.zeros(lister.size()+1);     
    INDArray holder;

    if (list.size() > 1){
        //test on training data
        System.err.println("oops");

    }else{
        //test on original or scaled data
        for (int i = 0; i < lister.size(); i++) {

            holder = network.rnnTimeStep(lister.get(i).getFeatures());
            arr.putScalar(i,holder.getFloat(0));

        }
    }


    //add originaldata
    resList.add(dsMain);
    //result       
    result.setFeatures(dsMain.getFeatures());
  
    result.setLabels(arr);
    resList.add(result);

    //display
    DisplayData.plot2DScatterGraph(resList);
//获取数据
ArrayList=新建ArrayList();
DataSet dss=DataSetFetch.getDataSet(Constants.DataTypes.math,“sine”,20500,0,0);
数据集dsMain=dss.copy();
如果(!dss.isEmpty()){
列表。添加(dss);
}
if(list.isEmpty()){
返回;
}
//格式数据集
列表=DataSetFormatter.FormatReccurent(列表,0);
//获取网络
int历史=10;
ArrayList ldlist=新的ArrayList();
LayerDescription l=新的LayerDescription(1,history,Activation.RELU);
添加(l);
LayerDescription ll=新的LayerDescription(历史记录,1,Activation.IDENTITY,LossFunctions.LossFunction.MSE);
ldlist.add(ll);
ListenerDescription ld=新ListenerDescription(20,真,假);
多层网络=Reccurent.getLstm(ldlist,123,WeightInit.XAVIER,new RmsProp(),ld);
//列车网络
final List lister=List.get(0.asList();
DataSetIterator iter=新列表DataSetIterator(列表器,50);
fit网络(国际热核实验堆,50);
network.rnncluperPreviousState();
//测试网络
ArrayList resList=新建ArrayList();
数据集结果=新数据集();
INDArray arr=Nd4j.zero(lister.size()+1);
阵列保持器;
如果(list.size()>1){
//训练数据测试
System.err.println(“oops”);
}否则{
//对原始数据或缩放数据进行测试
对于(int i=0;i
你能解释一下我需要一个十分之一隐藏和十分之一输出的lstm网络来近似正弦函数的代码吗

Im没有使用任何标准化,因为函数已经是-1:1,Im使用Y输入作为特征,以下Y输入作为标签来训练网络

您注意到我正在构建一个类,该类允许更容易地构建网络,并且我已经尝试对这个问题进行许多更改,但我已经厌倦了猜测

下面是一些我的结果的例子。蓝色是数据,红色是结果


如果看不到完整的代码,很难判断发生了什么。首先,我没有看到指定的RnnOutputLayer。您可以看看如何在DL4J中构建RNN。
如果您的RNN设置正确,这可能是一个调整问题。您可以找到有关调整的更多信息。对于更新程序,Adam可能比RMSProp更好。tanh对于输出层的激活来说可能是一个不错的选择,因为它的范围是(-1,1)。其他需要检查/调整的事情-学习率、历代次数、数据设置(比如你是否试图预测未来?)

这是你从疑惑为什么这不起作用到我的原始结果到底有多好的时候之一

我的失败是没有清楚地理解文档,也没有理解BPTT

使用前馈网络,每个迭代存储为一行,每个输入存储为一列。例如[dataset.size,network inputs.size]

然而,对于周期性输入,其相反,每行为输入,每列为激活lstm事件链状态所需的时间迭代。我的输入至少需要是[0,networkinputs.size,dataset.size],但也可以是[dataset.size,networkinputs.size,statelength.size]

在上一个示例中,我使用以下格式的数据训练网络[dataset.size,networkinputs.size,1]。因此,从我的低分辨率理解来看,lstm网络根本不应该工作,但至少以某种方式产生了一些东西

将数据集转换为列表可能也存在一些问题,因为我也改变了向网络提供数据的方式,但我认为大部分问题是数据结构问题

下面是我的新结果

非常感谢您的回答。我的代码很混乱,因为我正在构建一个自动的迭代网络生成器。我同意你的解决方案会带来更好的结果,但我相信这也应该奏效。我试图理解为什么这不起作用,所以我更倾向于策略而不是炼金术。