2019年4月30日火曜日

Matlab : Deep Learningの基礎

MatlabでDeep Learningをやるときの方法です。今回は献立を分類してみます。
基本的な流れは、Matlabの無料教材の下記を参照しています。
https://jp.mathworks.com/learn/tutorials/deep-learning-onramp.html

(1) プロジェクト設定
今回の作業フォルダを「deep01」としておきます。その中にLive Scriptファイル「deep01.mlx」を作成します。さらに学習用・テスト用画像フォルダ「image」を作っておきます。

(2) 画像データの用意
imageフォルダの中に、画像データを入れておきます。今回は12個の献立を分類するので、その献立毎12個のフォルダを作成して、フォルダ名は献立名にしておきます。
それぞれの献立フォルダの中に、それぞれ80枚程度の画像を入れておきます。
注意:jpegファイルでCMYK形式のファイルは、今回の読み込みでエラーになるので省いておきます。




(3) 画像の取り込み
今回はalexnetを転移学習して利用するため、入力の画像データが227 x 227 x 3になります。データストアを作成するときに、画像を加工しておく関数を用意します。

読み込みスクリプト

サブフォルダの読み込み、フォルダ名をラベル名にする、読み込み時にimageread関数を適用する、を指定しています。学習用ファイルとテスト用ファイルを4:1にしています。分類をいくつするかを、numClassesに入れています。
 ここまで実行するとWorkspaceに読み込まれます。


関数:numel 配列の要素数を返す
https://jp.mathworks.com/help/matlab/ref/numel.html

montage(food_ds)
としてみると、画像一覧が見られます。
時間がかかるコードは、必要に応じてセクションの区切りを入れておきます。

(4) 学習ネットワークの作成
今回は学習済みモデル「alexnet」を転移学習していきます。
alexnetを読み込み、レイヤーを見てみると25層あることがわかります。
第1層:Image Input では入力が、227x227x3であることがわかります。
第23層:1000個の出力クラスに紐づいています。
第25層:出力層です

ここでは、23層を全結合層:分類数12、25層を分類出力層と指定します。
fullyConnectedLayer :https://jp.mathworks.com/help/deeplearning/ref/nnet.cnn.layer.fullyconnectedlayer.html
classificationLayer:https://jp.mathworks.com/help/deeplearning/ref/classificationlayer.html


(5) 学習の実行
まず、学習アルゴリズムを指定します。
%学習アルゴリズム オプションの設定
options = trainingOptions('sgdm','InitialLearnRate', 0.001);
sgdm : ネットワーク学習ソルバー (sgdm, rmsprop, adamから選択) モーメンタム項付き確率的勾配降下法 (SGDM)
InitialLearnRate : 初期学習率を指定、今回は0.001(sgdmの初期学習率は0.01)
https://jp.mathworks.com/help/deeplearning/ref/trainingoptions.html

%学習の実行
[foodnet,info] = trainNetwork(trainImgs, layers, options);
時間がかかります。
精度が100%になっても、損失が下がるまで続きます。
学習損失のプロット:info の TrainingLoss フィールドに格納




(6) 学習済みネットワークを用いた分類
学習したネットワークを用いて、テストデータを分類してみます。
testpreds = classify(foodnet,testImgs);
 %関数 nnz と等号演算子 (==) を使用して、正しい分類と一致している予測された分類の数をカウント
numCorrect = nnz(foodpreds == testImgs.Labels)
精度を確認
foodCorrect = numCorrect / numel(foodpreds)
混同行列の作成
[foodconf, foodnames] = confusionmat(testImgs.Labels, foodpreds)

confusionchartの作成
confusionchart(testImgs.Labels, foodpreds)

ヒートマップの作成
heatmap(foodnames, foodnames, foodconf)
これをみると、全体で77%
ほうれん草のおひたし:OK(間違え:0)
味噌汁:ほぼOK(間違え:1)
カレー:肉じゃがと間違えられる(間違え:3)
コロッケ:ソーセージと唐揚げに間違えられる(間違え:3)
ソーセージ:精度低い(間違え:6)
ハンバーグ:コロッケに間違えられる(間違え:4)
パン:ぼちぼち(間違え:2)
唐揚げ:精度低い(間違え:8)
卵焼き:餃子と間違えられる(間違え:3)
肉じゃが:唐揚げと間違えられる(間違え:1)
餃子:精度低い(間違え:4)
魚の照り焼き:カレーに間違えられる(間違え:6)

ソーセージ、唐揚げ、魚の照り焼きに間違えが多い。唐揚げに間違えられるのも多い。

関数 nnz : 行列中で等しい要素数を返す
https://jp.mathworks.com/help/matlab/ref/nnz.html

confusionmat : 分類問題用の混同行列の計算
https://jp.mathworks.com/help/stats/confusionmat.html

ソースコード
https://github.com/smzn/deep01/blob/master/deep01.mlx



参考として
MABLABでは、JPEGでもCMYK形式の画像を受け付けていません。CMYK形式の画像を見つける方法としては、
ImageMagickをインストール
https://imagemagick.org/

環境変数の登録
例:C:\Program Files\ImageMagick-7.0.8-Q16

CMYKファイルのみカラーデータ表示させる
windows
magick identify -verbose *.jpg | ( findstr "Colorspace Image:" | findstr "CMYK Image:")


2019年2月8日金曜日

Weka

wekaの使い方メモです。

環境設定
wekaをダウンロードします。(このサイトを参考にした)
解凍したらweka-3-8-1-oracle-jvmをアプリケーションフォルダにダウンロードします。

構造学習できるか確認
このサイトを参考に、wakaのデータ形式であるarffファイルを作成して、構造学習します。
データを作成
arff形式のデータを作成します。
@RELATION データ名
@ATTRIBUTE 要素名 要素の型
 要素の型は…
 文字列、でてくるものが決まっている場合→{0,1}や{FEW,NSC,CLR,VV,SCT,BKN,OVC}
 数字→NUMERIC
@DATA
 この下にデータをカンマ区切りで列挙

データのインポートとヒストグラム作成
Applications→explorerを選択
左上のOpen fileからarffファイルをインポート
左下には、ヒストグラムが表示される。 Allを選択すれば、全て出てくる

構造学習
タブを、Classifyにして、分類方法はBayesNetを選択
分類方法のテキスト部分を選択すると、細かく設定できる
Startを押すと分析 出力結果についてはここを参考に
今回は97.2527 %の精度であった。
グラフ表示
色々分類方法、パラメータをいじる必要がある。



2019年1月17日木曜日

PythonとRの環境設定(AnacondaからJupyter Notebook)

Pythonでの実習にリクエストがあり、Rの講座もやるのでその環境設定です。
今回はUbuntu16.04にAnacondaを入れ、そこからjupyter notebookを利用していきます。

(1) Anacondaのインストール
Ubuntuにログインして、ユーザの追加をしておきます。
# useradd -m -s /bin/bash mizunolab001
# su - mizunolab001

Anacondaをダウンロード
$ wget https://repo.continuum.io/archive/Anaconda3-2018.12-Linux-x86_64.sh
インストール
$ bash Anaconda3-2018.12-Linux-x86_64.sh




 一度、ログアウトしてから再度ログインする。
バージョン確認
$ conda -V

(2) jupyter-notebookの設定
jupyter-notebookは外部からログインして利用することとします。外部からアクセスできるように設定します。
(i) コンフィグファイルの生成
$ jupyter-notebook --generate-config
$ vi .jupyter/jupyter_notebook_config.py
(ii) 外部アクセスの設定
現在localhostになっているので、0.0.0.0に変更します。
(iii) 起動時にブラウザが起動しないようにする
デフォルトだとjupyter-notebook起動時にブラウザが起動します。今回は外部からアクセスするので、ローカルでのブラウザ起動は必要ありません。Falseに変更します。
(iv) ポートの設定
必要に応じて利用するポート番号を変更します。デフォルトは8888で、既に利用して入れば連番で番号が増えていきます。


(v) パスワードの設定
デフォルトでは外部からアクセスするときにTokenが必要になり面倒です。パスワードを設定してアクセスできるようにします。一度viからquitします。
$ ipython3
In [1]: from notebook.auth import passwd
In [2]: passwd()
Out[2]: 'sha1:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
このsha1の値を利用します。
In [3]: quit()
$ vi .jupyter/jupyter_notebook_config.py
Tokenを書き込みます。
 jupyter-notebookを起動します。
$ jupyter-notebook
外部からブラウザでアクセスします。
http://サーバ名 or IPアドレス :8888
パスワードを求める画面が出てきます。
パスワードを入力するとログインできます。

(3)HelloJupyterを作成
動作確認のため、HelloJupyterを作成します。New から Python 3を選択します。
タイトル名をクリックして、タイトルを変更します。
最初の部分は見出しにします。CodeからMarkdownに変更します。見出しを入力しておきます。
Shift + Enterで実行されます。

次はpythonコードを書いておきます。
Shift + Enterで実行します。
もう一つ
MarkdownでTex数式を書いてみます。

サーバのコマンドを実行します。!をつけることでコマンドが実行されます。
画像のアップロードをします。ドラッグ&ドロップするだけでできます。



(4) Rの導入
ユーザベースでRを入れていきます。jupyter-notebookが実行されている場合は、Ctr+Cを2回で終了させます。
$ conda install -c r r-essentials
ちょっと時間がかかります。
jupyter-notebookを再度立ち上げます。
$ jupyter-notebook
今度はNewからRを選択します。
タイトルを「HelloJupyterR」としておきます。Rのロゴも右上に見えます。一つめは同じくMarkdownで見出しを書いておきます。
Rのコードを入れて、Shit+Enterで実行します
Rでの実行が確認できました。
参考
 https://www.anaconda.com/download/#linux
https://anaconda.org/chdoig/jupyter-and-conda-for-r/notebook
http://starpentagon.net/analytics/remote_jupyter_notebook/
 https://ymgsapo.com/remote-access-jupyter/
https://qiita.com/y__sama/items/5b62d31cb7e6ed50f02c