【キカガク流】人工知能・機械学習 脱ブラックボックス講座 – 初級編 -を受講した

Udemyの動画による講座は、文字による説明よりも頭に入ってき易いので好きなのですが、たまにやっているキャンペーン期間中に勢いで

 

【キカガク流】人工知能・機械学習 脱ブラックボックス講座 – 初級編 –

なる講座を購入しました。

タイトルこそ、今どきウケの良い感じですが、前半は微分や偏微分などの数学的な説明で、後半はPythonの基礎(四則演算や条件分岐など)から、回帰をPythonで解くような内容です。

 

なので、内容に素直に私がタイトルを付けるなら、

 

最小二乗法を一から解いて、Pythonで実装してみよう!

 

という感じの内容です。

最小二乗法については、さんざんやって来たので、前半はあまり得る物が無かったのですが、Pythonに関しては、私はド素人なので、そこは参考になりました。

機械学習を学習する上では、二乗誤差の偏微分やPythonを使ったプログラムは、ほぼ、必須なので、必要な知識ではあるのですが、この講座の中で機械学習についての説明に相当する部分は単回帰分析の部分だけでしょうか。

 

この内容で、一番気になったポイントとして、最後の部分で入力データを部屋の広さ(平米数)として、出力を家賃を求める単回帰分析の演習問題があったのですが、部屋の広さ(平米数)を入力するとマイナスの家賃が出力されてしまい、これは外挿による推論となってしまうため、外挿とならないように、学習用のデータを増やしましょう!という説明だったのですが、半分あっている気もしますが、一番の問題は、 部屋の広さ⇔家賃 の関係を一次式で近似しちゃってるのが問題なのでは?とも思ったりもしました。

 

私が散々、最小二乗法でモデル式を作り、偏微分を解きながら、近似式を求めていた時は、誤差関数に変な特性、傾向が残らないか?(2次関数っぽい変化とか。。)や、入力データにあきらかな誤差データは含まれないか?など、気にしながら近似していましたが、機械学習とかになった瞬間、その辺の事が語られる事が少ないような。。

 

とは言いながらも、ちゃんと受講しましたよ。

やっぱり動画の講座はいいですね。

はじめてDeep Learningを勉強するのに役に立った情報

2年ぐらい前?からDeep Learningの勉強を始めてはいたのですが、仕事としてDeep Learningをする訳でも無く、個人で細々と勉強をしていたのですが、最近は仕事になり始めたので、そろそろ本気を出したいと思う、今日この頃。

 

初めは、この絵↓が何なのか?も分からない状態で、周りに聞ける人もいない状態から勉強を始めた時に役に立ったと思う情報を紹介したいと思います。

 

ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装

 

まずは、ド定番の「ゼロから作るDeep Learning」

Deep Learningの勉強を始めた人は、ほとんど持っているんじゃないかな?と思われるこの本。

私にとっては少し難しく感じる部分もあったのですが、とりあえず最初から最後まで読んでみて、また、あとで必要な部分を読み返すような事をしていました。

 

ソニーのNeural Network Console

サイトはこちら

これはGUIだけでニューラルネットワークを構築でき、学習~推論までPythonなどのプログラムの知識なしでDeep Learningが試せる優れもの。

直観的に、何をどうしたら精度が良くなるのか?を簡単に体感できるのは非常に役に立ちました。

なにせ、実際の画像を使って分類が出来るのは、単純に楽しい!

 

また、開発者によるYouTube動画もあり、Neural Network Consoleの使い方はもちろんのこと、Deep Learningとは?みたいな話や、テクニック的な部分も公開されているので、こちら↓もおススメです。

https://www.youtube.com/channel/UCRTV5p4JsXV3YTdYpTJECRA/videos

 

(参考)

ソニーの無償AIソフト Neural Network Consoleの入手ダウンロード、インストール

 

Udemyの動画講座

私が見ていたのは、こちら↓

【NumPy・Python3で】ゼロから作るニューラルネットワーク

数式とかも出てきますが、動画をちょこちょこ止めながら自分のノートで解き、見ていました。

この講座をある程度理解すると、ちょっとしたニューラルネットワークのプログラムを自分で作成するぐらいの知識を得る事ができるかと思います。

〔産業分野における〕AI・ディープラーニングを利用した画像検査・解析の効率化

〔産業分野における〕AI・ディープラーニングを利用した画像検査・解析の効率化 (月刊画像ラボ別冊)なる本を買ってみました。

 

この本は産業分野におけるという部分がポイントだと思いますが、産業分野では、Pythonが使われる事は、ほとんどないし(C++,C#が多い)、OSはWindowsだし、PCもローカル(ネットにつながっていない)だしで、一般的に解説されているDeep Learningの世界とは、動作環境が少し異なっています。

 

産業分野で、Deep Learningを用いた検査を行っている会社の論文集みたいな感じです。

 

ほとんどの記事は、

「現状では、まだまだ目視による検査が行われているが、判定基準が人によりバラつき易いし、人手不足だしで、検査をDeep Learningに置き換えると、判定基準が安定するし、人手不足も解消される。そこで、我社では ××ソフト を用い、○○の検査を行っています。」

 

というな半分宣伝の内容です。

Deep Learningのテクニック的な部分を期待すると、がっかりされるかもしれません。

 

ただ、私自身も知らなかったDeep Learningを用いた検査ソフトが掲載されているので、それはそれで、参考になりました。

 

この手のソフトは、分類/認識が初心者でも簡単にできますよ!というようなコンセプトが多いのですが、場合によってはオーバースペックになってしまうかも?しれません。

個人的には、そんなに深いニューラルネットワークでなくて、推論時はGPUも使わずに、このくらいまでは出来ますよ!というのが、好みではあるのですが、それをやると手離れが悪くなってしまうでしょうね。。

C#から使うC++ライブラリ(DLL)の作成方法

前回はC#で書かれたライブラリの作成方法でしたが、今回は、C#から使えるC++で書かれたライブラリの作成方法です。

C++と言っても、C++内部でクラスを使う事は可能ですが、C#から直接呼ぶ事が出来るのは、クラスではない関数のみとなります。
そのため、クラスオブジェクトをC++のライブラリとC#間でやり取りすることは出来ないので、注意してください。(構造体を引数で渡す事は可能です。)

 

正直、C++のライブラリの作成方法はあまり深く理解していないのですが、メモ程度に。。

 

事前にVisual Studio をデフォルトのままでインストールするとC++はインストールされないので、C++をインストールしておいてください。

 

まず、関数を呼び出すC#のプロジェクトを作成しておき、ソリューションの右ボタンで、

追加→新しいプロジェクト

を選択します。

 

次にプロジェクトを追加しますが、Visual Studio のバージョンにより画面が異なるため、各バージョンに合わせて確認ください。

Visual Studio 2017, 2019の場合

Visual Studio 2019には、上部に言語、OS別表示のフィルタをかけることが出来るので、C++、Windowsを選択します。

次にプロジェクトの一覧の中から Windowsデスクトップウィザードを選択します。

次にプロジェクト名とプロジェクトの場所を指定します。
プロジェクト名は、デフォルト設定ではライブラリ名になるので、ちゃんとした名前を付ける事をお勧めします。

次に アプリケーションの種類に ダイナミックリンクライブラリ(.dll) を選択し、追加オプションでは、
プリコンパイル済みヘッダー(P)シンボルのエクスポートにチェックを入れます。

→以降は、以下共通を参照ください。

Visual Studio 2015の場合

Visual C++ → Win32 → Win32プロジェクト

と選択し適当な名前(今回は CppDLL とします。)を付けOKボタンをクリックします。

 

表示されたウィザードで次へをクリックします。

 

アプリケーションの種類で DLL を選択し、慣れている人は 空のプロジェクト でいいんでしょうけど、私は慣れていないので、 シンボルのエクスポート と プリコンパイル済みヘッダー にチェックを入れ、完了をクリックします。

以下共通

ウィザードでDLLを作成すると、プログラムのたたき台となるサンプルコードを吐き出してくれるので、慣れないうちは、ウィザードを使った方がお勧めです。(私は、今でも使ってますが。。)

 

次にプロジェクトの設定を行います。

 

今どきのOSはほとんど64bitなので、今回は64bitOS用のライブライを作成するのを前提とします。

Visual Studio の 構成マネージャー をクリックします。

 

プラットフォームに x64 を選択します。

ビルドの部分いチェックが入っていない場合はチェックを入れます。

これを アクティブソリューションの構成のDebugReleaseの両方で行います。

 

これでけで、ソリューションのビルドを行うと、ソリューションフォルダの直下にx64フォルダが作成されます。

さらにその中のReleaseもしくはDebugフォルダの中に、このように↓dllファイルが作成されてますが、C#から、このdllファイルを使うにはさらに細工が必要になります。

 

以降は、C++プロジェクトの作成時にウィザードが吐き出した

  CPPDLL_API int fnCppDll(void);

の関数がC#から使えるようにC++のヘッダファイルを変更します。

 

C++ライブライのヘッダファイル(ここでは CppDll.h)を開き、C#から使う関数を

#ifdef  __cplusplus
extern "C" {
#endif	/* __cplusplus */

// ここに使用する関数を定義する

#ifdef  __cplusplus
}		/* extern "C" */
#endif	/* __cplusplus */

のように  extern “C” { } で関数の定義を挟み込みます。

こんな感じ↓

#ifdefの部分は、あんまり分かってない。。

 

次に作成したC++のライブラリファイル(*.dll)がC#から使用できるようにします。

ここは、いくつかやり方があり、好みが分かれるところだと思いますが、今回は、C++のプロジェクトが作成したDLLファイルの出力先をC#の出力先にに合わせるように変更します。

 

C++のプロジェクト名の部分を右クリックし、

  構成のプロパティ→全般→出力ディレクトリ

  $(SolutionDir)\WindowsFormsApplication1\bin\$(Configuration)\

とします。(※WindowsFormsApplication1はC#のプロジェクト名です。)

 

この出力ディレクトリの設定を 構成の Release と Debug の両方設定します。

 

これで、C#のプログラムから参照できる位置(C#のexeファイルと同じフォルダ)にdllファイルが出力されます。

 

この設定を間違うと、以下のようなエラーが表示されます。

 

今回は64bitOS用のDLLとして作成していますが、C#のプロジェクトはOSが64bitであってもプロジェクトが初期設定状態だと、32bitで動作するので、これを64bitで動作するように変更します。

 

C#のプロジェクト名を右クリックし、 プロパティ をクリックし、以下のウィンドウを表示させ、 左側メニューの ビルド を選択し 32ビットを優先 のチェックを外します。

この設定を 構成 の Debug および Release の両方行います。

 

この設定を間違うと、 BadImageFormatExceptionはハンドルされませんでした。 というエラーメッセージが表示れます。

 

これで、とりあえずC#からC++の関数が動作します。

C#からは、以下のようなコードでC++の関数定義を行います。

using System.Runtime.InteropServices;

[DllImport("CppDll.dll")]
public static extern int fnCppDll();

“CppDll.dll”の部分は適宜、作成したdllファイル名に合わせて下さい。

 

実際に関数を呼び出す部分は、

private void button1_Click(object sender, EventArgs e)
{
    int n = fnCppDll();

    MessageBox.Show(n.ToString());
}

のように、ボタンクリックイベントで呼び出したとすると、以下のように表示されると動作はOKです。

 

さらに、これだけど少し足りなくて、C++のプロジェクトのプロパティで、

構成プロパティ→C/C++→コード生成→ランタイムライブラリ

の部分で、構成が

Releaseのとき:マルチスレッド(/MT)

Debugのとき:マルチスレッドデバッグ(/MTd)

に変更しておきます。

この設定をしないと、別のPCでプログラムを実行した際に、開発を行ったVisual Studioと同じバージョンのC++ランタイム(再頒布可能パッケージ)がインストールされていないと動作してくれないので、いざ、実行環境で動作させようとした時にハマったりもします。

 

以上、少し怪しい部分もあるかと思いますが、こんな感じで。。

 

関連記事

【C#エラー】System.BadImageFormatException 間違ったフォーマットのプログラムを読み込もうとしました。