2017年4月27日木曜日

小さなことだが大きい:リスト出力で最後にカンマを付けない

 今回は、Java SE8のあるチップスについて書きます。ご存じの方も多いかも知れませんが、知らないと損します。「何らかのコレクション(リストなど)の要素をカンマで区切って並べて出力する際に、最後にカンマを付けたくない!」です。例えば、以下のリストを考えます。

final List<String> planet = 
Arrays.asList("水星", "金星", "地球", "火星", "木星");

方法1 ----------------------------------------
 これだと、最後の要素の後ろにも", "が付いてしまいます。
for(String name: planet)
System.out.print(name + ", ");
System.out.println();

出力結果:水星, 金星, 地球, 火星, 木星,


方法2 ----------------------------------------
 最後の要素の後ろに", "が付かないようにしました。but、美しくない!
for(int i = 0; i < planet.size() -1; i++)
System.out.printf(planet.get(i) + ", ");
if(planet.size() > 0)
System.out.println(planet.get(planet.size() -1));

出力結果:水星, 金星, 地球, 火星, 木星


方法3 ----------------------------------------
 SE8のString.joinを使うと一発です。SE8のstream処理にも適する。美しい!
System.out.println(String.join(", ", planet));

出力結果:水星, 金星, 地球, 火星, 木星

2017年4月20日木曜日

TensorFlowのさらに上位のTFLearn

 Deep Learningを作るための定番プログラミング言語はPythonのようです。さらにその上に抽象化されたフレームワークTensorFlowがあります。それをさらにもっと抽象化したTFLearnというのがあります。さっそく、下記のチュートリアルを読んで、環境設定し、例題の学習と検証をやってみました。

http://tflearn.org/tutorials/quickstart.html

タイタニック号(WikiPediaより引用)

例題が分かりやすくて、面白いものでしたので、ご存じかもしれませんが以下に記します。タイタニック号が沈んで、ほとんどの乗客、乗員が海へ沈んだりして亡くなったのですが、生き残った人(surviving)もいます。約1,300人くらいの人についての「生存/死亡、客室クラス、性別、年齢、... 」などのデータセットが公開されています。これらのどんな特性の人が生存したのか、死亡したのかを学習させるニューラルネットワークを作る問題です。

 このTFLearnでそれを書いています。3層のフル結合ニューラルネットワークにした場合、以下のとおり、僅か数行でできています。(以下のソースリストは、上記URLで示されているものです。)すばらしい!

# Build neural network net = tflearn.input_data(shape=[None, 6]) net = tflearn.fully_connected(net, 32) net = tflearn.fully_connected(net, 32) net = tflearn.fully_connected(net, 2, activation='softmax') net = tflearn.regression(net)

学習の実行も以下の2行ですんでいます。これもすばらしい!

# Define model model = tflearn.DNN(net) # Start training (apply gradient descent algorithm) model.fit(data, labels, n_epoch=10, batch_size=16, show_metric=True)

その学習の状況は以下のようになりました。

===== 学習状況 (終盤のみ)===========================
Training Step: 1634  | total loss: 0.52194 | time: 0.255s
| Adam | epoch: 020 | loss: 0.52194 - acc: 0.7666 -- iter: 1216/1309
Training Step: 1635  | total loss: 0.50945 | time: 0.258s
| Adam | epoch: 020 | loss: 0.50945 - acc: 0.7775 -- iter: 1232/1309
Training Step: 1636  | total loss: 0.50597 | time: 0.260s
| Adam | epoch: 020 | loss: 0.50597 - acc: 0.7747 -- iter: 1248/1309
Training Step: 1637  | total loss: 0.49217 | time: 0.265s
| Adam | epoch: 020 | loss: 0.49217 - acc: 0.7848 -- iter: 1264/1309
Training Step: 1638  | total loss: 0.47261 | time: 0.268s
| Adam | epoch: 020 | loss: 0.47261 - acc: 0.8000 -- iter: 1280/1309
Training Step: 1639  | total loss: 0.47787 | time: 0.270s
| Adam | epoch: 020 | loss: 0.47787 - acc: 0.7888 -- iter: 1296/1309
Training Step: 1640  | total loss: 0.47622 | time: 0.273s
| Adam | epoch: 020 | loss: 0.47622 - acc: 0.7974 -- iter: 1309/1309

 最後に、興味深いのは、テストの結果です。後に作られたタイタニック号の映画の主演男女、デカプリオ(DiCaprio)とウインスレ(Winslet)の生存確率です。このふたりに、上記の特性データを付与して、計算させています。映画の結末と合致して、DiCaprioは亡くなるが、Winsletは生き残るという結果がでました。単なる偶然とは思われない!

===== 主演男女の生存確率 ===============
DiCaprio Surviving Rate: 0.138
Winslet Surviving Rate: 0.904
======================================



2017年4月10日月曜日

Webページをスマホで勉強する

 Webには、プログラミング関係他、IT技術を学べる優れたコンテンツが多数存在します。それをスマホで見れば、どこでも、いつでも勉強できます。これをぜひ、活用したいですね。スマホのブラウザで、該当Webページを見ると、スマホ画面用に(文字も大きくして)最適化表示してくれるサイトも増えているようです。

 しかし、それだけだと、ちょっと足りません。例えば、幾つかの章(項目)がある場合、何時それを見て勉強したか、そのときの理解の程度はどうだったか、等を簡単に記録できれば、復習する際にとても有用です。何事も、復習、復習で身につきます!

 多くのWebページに対してそういうことをしたいので、一応、汎用的?スマホアプリ(Androud用)を目指して作って見ました。今回の具体例は、下記のC++入門です。


[原典]
小林健一郎教授「C++入門」
(↑アクセス回数が300万回を越える(2017-4-8現在)人気のWebページです。)

Webページに対応した目次を作り、List Pickerから選択可能にする

Androidのブラウザで読んで勉強する(文字サイズは最適表示になっている)

その章を前回読んだ際に書いたメモを表示したりできる

このアプリとその説明書は、下記で公開していますので、お試しいただければ嬉しいです。



2017年4月7日金曜日

Deep Learningの教材にこだわる、迷う

 3年生ゼミで、Deep Learningの基礎を学生諸君とやることにしました。「人工知能」のこれからは、これだ!と思い付いたのは、昨年2016年の夏頃です。(世の中からは、ずいぶん遅れていますが)それまでは、私自身もこの関連の研究も教育もやっていませんでした。それ以来、猛チャージで、何冊かの英書、和書、Web解説などを勉強してきました。最終的には、下記の書籍に魅力を感じて、「これをテキストにしよう」と考えるに至りました。

斎藤康毅著:ゼロから作るDeep Learning - Pythonで学ぶディープラーニングの理論と実践、オライリージャパン、2016

 しかし、その後、また、迷いはじめました。「いや、その前にもっと簡潔に、しかもあまり杜撰にレベルを落とさずに、プログラミング言語抜きで、要点をサッとやれる資料などがないものか」と。そう考えていたら、下記のYoutubeの25分の解説ビデオに出会いました。「すばらしい。これだ。」となりました。

How Deep Neural Networks Work, by Brandon Rohrer
https://www.youtube.com/watch?v=ILsA4nyG7I0

 簡潔に、多層化の意味や、誤差逆伝播(バックプロパゲーション)を分かりやすく説明している類い希な優れたビデオです。しかし、英語であるうえ、簡潔さゆえに、全くの前提知識のない学生に聞かせるのはちょっと難しいそうです。その前に、日本語で少し、知識を与えてからにしたい。(なんて親切な教員なのでしょうか!)
 
 そこでさらに出会ったのが、以下のWeb解説記事でした。再度、「素晴らしい。これだ!」と思いました。単純パーセプトロン、多層パーセプトロンネットワーク(多層ニューラルネットワーク)、学習の意味、多層ニューラルネットワークの誤差逆伝播、さらに、「畳み込み」の考え方まで、実に、丁寧に分かりやすく書かれているじゃないですか!

高卒でもわかる機械学習(by下川北斗氏)というタイトルのWeb解説です。
http://hokuts.com/2015/11/24/ml0/
(シリーズで、第0回〜第7回まであります。畳み込みの続編(第8回)は未刊?)
特に、誤差逆伝播では、いくつか偏微分の計算式が出てくるが、結局、辺の重みの更新は以下のように結論づけられる!

出力層および中間層での重みの更新方法(l = Lは出力層を意味する)

これの意味する所が分かるように、丁寧に書かれていますので、上記Webをご覧ください!
高校数学+大学初級数学の範囲ですので、理工系の大学生であれば特に難しいことなないように思われます。(上にも下にも添え字があって、とっつきにくいかも知れませんが、添え字変数に具体的な数値を入れて確認するのも良いでしょう。)