【问题标题】:Error: Labels and preOutput must have equal shapes错误:标签和 preOutput 必须具有相同的形状
【发布时间】:2020-04-14 07:05:40
【问题描述】:

我正在使用 deeplearning4j,但我不断收到此错误。总的来说,我对 dl4j 和 AI 非常陌生。给定前 10 个值,我试图预测下一个值。我正在使用 LSTM。我很确定我可能不得不使用掩蔽,但我一无所知,而且 dl4j 社区有点小。这是非常乏味的。这是我的代码: // 我之前对我的数据进行了标准化,因为它的范围大约是 3500-6500

 DataSetIterator trainData = new SequenceRecordReaderDataSetIterator(trainFeatures, trainLabels, miniBatchSize,
            1, true, SequenceRecordReaderDataSetIterator.AlignmentMode.EQUAL_LENGTH);
 DataSetIterator testData = new SequenceRecordReaderDataSetIterator(testFeatures, testLabels, miniBatchSize,
            1, true, SequenceRecordReaderDataSetIterator.AlignmentMode.EQUAL_LENGTH);

 MultiLayerConfiguration conf = new NeuralNetConfiguration.Builder()
            .seed(123)
            .weightInit(WeightInit.XAVIER)
            .updater(new Adam())
            .list()
            .layer(new LSTM.Builder().activation(Activation.TANH).nIn(1).nOut(10).build())
            .layer(new OutputLayer.Builder(LossFunctions.LossFunction.MSE)
                .activation(Activation.RELU).nIn(10).nOut(1).build())
            .build();

        MultiLayerNetwork net = new MultiLayerNetwork(conf);
        net.init();

这是错误:

Caused by: java.lang.IllegalArgumentException: Labels and preOutput must have equal shapes: got shapes [5, 1, 1] vs [50, 1]

我的数据由单列时间序列 CSV 文件组成,每个文件包含 10 个序列。标签是代表下一个值的单个值。

这是我的 trainFeatures 和 trainLabels 声明

SequenceRecordReader trainFeatures = new CSVSequenceRecordReader(numLinesToSkip, delimiter);
        trainFeatures.initialize(new NumberedFileInputSplit(testAndTrainFeatures + "%d.csv",0,800));
        SequenceRecordReader trainLabels = new CSVSequenceRecordReader(numLinesToSkip, delimiter);
        trainLabels.initialize(new NumberedFileInputSplit(testAndTrainLabels + "%d.csv", 0, 800));

【问题讨论】:

  • 理想情况下,您可以在其社区网站上询问有关 dl4j 的问题,因为它比 stackoverflow 允许的来回更好:community.konduit.ai 无论如何,您可以添加显示您如何定义的代码@ 987654325@ 和trainLabels?您能否添加.setInputType(InputType.Recurrent(1)) 配置选项,以便设置所有必要的整形预处理器(在这种情况下您也不需要nIn 配置)?
  • @PaulDubs 嘿,我添加了声明。我还添加了 .setInputType(...) 并且我仍然收到相同的错误:/

标签: lstm deeplearning4j


【解决方案1】:

您面临的问题是您希望您的配置意味着您从 LSTM 获得的最后一个时间步长是密集层的输入。相反,LSTM 的所有输出都被合并并馈送到密集层。

要解决这个问题,您应该将 LSTM 层包裹在 LastTimestep(...) 中,这样只会发生您期望的事情。

但是,您会遇到第二个问题,那就是您的标签被视为序列,因为这是您加载它们的方式。为了使您的标签不连续,您必须在数据集迭代器上应用预处理器,如下所示:

trainData.setPreProcessor(new LabelLastTimeStepPreProcessor());

如果在应用这些更改后仍有问题,请随时在社区论坛上提问,您可能会更快得到答案。

【讨论】:

    猜你喜欢
    • 2021-02-02
    • 2018-06-29
    • 1970-01-01
    • 2021-10-22
    • 2019-05-22
    • 2021-07-19
    • 2021-07-03
    • 2021-03-23
    • 2020-09-30
    相关资源
    最近更新 更多