【问题标题】:LSTM and Dense layers preprocessingLSTM 和密集层预处理
【发布时间】:2020-10-08 11:26:48
【问题描述】:

我正在尝试使用 LSTM 和 Dense 层构建 NN。

我的网是:

 MultiLayerConfiguration conf = new NeuralNetConfiguration.Builder()
            .seed(123)    
            .weightInit(WeightInit.XAVIER)
            .updater(new Adam(0.1))
            .list()
            .layer(0,  new LSTM.Builder().activation(Activation.TANH).nIn(numInputs).nOut(120).build())
            .layer(1, new DenseLayer.Builder().activation(Activation.RELU).nIn(120).nOut(1000).build())
            .layer(2, new DenseLayer.Builder().activation(Activation.RELU).nIn(1000).nOut(20).build())
            .layer(new OutputLayer.Builder(LossFunction.NEGATIVELOGLIKELIHOOD).activation(Activation.SOFTMAX).nIn(20).nOut(numOutputs).build())
            .inputPreProcessor(1, new RnnToFeedForwardPreProcessor())
            .build();

我是这样读取数据的:

 SequenceRecordReader reader = new CSVSequenceRecordReader(0, ",");
        reader.initialize(new NumberedFileInputSplit("TRAIN_%d.csv", 1, 17476));
        DataSetIterator trainIter = new SequenceRecordReaderDataSetIterator(reader, miniBatchSize, 6, 7, false);
        allData = trainIter.next();


        //Load the test/evaluation data:
        SequenceRecordReader testReader = new CSVSequenceRecordReader(0, ",");
        testReader.initialize(new NumberedFileInputSplit("TEST_%d.csv", 1, 8498));
        DataSetIterator testIter = new SequenceRecordReaderDataSetIterator(testReader, miniBatchSize, 6, 7, false);
        allData = testIter.next();

因此,当它进入网络时,它的形状为 [batch, features, timestamp] = [32,7,60] 我可以用这样的特殊错误来定义它:

Received input with size(1) = 7 (input array shape = [32, 7, 60]); input.size(1) must match layer nIn size (nIn = 9)

所以它通常会上网。在第一个 LSTM 层之后,它必须重塑为 2-D 并接下来抛出 Dense 层。

但我有下一个问题:

标签和 preOutput 必须具有相同的形状:得到形状 [32, 6, 60] 与 [1920, 6]

在进入 Dense 层之前它没有重塑,我错过了 1 个特征(现在形状是 32, 6 , 60 而不是 32, 7, 60),那为什么???

【问题讨论】:

  • 在您的第 0 层中,您有一个名为 numInputs 的变量。 numInputs 的值是多少?如果 numInputs = 9 那么你的 TRAIN_%d.csv 文件必须有 9 个特征

标签: java lstm recurrent-neural-network layer deeplearning4j


【解决方案1】:

如果可能的话,您会想要使用 setInputType,它会为您设置预处理器。

这是一个 lstm 到密集的示例配置:

 MultiLayerConfiguration conf1 = new NeuralNetConfiguration.Builder()
                    .trainingWorkspaceMode(wsm)
                    .inferenceWorkspaceMode(wsm)
                    .seed(12345)
                    .updater(new Adam(0.1))
                    .list()
                    .layer(new LSTM.Builder().nIn(3).nOut(3).dataFormat(rnnDataFormat).build())
                    .layer(new DenseLayer.Builder().nIn(3).nOut(3).activation(Activation.TANH).build())
                    .layer(new RnnOutputLayer.Builder().nIn(3).nOut(3).activation(Activation.SOFTMAX).dataFormat(rnnDataFormat)
                            .lossFunction(LossFunctions.LossFunction.MCXENT).build())
                    .setInputType(InputType.recurrent(3, rnnDataFormat))
                    .build();

RNN 格式为:

import org.deeplearning4j.nn.conf.RNNFormat;

这是一个枚举,指定您的数据格式应该是什么(通道最后或第一) 来自 javadoc:

/**
 * NCW = "channels first" - arrays of shape [minibatch, channels, width]<br>
 * NWC = "channels last" - arrays of shape [minibatch, width, channels]<br>
 * "width" corresponds to sequence length and "channels" corresponds to sequence item size.
 */

来源:https://github.com/eclipse/deeplearning4j/blob/1930d9990810db6214829c716c2ae7eb7f59cd13/deeplearning4j/deeplearning4j-nn/src/main/java/org/deeplearning4j/nn/conf/RNNFormat.java#L21

我们的测试中有更多内容:https://github.com/eclipse/deeplearning4j/blob/1930d9990810db6214829c716c2ae7eb7f59cd13/deeplearning4j/deeplearning4j-core/src/test/java/org/deeplearning4j/nn/layers/recurrent/TestTimeDistributed.java#L58

【讨论】:

    猜你喜欢
    • 2018-02-22
    • 2020-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-31
    • 1970-01-01
    • 2019-02-18
    • 1970-01-01
    相关资源
    最近更新 更多