2016-09-15 6 views
1

canova/datavecを使用してCSVデータセットをロードしようとしていますが、その「慣用的な」方法を見つけることができません。私はフレームワークの進化があると感じるので少し苦労します。それは、私が関連するものとそうでないものを判断することを困難にします。スキーマを使用してdataVecでCSVファイルを解析する方法は?

object S extends App{ 
    val recordReader:RecordReader = new CSVRecordReader(0, ",") 
    recordReader.initialize(new FileSplit(new File("./src/main/resources/CSVdataSet.csv"))) 
    val iter:DataSetIterator = new RecordReaderDataSetIterator(recordReader, 100) 
    while(iter.hasNext){ 
    println(iter.next()) 
    } 
} 

私は、ヘッダの記述で始まるCSVファイルを持っているので、私の出力は例外

(java.lang.NumberFormatException: For input string: "iid":) 

である私が原因で、スキーマの例外を取得するので、私は/、スキーマビルダーに探し始めましたヘッダーだから私はこのようなスキーマを追加することを考えていた。私の視点から

val schema = new Schema.Builder() 
    .addColumnInteger("iid") 
    .build() 

、noobのビュー彼らはIrisAnalysisExample(https://github.com/deeplearning4j/dl4j-examples/blob/master/datavec-examples/src/main/java/org/datavec/transform/analysis/IrisAnalysis.java)からなどの火付け役にリンクするので、BasicDataVec-例は、完全に明確ではありません。 ファイルの内容が最初にJavaRDD(潜在的にストリーム)に読み込まれ、その後に処理されると想定します。スキーマはDataAnalysis以外は使用されません。だから、

、誰かが私は彼らの本(ディープ学習から理解して私は、ストリームまたはイテレータとして(最初の行にヘッダの記述を持つCSVファイルを解析する方法を理解

を行うことで助けることができる:A? 。私は、スキーマは、私が唯一のIID-列を持っているであろうことを指示するだろうと今思っ

object S extends App{ 
    val schema: Schema = new Schema.Builder() 
    .addColumnInteger("iid") 
    .build 
    val recordReader = new CSVRecordReader(0, ",") 
    val f = new File("./src/main/resources/CSVdataSet.csv") 
    recordReader.initialize(new FileSplit(f)) 
    val sparkConf:SparkConf = new SparkConf() 
    sparkConf.setMaster("local[*]"); 
    sparkConf.setAppName("DataVec Example"); 
    val sc:JavaSparkContext = new JavaSparkContext(sparkConf) 
    val lines = sc.textFile(f.getAbsolutePath); 
    val examples = lines.map(new StringToWritablesFunction(new CSVRecordReader())) 
    val process = new TransformProcess.Builder(schema).build() 
    val executor = new SparkTransformExecutor() 
    val processed = executor.execute(examples, process) 
    println(processed.first()) 
} 

、実務家はその火花が私はこのように私のコードに書き直し(スキーマが使用されている)データ変換のために必要とされる)に近づきます出力は次のとおりです。

答えて

1

私自身の質問に答えるのは悪い習慣と考えられるかもしれませんが、私は自分の質問をしばらくお待ちしています。他の人にとって有益かつ有益であった。

私はすべての機能に対応するスキーマ属性を作成できるデータでスキーマを使用する方法を理解しています。もともと私は、各ベクトルに200以上の特徴値を持つデータセットを扱いたいと思っていました。すべての200個のフィーチャに対して列属性を含む静的スキーマを宣言しなければならないため、使用することは実際的ではありませんでした。しかし、スキーマを作成するためのよりダイナミックな方法がありますが、まだそれを見つけていません。私はIris.csvデータセットで自分のコードをテストすることにしました。このファイルには行属性が含まれています。スキーマとして実装されるだろう

Id,SepalLengthCm,SepalWidthCm,PetalLengthCm,PetalWidthCm,Species 

は:

val schema: Schema = new Schema.Builder() 
    .addColumnInteger("Id") 
    .addColumnDouble("SepalLengthCm") 
    .addColumnDouble("SepalWidthCm") 
    .addColumnDouble("PetalLengthCm") 
    .addColumnDouble("PetalWidthCm") 
    .addColumnString("Species") 
    .build 

私は、スキーマを使用しての背後にある動機の一つは、データを変換できるようにすることであると感じています。したがって、私は変換操作を実行したいと思います。 TransformProcessは、データに対して実行する操作のシーケンスを定義します(DataVec付録Fページ405 DeepLearning:実践者のアプローチ)。

A TransformProcess is constructed by specifying two things: 
    • The Schema of the initial input data 
    • The set of operations we wish to execute Using DataVec 

私は、読み出したデータから列を削除することができるかどうかを確認することにしました。

val process = new TransformProcess.Builder(schema) 
    .removeColumns("Id") 
    .build() 

はこのように、私のコードはなった:

import org.datavec.api.records.reader.impl.csv.CSVRecordReader 
import org.datavec.api.transform.{DataAction, TransformProcess} 
import org.datavec.api.transform.schema.Schema 
import java.io.File 
import org.apache.spark.api.java.JavaSparkContext 
import org.datavec.spark.transform.misc.StringToWritablesFunction 
import org.apache.spark.SparkConf 
import org.datavec.api.split.FileSplit 
import org.datavec.spark.transform.SparkTransformExecutor 

object S extends App{ 
    val schema: Schema = new Schema.Builder() 
     .addColumnInteger("Id") 
     .addColumnDouble("SepalLengthCm") 
     .addColumnDouble("SepalWidthCm") 
     .addColumnDouble("PetalLengthCm") 
     .addColumnDouble("PetalWidthCm") 
     .addColumnString("Species") 
     .build 

    val recordReader = new CSVRecordReader(0, ",") 
    val f = new File("./src/main/resources/Iris.csv") 
    recordReader.initialize(new FileSplit(f)) 
    println(recordReader.next()) 
    val sparkConf:SparkConf = new SparkConf() 
    sparkConf.setMaster("local[*]"); 
    sparkConf.setAppName("DataVec Example"); 
    val sc:JavaSparkContext = new JavaSparkContext(sparkConf) 
    val lines = sc.textFile(f.getAbsolutePath); 
    val examples = lines.map(new StringToWritablesFunction(new CSVRecordReader())) 
    val process = new TransformProcess.Builder(schema) 
     .removeColumns("Id") 
     .build() 
    val executor = new SparkTransformExecutor() 
    val processed = executor.execute(examples, process) 
    println(processed.first()) 
} 

最初の版画:

[Id, SepalLengthCm, SepalWidthCm, PetalLengthCm, PetalWidthCm, Species] 

2枚目のプリント

[SepalLengthCm, SepalWidthCm, PetalLengthCm, PetalWidthCm, Species] 

編集:私は、私は私のlibraryDependencyとして 「org.deeplearning4j」%「deeplearning4j・コア」%「0.6.0」とのクラッシュを取得していることがわかり

古い依存関係と、それは

に動作しながら、

"org.deeplearning4j" % "deeplearning4jコア" % "0.0.3.2.7"

libraryDependencies ++= Seq(
    "org.datavec" % "datavec-spark_2.11" % "0.5.0", 
    "org.datavec" % "datavec-api" % "0.5.0", 
    "org.deeplearning4j" % "deeplearning4j-core" % "0.0.3.2.7" 
    //"org.deeplearning4j" % "deeplearning4j-core" % "0.6.0" 
) 
関連する問題