【问题标题】:Storing Vehicle Id in Anomaly Detection在异常检测中存储车辆 ID
【发布时间】:2018-07-09 13:53:09
【问题描述】:

我使用 Deeplearning4j 测试了异常检测,一切正常,除了我无法在训练时保留 VehicleID。在这种情况下,最好的方法是什么?

请看下面的 sn-p 代码,SparkTransformExecutor 返回一个 RDD 并且 InMemorySequence 正在获取列表时,我从 RDD 中收集列表索引不保证。

  val records:JavaRDD[util.List[util.List[Writable]]] = SparkTransformExecutor
  .executeToSequence(.....)
   val split = records.randomSplit(Array[Double](0.7,0.3))
  val testSequences = split(1)

 //in memory  sequence reader
  val testRR = new InMemorySequenceRecordReader(testSequences.collect().toList)

   val testIter = new RecordReaderMultiDataSetIterator.Builder(batchSize)
           .addSequenceReader("records", trainRR)
           .addInput("records")
          .build()

【问题讨论】:

  • 我通过编写 CustomSequenceRecordReader 和 CustomMetaData 解决了这个问题,现在我的输入数据中的一列称为元数据

标签: deeplearning4j


【解决方案1】:

通常,您通过数据集中的索引来跟踪训练示例。在训练的同时跟踪数据集是车辆的哪个索引在数据集中。有很多方法可以做到这一点。

在 dl4j 中,我们通常保留原始数据并使用记录阅读器 + 转换过程来处理训练数据。如果您在原始数据上使用记录阅读器(为您的数据集选择一个,它可以是 csv 甚至是视频)并使用如下所示的记录阅读器数据集迭代器: ```java RecordReader recordReader = new CSVRecordReader(0, ','); recordReader.initialize(new FileSplit(new ClassPathResource("iris.txt").getFile())); int labelIndex = 4; int numClasses = 3; int batchSize = 150;

    RecordReaderDataSetIterator iterator = new RecordReaderDataSetIterator(recordReader,batchSize,labelIndex,numClasses);
    iterator.setCollectMetaData(true);  //Instruct the iterator to collect metadata, and store it in the DataSet objects
    DataSet allData = iterator.next();


    DataSet trainingData = testAndTrain.getTrain();
    DataSet testData = testAndTrain.getTest();

```

(此处为完整代码): https://github.com/deeplearning4j/dl4j-examples/blob/master/dl4j-examples/src/main/java/org/deeplearning4j/examples/dataexamples/CSVExampleEvaluationMetaData.java

除此之外,您还可以使用 TransformProcess:

```

   //Let's define the schema of the data that we want to import
    //The order in which columns are defined here should match the 
    //order in which they appear in the input data
    Schema inputDataSchema = new Schema.Builder()
        //We can define a single column
        .addColumnString("DateTimeString")

.... 。建造(); //在每一步,我们通过我们在
中给出的名称来识别列 输入数据架构,上面

TransformProcess tp = new TransformProcess.Builder(inputDataSchema)
//your transforms go here

    .build();

```

下面的完整示例:

https://github.com/deeplearning4j/dl4j-examples/blob/6967b2ec2d51b0d19b5d6437763a2936ca922a0a/datavec-examples/src/main/java/org/datavec/transform/basic/BasicDataVecExampleLocal.java

如果您使用这些东西,您可以自定义保持数据不变,但拥有完整的数据管道。有很多方法可以做到这一点,只要记住你从车辆 id 开始,它不必消失。

【讨论】:

  • 在使用 Apache Spark 处理分布式数据集时,应避免使用基于索引的方法。从您的示例中仍然不清楚,当数据跨分区分布时,如何传播 VehicleID。看来,我在这里遗漏了明显的东西。
  • 我不确定 spark 或分布式在这里的相关性。这里讨论的是本地数据集。如果你要做火花,你仍然会做索引批次。并非所有数据集都是 csv。许多是二元张量。这些通常是预先创建的。 Spark 无法处理这类数据集。
  • 嗨,亚当,我在问题部分粘贴了代码的 sn-p 供您参考。
  • 我可以有选择地在 RecordReaderMultiDataSetIterator 中指定我的数据列,我找不到在此指定 MetaData 的方法。我可以在 preProcessor 中设置元数据还是有其他更简单的方法?
  • 我通过编写自定义 SequenceRecordReader 和自定义 MetaData 类解决了我的问题,现在我可以将所需的属性设置为元数据。
猜你喜欢
  • 1970-01-01
  • 2020-05-08
  • 1970-01-01
  • 1970-01-01
  • 2023-02-16
  • 2014-07-03
  • 2022-07-05
  • 1970-01-01
  • 2021-07-12
相关资源
最近更新 更多