Musashitokiwa.LLC Blog

武蔵常盤株式会社のブログです。

AIに手を出して見る PythonとKerasによるディープラーニング - 11

皆さん、こんにちは、こんばんわ。

His First Japan 合同会社 代表社員の字引淳です。

 

 f:id:a-j1b1k1:20180805211928p:plain

5章のファインチューニングのサンプルコードを実行している間に、残りのサンプルコードを全部実行して、動作確認をしました。

残りのサンプルコードは、ほとんど時間がかからず、あっという間に処理が終了になりました。

1ヶ月どころか、1日で終わってしまいました。

 

ちなみに、ファインチューニングのサンプルは、現時点で、75エポック、昨日の21時36分から開始して、ようやくそこです。現在翌日の21時51分なので、丁度24時間経過したところです。

恐らく、あと6時間くらいで終了します。

 

 

さて、AIの実験環境の準備が、目の前の課題になりました。

AWSで利用できるGPUインスタンスは、90セント/hourくらいの費用がかかるので、時間1ドル計算して、1日24ドル、インスタンスを立てっぱなしにした場合は、1ヶ月に744ドル(およそ75000~80000円)の費用がかかるということ。

GPUインスタンスのランクなどによっては、それ以上の金額になる事も・・・

インスタンスを停止しておれば、費用がかからないという事だったら、わざわざ、固定資産を増やす必要もないので、レンタルでもいいかな。

ちゃんと調べて、検討したうえでどうするか、考えなければいけない。

 

勉強をするだけでも、だらだら実装、起動を繰り返すので、レンタルではきついかな?

 

 

 

AIに手を出して見る PythonとKerasによるディープラーニング - 10

皆さん、こんにちは、こんばんわ。

His First Japan 合同会社 代表社員の字引淳です。

 

 f:id:a-j1b1k1:20180805211928p:plain

5章も3分の2の実行が済んで、もはや、うちのラックマウントサーバーの仮想マシン(CPU)環境での実行では、20時間や30時間という、とんでもない学習時間がかかるようなサンプルコードになってきています。

 

参考書にも、「CPUでは間に合いません」と、但し書きがされています。

 

 

4章でじっくりと時間をかけて基本的な知識を理解しておいたおかげで、5章のサンプルコートを実装、実行することに僕の頭に負荷は掛かりませんでした。

 

難しいことを考えずに、シンプルに理解できます。

 

 

*1 この本の特徴について

 

 

弊社も、2期目が終わって、3期目に突入して早2ヶ月。

 

機械学習の学習環境を独自で揃えるかどうかを考えなければいけない時期に来ている。

AWSGPU処理をさせてくれるようなプランもあるそうですが、それに対して数万円投資してからオンプレミスのマシンを購入するのを検討するのでは、無駄な出費がかかるのでそれならば、オンプレミスのマシンを購入するのがいい。

 

ラックマウントサーバーを購入した時に、PCとは違うパワーに夢が広がった事を実感したように、ちゃんとした環境を用意するとそれまでみえなかった景色が見える様になる。

 

何にせよ、学習が進めば、いずれ避けて通れない環境問題。

流石に30時間の処理を繰り返すのは、効率的ではないですよね。

 

5章のサンプルは全部CPUで実行して、それ以降は、考えるか。

 

それでも1ヶ月くらいの話か・・・

 

 

 

 

*1:

この参考書の特徴として、サンプルコードはきちんと最初から全文通しで書かれていません。部分的に抜き出して書かれているので、最初のサンプルから改修、改修を繰り返して、動かしながら先に進んでいかないと、理解することは難しいです。美味しいところ取りでは、意味がわからないし、実装、実行をする事が難しいと思います。

まあ、ちゃんと探せば、GItHubなんかにソースコードが上がっていると思うんですけどね。でも、それでは、勉強にならないので、自分でタイピングします。

久しぶりのJavaについて

皆さん、こんにちは、こんばんわ。

His First Japan 合同会社 代表社員の字引淳です。

 

 f:id:a-j1b1k1:20180805211928p:plain

 

 

今日はAI以外の、本業のJavaについて書きます。

 

最近、Java Bronzeの勉強を見る機会があって、現場では絶対にゆるされないようなサンプルコードの数々に、SJCPの頃、私が、ドシロートから勉強をして資格を取っていたあの頃を思い出しました。

 

それで、とあるサンプルコードをみて、「なぜその結果になるか、わからない。」と言われたので、私も見たのですが、確かに、分からないんです。

 

コード①

interface  MyInter {

  public static final int VAL = 3;

  void foo(int s);

}

public class Test implements MyInter {

  public static void main(String args) {

    int x = 5;

    new Test().foo(++x);

  }

  public void foo(int s) {

    s += VAL + ++s;

    System.out.println("s:" + s);

  }

}

実際に実行して見ると、結果はS:16となります。

 

「あれっ?S:17じゃないの?」って、はずしてしまいます。

 

とりあえずは、まずはじめに、コードレビュー的に。

「あれ?こんな書き方したらいかんよ。処理は一目瞭然にしないと。バグの温床になるぜ。」と言う箇所。

 

  s += VAL + ++s;

 ※ s = VAL + ++s;これであれば問題はないんですよね。

 

普通に考えれば++sがインクリメントされた時点で値が変わっているものと思っていた。

 

 new Test().foo(++x);→x:6

public void foo(int s) {→s:6

s += VAL + ++s;

s:6  VAL:3  s:7→実際にはこう言う形で処理が行われる。

s:7  VAL:3  s:7→机上デバッグではこうなっていると思っていた。

 

確認しようと思って、各変数をコンソールアウトして見たところ、

こうなる。

 

コード②

interface  MyInter {
  public static final int VAL = 3;
  void foo(int s);
}
public class Test implements MyInter {
  public static void main(String args) {
    int x = 5;
    new Test().foo(++x);
  }
  public void foo(int s) {
    System.out.println("s1:" + s);
    int a =VAL + ++s;
      System.out.println("s2:" + s);
    System.out.println("a:" +  a);
    s += a;
    System.out.println("s3:" + s);
  }
}
 
結果はこうなる。
s1:6
s2:7
a:10
s3:17←あれ?違うやんか。
 
机上デバッグと実行の場合の値の違いがそのまま出てます。
コード②の場合はsがインクリメントされていますが、
コード①の場合は、インクリメントの反映タイミングがちょっと違うんですね。
基本型なので、参照を利用していないので、こう言うことが起こるんでしょうね。
 
最初に書きましたが、このようなコードはコードレビューでチェックされて修正させられます。処理は一目瞭然でなければいけない。(開発現場による)
 
このプログラムは、見事なバグの温床プログラムですわ。
 
資格試験のサンプルコードとしては「こんな事もできるんだぜ」っていうプログラムになるのでいいんでしょうが。
 
このブログで何が言いたいかといえば、
やべー、この程度のことで間違えちゃったよ〜。
ってことですね。
 
 
 
 

AIに手を出して見る PythonとKerasによるディープラーニング - 9

皆さん、こんにちは、こんばんわ。

His First Japan 合同会社 代表社員の字引淳です。

 

 f:id:a-j1b1k1:20180805211928p:plain

いくつかのサンプルのデータの内容を観察していて、

「そもそも、この4つのサンプルはディープラーニングを用いて何をしているのか?』と、いう一番根本的な疑問に行き着いた。

 

 

これも、当たり前ですが、きちんと書いてあります。

 

分類をしているだけ。

 

  • 数字の書いてある画像をラベルから集計して出した0〜9の10個のカテゴリに分類しているだけ。
  • ニュース記事のデータ(単語ではなく辞書データ(キー 数字:値 単語))を否定的か肯定的かの2つのカテゴリーに分類している。これは、二値分類の例と書いてある。
  • ニュース配信のデータもニュース記事のデータと同様で46種類のトピックに分類している。
  • 住宅価格の予測については、回帰分類らしいが、今のところそれがどういうことなのかきちんと理解できていないので、まぁ、そういうことだろうこうと言う認識で進める。

今回は、各データにデータとラベルがあって云々・・

を文章でまとめると、非常にまどろっこしいので、

 

MNISTの例をマインドマップにまとめてみた。

 

f:id:a-j1b1k1:20180819205620j:plain

 

このようにまとめてみると、シンプルなコードの中にも多くの要素があることに気がつきますね。

 

社会人入学した大学では、大半は教科書をこのマインドマップ化するのが勉強だったな〜。

 

これが出来れば、持込可の論文試験は「優」確定だったんだよな。

 

このマップをなぞって、文章を更正すると、あら不思議、論文が出来上がってしまうんですよね。

 

自分の理解の指標として、このマインドマップが描ければ、理解できている。としている。

 

学校で習うノートの書きかたっていうのは、多くある整理法の一つで、図解や、画表現を使わずに記述する方法で、いいところもあるかと思うが、大体、書いた後に何を言っていたかを思い出すのに苦労しますよね。

 

マインドマップは、各トピックを追いかければすぐに思い出すので、本の内容を思い出すのにコストがかからないですね。

 

残りの3つのマインドマップも作成しつつ、先に進もうかね。

 

 

 

 

AIに手を出して見る PythonとKerasによるディープラーニング - 8

皆さん、こんにちは、こんばんわ。

His First Japan 合同会社 代表社員の字引淳です。

 

 f:id:a-j1b1k1:20180805211928p:plain

渡されるデータを確認すると、理解が進むな〜。

 今回は、チクチク、逐一実行してみますよ。

これは、画像のデータをコンソールアウトしたもの。

 

f:id:a-j1b1k1:20180814090044p:plain

これは画像のデータを出力したもの

f:id:a-j1b1k1:20180814090155p:plain

若干、コンソールアウトしたものが縦に潰れているが、28✖︎28の画像になっている事がわかる。

 

これを前処理にかける。

train_images = train_images.reshape*1

上記の2次元テンソル(行列)が、1次元テンソル(ベクトル)にエンコードされます。

 

さらに

train_images = train_images.astype('float32') / 255

をかけることで

…3 18 18… → …0.01176471 0.07058824 0.07058824…

というfloat32型の値の配列に変更されます。

 

ここでは、何も難しいことをしているのではなく、ただ、単に画像の2次元テンソルデータを1次元テンソルに変換し、それをFloat32型の配列に変更しているだけということ。

 

なーんだ、そんだけのことか。

って、なりますよね。

 

*1:60000, 28 * 28

AIに手を出して見る PythonとKerasによるディープラーニング - 7

皆さん、こんにちは、こんばんわ。

His First Japan 合同会社 代表社員の字引淳です。

 

 f:id:a-j1b1k1:20180805211928p:plain

2章目の内容を繰り返し確認すると、気のせいでしょうか、自分の理解が大分進んだ感じがします。

 

 

今まで曖昧なまま進めていたので、前処理では何をやっているかとか、すっ飛ばしていたことに気がつきますね。

 

行き詰まるまで徹底して進んで、疑問や、不明点が出て来たところで素直に理解できていない個所の先頭まで戻ると上手くいきますね。

 

各人には得意な学習方法があるので、わからないでもとにかく進める事に抵抗を覚える人も居るとは思いますが、僕にとっては、知ったかぶりをし先に進めば必ず苦しくなる。

 

その時が学習のチャンスだと思っています。

疑問が出たところで、その疑問を解決する事が、本当の意味での学習であると思います。

学生の頃の様に、テストなどがあって、評価してくれる人がいるわけではないので自分なりの方法で、理解し実行する以外に学習方法はないと思いますね。

 

前処理では、定義されたモデルに合致するデータに変換すると言う、至極当たり前のことしか書いていなかった。

 

その後に、しっかりとデータテンソルの説明もされています。

この辺は、フレームワークに依存する処理といった感じですね。

 

初めて読んだ時は、そんな事すらもわからない。といった感じでしたね。

 

こういうように、見えなかった部分が見えるようになるということは、学習の成果の一つであると思います。

 

よくわからないうちから、誰かのプログラムを真似してAIのプログラムを組んで実戦でAIを学んでいくことも同じかと思いますが、それだと、詳しい知識、体系的な学習をする事が出来ないので、数ヶ月から1年で疲れてしまって学習をやめてしまう事が多いです。

 

 やっぱり、時間かけても自分の理解できる本を探し、丁寧に読んでゆく。

それ以外ありませんね。

AIに手を出して見る PythonとKerasによるディープラーニング - 6

皆さん、こんにちは、こんばんわ。

His First Japan 合同会社 代表社員の字引淳です。

 

 f:id:a-j1b1k1:20180805211928p:plain

この本の5章以降のコードは、どうやらCPUで処理をさせる形式のマシン環境では、処理が遅くなってくる模様。

 

まだ、3章目までしか実行してないのでなんともわかりませんが・・・

 

 

そこで、GPUを利用してAIを実行する事ができるマシンが必要な様子。

たとえば、これ。

 

iiyama DEEP-17FG101-i7-VNRVI | パソコン工房【公式通販】

ものは良さそうだ。

しかし、OSやディープラーニング環境は自分でセットするし、出来合いの物を買うと言うところに抵抗を感じるな〜

 

エントリーモデルだと、こんな感じ。

今すぐ使える事としては、美味しい感じ。ただ、長期的に使おうとすると、スペックにちょっと投資意欲が削がれるな〜。

 

みてると、やっぱりある程度出さないとあっという間にフレームワークのバージョンアップなどにより、性能が劣化して使い物にならなくなりそう。

実際に使ったことはないので、一般的なPCを判断基準に考えてるので、実際のことは、知らんけど。

 

できる限り、仮想マシンのCPUを追加して、なんとか回せる様にして、いよいよとなったら、その時に購入検討するかな。

 

流石に、ハードを買うのは抵抗があるな〜。