SE_BOKUのまとめノート的ブログ

SE_BOKUが知ってること・勉強したこと・考えたことetc

オリジナルテキストデータで新規プロジェクト追加/Neural Network Consoleの使い方

今回、オリジナルのテキストデータ(CSV)を使って新規データ・セットを作成し、それを使って学習する新規プロジェクトを作ってみます。 

f:id:arakan_no_boku:20190326212937j:plain

オリジナル画像データの場合はこちらです。

arakan-pgm-ai.hatenablog.com

2017/11/30追加

>この記事の説明は、Version1.00当時の画面を使っています。

>Version1.10でアイコンのデザイン等が少し変更になってます。

>ですが、操作に影響するほどの変更ではないと判断して、そのままにしてます。 

 

学習・評価に使うCSVデータの作成

 

とりあえず、EXCELで適当なデータを作って、CSVで保存します。 

まず、元にするデータはこんな感じを使います。

f:id:arakan_no_boku:20170821211010j:plain

 

かなり適当なデータです。

身長・体重・腹囲をインプットにして、標準かデブかを出力にするものです。

(ほぼ、意味はないですが・・笑) 

なお、意味ありげなヘダー項目名になってますが、このヘダー名は使いません。 

これは、単なる元データなので、このままでは使えません。

ここから加工して、ニューラルネットワークコンソールで使えるフォーマットにしてやる必要があります。

ューラルネットワークコンソールで使えるフォーマットにする方法は2通りあります。

  • データセットCSVとデータCSVを分けて作る(方法1)
  • わけないで1ファイルで作成する方法(方法2)

です。

方法2の方が簡単ですが、まずは、方法1から説明します。 

 

方法1:データセットCSVとデータCSVの2種類を作る

 

まず、この元データから、データ・セット用CSVと、データCSVの2種類を作る方法です。   

 

データの値は「おおむね-1.0~1.0の間」になるよう加工する

 

データは数値である必要があります。

かつ、どんな数値でも良いというわけではありません。

値は「おおむね-1.0~1.0の間」になるように加工しておかないとだめみたいです。 

マニュアルではこうなっていますから。

変数が画像以外のベクトルもしくは行列である場合、各セルにはデータCSVファイルのファイル名を入力します。

データCSVファイルはデータセットCSVファイルとは別にデータ毎に用意するCSVファイルです。

データCSVファイルはヘッダを持たず、数値セルのみで構成されます。

Neural Network ConsoleはCSVファイルを要素数が (行数,列数)である配列として扱います。

実数値はおおむね-1.0~1.0の間に収まるように事前に加工しておく必要があります。

 

だから上記のデータは、まず、以下のように1000で割った数字に加工する必要があります。

f:id:arakan_no_boku:20170822005227j:plain

 

さらに、左側の1000で割った数字の部分だけを残して、上記の例でいくとD列より右はズバッと消してしまいます。

それで、ABCの3列だけのデータにするわけです。

(イメージです)

f:id:arakan_no_boku:20190128010926j:plain

 

1行1ファイルに分割してやる

 

今度は、上記の1シートで複数行にわたってできているデータを「1行1ファイル」に分割してフォルダに保存してやる必要があります。

f:id:arakan_no_boku:20190127232836j:plain

これは手作業でやってもいいですが、かなり面倒です。

この一連の作業は手作業でしても良いですが、少々面倒です。

自分は、EXCELVBAマクロを使ってやってます。

この記事の最後の方にそのVBAソースをのせてます。

 

データセットCSVのフォーマット

 

データ・セット用CSVは、例えばこんな感じです。

A列に、1行1ファイルで保存されたファイルのパスを指定しています。

B列には、そのファイルの内容に対する正解ラベルを指定します。

今回は、ノーマルが0、デブが1としてみました。 

f:id:arakan_no_boku:20190127232913j:plain

ファイルのパスは相対フォルダにした方が良いです。

このデータセットCSVを置いたフォルダにサブフォルダを置き、そのサブフォルダの下に分割したCSVをおくわけです。

絶対パスでもうごきますが、フォルダ変更とかしたときに、かなり面倒くさいです。

なお。
1行目はヘッダ行です。

このヘッダの名前にはルールがあります。

 

ヘダーのラベル名は規則に従う

 

ヘダーのフォーマットは、「変数名[__次元インデックス][:ラベル名]」なんですが、今回はテキストデータなので次元インデックスは不要です。 

変数名は、入力側が「x」、出力側が「y」を、固定で使うのが推奨です。 

なので、ラベル名を適当につけて、「x:data」「y:label」としています。 

 

さらに学習用と評価用の2セットにわける

 

これをさらに、学習用と評価用の2種類のセットを作らないといけません。 

今回は、学習用で1500件、評価用で500件作りました。

 

方法2:ひとつのCSVにデータと正解ラベルを書く方法

 

ひとつのファイルでデータファイルとする方法です。

データを1行1ファイルに分割する必要がないので、かなり手軽です。

ただ。

こちらでも、「-1.0から1.0の範囲」で数字を収める必要があるのは一緒です。

ですから。

こちらは、例えばこういう元データの場合

f:id:arakan_no_boku:20180310122046j:plain

 

別シートに計算式を書いて、元データを1000で割って<例えば、=ROUND(Sheet2!A2/1000,3)みたいな式>、y:labelの部分はIF文等を使って数字に変換します<例えば、=IF(Sheet2!D2="fat","1","0") みたいな式でfatを1にして、normalを0にするとか・・> 

そうして、こんな感じのデータにしておく必要があります。

f:id:arakan_no_boku:20180310122930j:plain

 

ヘダーの名前付けルールに注意が必要

 

方法2の最大のポイントはヘダーの付け方です。 

方法1とは、規則がまったく異なるので注意してください。

まず、ラベルは「y」です。

データの部分は「x」にして、それぞれに「__0」「__1」「__2」と連番をつけます。 

この「__」の部分は、アンダーバー「_」2つであることに注意してください。 

x_1のように、アンダーバー「_」ひとつにすると、学習時にエラーになります。

「xが見つからない」みたいなエラーメッセージなので、原因がヘダー名の付け間違いだと気づくのに結構苦労します・・知らないと。 

 

学習用と評価用の2ファイルにわけるのは同じ

 

これを学習用と評価用の2CSVファイルにわけて保存すれば、OKです。

学習用と評価用は、同じデータがダブってはいらないようにしてください。

ダブっていてもエラーにはなりませんが「学習して、特徴をつかんで、未知のデータを推論・評価する」という目的にはそぐわないものになりますので。

こちらの方法では、ファイルはひとつなので、このファイルがデータセットCSVになります。

 

方法1と方法2に共通する文字コードの件

半角英数字しかファイルにないので、文字コードはあまり気にする必要はありません。

ただ、最近はUTF-8がデフォルトである場合が多いので、EXCELCSVファイルを保存した時のSJISが嫌だという場合があります。

自分もそうです。

なので、自分は作ったデータセットUTF-8に変換したり、方法1の場合だとUTF-8でファイルを自動作成するVBAマクロを使ったりしてます。

このへんをここで書くと、ごちゃごちゃするので、最後にまとめてのせときます。

 

オリジナルテキストデータをニューラルネットワークコンソールで使う

 

ニューラルネットワークコンソールを起動します。

 

DATASETタブに追加

 

DATASETタブを開き、OpenDatasetを押します。

f:id:arakan_no_boku:20170821211524j:plain

 

ファイル選択ダイアログが開きます。 

さきほど保存したデータ・セット用CSVファイルを選択して開きます。

(方法1・方法2共)

f:id:arakan_no_boku:20170821213109j:plain

 

データ・セット一覧に取り込まれました。

f:id:arakan_no_boku:20170821214446j:plain

 

今は、learn01.csv・・つまり、学習用のCSVを取り込みました。 

続けて同じ要領で、学習用のCSVを取り込んでおきます。 

 

 新規プロジェクトを作成 

 

 PROJECTタブを表示させて、「New Project」を選択します。

f:id:arakan_no_boku:20170821215941j:plain

 

新規プロジェクト画面が開きます。  

 

プロジェクトのデータセットの差し替え

 

初期データとして、MNISTのデータがセットされているので、右上のDATASETボタンを押して、データ・セットの入れ替えをします。

f:id:arakan_no_boku:20170821221347j:plain

  

デフォルトで、DATASETで「Training」と「Validation」が用意されています。

f:id:arakan_no_boku:20171105184506j:plain

 この両方に、先程追加したCSVデータを紐付けます。

 

「Training」の方を選択して、右上の「Open Dataset」ボタン(下図の赤丸部分)を押して、一覧を表示して、さっき追加した学習用のファイル(今回の例だと「learn01.csv」)を選択します。

f:id:arakan_no_boku:20171105185220j:plain

 

上図左側の赤四角の部分で、ちゃんと指定したファイル名と件数が表示されていることを確認します。 

あわせて、上図右側の赤四角の部分で「Image Normalization」のチェックを忘れずにはずします。  

 

同じようにして、「Validation」にもう一つの方に500件の方のデータ(今回の例では「forward01.csv」)を紐付けます。

f:id:arakan_no_boku:20171105185528j:plain

 

チェックするポイントは同じです。

 

データセットの矛盾チェック

 

追加したデータセットの整合性を確認する場合は「Check Consistency」を使います。

自信があったら、別にしなくてもいいですけどね。

データセットの適当な場所で右クリックメニューを表示して、「Check Consistency」を選択します。

f:id:arakan_no_boku:20190301223939j:plain

そうすると、しばらく処理が動いて、簡単なレポートが表示されます。

最後の行に「No inconsistency were found.」(矛盾は見つかりませんでした。)と表示されればOKです。

  

EDITタブでの作業

 

EDITタブを開きます。 

ここに、ネットワークモデルを作っていきます。

左側のレイヤーの中から、以下のレイヤーを順番通りに選択して追加(ドラッグ&ドロップかダブルクリック)します。

  1. input
  2. Affine
  3. ReLU
  4. BinalyCrossEntropy

今回はデブか否かの2値なので、BinaryCrossEntropyを使ってます。

3値以上になったら、そこはSoftmaxCrossEntropyにする必要があります。 

f:id:arakan_no_boku:20170822230903j:plain

 

あとは、上から順番に「選択→Shiftを押しながら下のレイヤーをクリック」を繰り返して、接続していきます。

f:id:arakan_no_boku:20170822231021j:plain

 

INPUTレイヤーのsizeプロパティは方法1と方法2で異なるので注意

 

上記までは方法1と方法2で共通なのですが、INPUTレイヤーのsizeプロパティの設定値の設定ルールだけは異なります。

 

方法1でデータセットを作った場合

最後に、inputレイヤーを選択して、左下に表示されるプロパティで、sizeを「1,3]と入力します。

f:id:arakan_no_boku:20170822231137j:plain

 

これはデータ用CSVの「行数、列数」です。 

今回は、1ファイルが「1行3列」なので、1,3です。 

データセットCSVをプレビューすると、そこに小さく、この数字がでているので、それを参考にするのが確実です。

f:id:arakan_no_boku:20171105200535j:plain

 

方法2でデータセットを作った場合

 

方法2の場合ははInputのサイズには「列数」のみを指定します。

今回の場合、列は「x__1」「x__2」「x__3」「y」の4つがありますが、「y」はラベルなのでいりません。

なので、「x__1」「x__2」「x__3」の3を指定します。

f:id:arakan_no_boku:20180310124900j:plain

なお。

方法1の場合だと、データセットタブの数字をうつせばよかったのですが、方法2の場合だとDATASETタブでは以下のように「4」と表示されてます。

注意してください。

f:id:arakan_no_boku:20180310125420j:plain

 

ここからは、方法1と方法2で共通

 

あと、Datasetが、x であることを確認します。 

次に、Affineのレイヤーを選択して、outshapeを、inputにあわせて「1」にしておきます。

f:id:arakan_no_boku:20170826013324j:plain

 デフォルトが100とかになってますから、必ず修正します。 

これで、プロジェクトの設定は終了です。 

まずは上書き保存をしておきましょう。

f:id:arakan_no_boku:20170822231647j:plain

 

作成したプロジェクトで学習と評価

 

データの設定とかミスをしてたら、ここでエラーで停止しますので、エラーメッセージを見てなおすしかないです。 

学習ボタンを押します。

f:id:arakan_no_boku:20171105203711j:plain

 

なんとか、エラーなく終わりました。

f:id:arakan_no_boku:20171105203735j:plain

 

次に評価をやってみます。

f:id:arakan_no_boku:20171105203845j:plain

 

Accuracy(正確さ)が94.98%でした。

f:id:arakan_no_boku:20171105204040j:plain

 

とりあえず、CSVデータで独自のデータ・セットを作って、新規にプロジェクトを作る手順は、こんな感じでいけるみたいです。

ではでは。

 

おまけ:文字コードUTF-8にする場合  

 

最初に、方法1の場合専用のEXCELVBAマクロを書いてます。

方法1の場合、データセットCSVを作成するのが、若干面倒なので自動化したもので、ついでにUTF-8 BOM無しへの変換を行ってます。

(BOM付きはエラーになって、ニューラルネットワークコンソールで使えません)

 

方法1専用EXCELVBA

1つの「forward01」という名前のシートに複数行あるデータを、1行1ファイルに分割してCSVファイルに保存する処理です。 

やってることは、A2セルからデータがある最下行まで、1行ずつ、3つのセルの値をカンマでつないで、1ファイルずつ出力しているだけです。 

今回のデータ「2行目からデータ行で、かつ、データが3列(A,B,C)にある」を前提に固定で書いているので、違うデータの場合は修正する必要があります。

EXCELでただ書き出すと、BOM付きになってしまうので、途中でBOMコードを省く処理がはいっているのでごちゃごちゃしてますが・・。

Sub dataCreate()
     Dim wkst
     Dim obj As Object
     wkst = "forward01"
     bottom = Range("A2").End(xlDown).Row
     For r = 1 To bottom - 1
           out = Worksheets(wkst).Cells(r + 1, 1).Value & "," & Worksheets(wkst).Cells(r + 1, 2).Value & "," & Worksheets(wkst).Cells(r + 1, 3).Value
           datFile = ActiveWorkbook.Path & "\" & r & ".csv"
           Set obj = CreateObject("ADODB.Stream")
           obj.Charset = "UTF-8"
           obj.Open
           obj.WriteText (out)
           obj.Position = 0
           obj.Position = 3 
           Set w = CreateObject("ADODB.Stream")
            w.Type = adTypeBinary
            w.Open
            obj.copyTo w
           obj.Close

            w.SaveToFile datFile, 2
             w.Close
       Next
End Sub

 データ・セット用ファイル名は、学習用を「learn01.csv」、評価用を「forward01.csv」にとりあえずしときました。 

 

方法1・方法2共通:テキストエディタUTF-8にする

 

Windows付属のメモ帳は絶対使わないでください。

メモ帳でUTF-8で保存すると、強制的にBOM付きになります。

そうすると、ニューラルネットワークコンソールでは使えないデータになります。

 

保存したCSVファイルを、Sakuraエディタなどで開いて、文字コードをUTF8のBOM無しに変換して、上書き保存します。

f:id:arakan_no_boku:20180310123509j:plain