ML_python レポジトリを追加

ようやく AutoEncoder を使った DNN が動いたので、GItHub に公開しました。

とりあえず、途中まで教科書「ゼロから作る Deep Learning」を参考にしつつ、
AutoEncoder クラスや MultiLayerNet クラスを追加しています。

4000回の学習でテストデータに対し、最小 88%、最大 96%程度の認識率を
持たせることができました。

DNN は途中のデバッグが非常に困難に感じます。既存の DNN ライブラリは
どうやってデバッグを解決しているのでしょうか。

記事の方はそのうち更新したいと思います。

numba パッケージの記事を追加しました

numba パッケージを使う場合のヒントに関する記事をこちらにアップしました。

ループ数が小さかったり配列数が小さかったりすると CUDA の効果はほぼないです。
手軽に CUDA を使って実験したい場合に重宝しそうです。

なお、一定数ループを回ると実行速度がぐんと上がる現象が見られています。
(python3 の実行エンジンの関係かもしれませんが)

CUDA9.2 を使って JCuda0.9.0d をコンパイルする

JCuda – ダウンロードとコンパイルで解説しているように実行すると、JCufft を作成する時にエラーで止まります。

これは9.1から cufftSetCompatibilityMode() が削除されたためなので、jcufft/JCufftJNI/src/JCufft.cpp の最後の関数の戻り値を JCUFFT_INTERNAL_ERROR 等に変更します。

これでコンパイルが通るようになりますが、今度は jcuda-main に移動して mvn clean するときに失敗します。この原因は pom.xml に cuDNN の設定が入っていることと、デフォルトの Ubuntu 16.04.x に openjdk-8-jdk パッケージがインストールされていないためです。

pom.xml から cuDNN の設定を削除し、openjdk-8-jdk をインストールすると、mvn install が成功し、output ディレクトリに jar ファイルが作成されます。

そのうち HP の方も修正します。修正しました。

久々の投稿: python で cavity 問題を解いてみた

python3 で2次元の cavity 問題を解いたサイトがないか調査していたが、探しきれなかったので、

https://github.com/minosys-jp/Fluid.git

の方に登録してみました。高速化は numpy, numba で実行していますが、numpy のみを使った方が成績が良いようです。

出力をアニメーションしようとすると多大な時間がかかります。matplotlib の実装が悪いからだと思います。

後日談: OpenFOAM があることに気づきました。でもたまには自分の手を動かすのもよいかと。

検索エンジンにN-gram+Scoreを追加しました

技術置き場に新しい検索エンジンを実装しました。

ベースは N-gram ですが、出現確率が高いほどスコアが高くなるような計算を行い、スコアに関して降順に結果が表示されます。ただし、スコアが0.0001より小さくなる場合は検索対象にはなりません。スコアの最大値は恐らく1.0です。

この検索エンジンのよいところは比較的あいまいな検索に対応できることです。特に動詞、助動詞と言った、語尾が変化する単語の検索に威力を発揮します。

なお、本検索エンジンはN-gramの軽微な改良であるため、記事化は予定しておりません。

jcurandの記事を追加しました

cuRAND を JCuda 環境で使用するための API である、jcurand の使い方をアップしました。

お膳立てが若干ありますが、それさえクリアすれば、シンプルな呼び出しで高速に乱数生成ができます。

メモリはデバイス側に確保する必要がありますが、メモリコピーを使えばホスト側に持ってきて使用することが可能です。

JCuda 版ニューラルネット記事追加

JCuda 版ニューラルネットのコードに関する説明記事をアップしました。CPU 版と比較して、以下の変更があります、

  • CPU版では batchsize 方向の並列化はしなかったが、JCuda 版では batchsize 方向も並列計算する。
  • CPU 版ではホストメモリの管理のみだったが、JCuda 版ではホストメモリおよびデバイスメモリの両方を管理する。
  • JCuda 版では計算はデバイスメモリで閉じるようにする。
  • メソッドはほぼ共通して使えるように、デバイスメモリ管理をオブジェクト定義に追加して隠蔽する。

 

SimpleNet.java バグ修正しました

SimpleNet.java の forward() 計算で、bias を使用しないというバグがあったため、JCudaNNKernel.cu とともに修正しました。ただ、bias があってもなくても正答率に目立った変化はないようです。

JCuda 版ニューラルネットのソースコード解説は、現在作成中です。完成にはあと2〜3日かかると思いますので、好ご期待。

AutoEncoder 系のライブラリも作成中ですが、まだ動きません。