grbl1.1+Arduino CNCシールドV3.5+bCNCを使用中。
BluetoothモジュールおよびbCNCのPendant機能でスマホからもワイヤレス操作可能。
その他、電子工作・プログラミング、機械学習などもやっています。
MacとUbuntuを使用。

CNCマシン全般について:
国内レーザー加工機と中国製レーザー加工機の比較
中国製レーザーダイオードについて
CNCミリングマシンとCNCルーターマシンいろいろ
その他:
利用例や付加機能など:
CNCルーター関係:



*CNCマシンの制作記録は2016/04/10〜の投稿に書いてあります。


2017年9月29日金曜日

Raspberry Pi Zero Wのリチウムポリマーバッテリー化(その2)

Courseraの機械学習コースも終わったので、中断していたRaspberry Pi Zero Wのリチウムポリマーバッテリー搭載の作業の再開です(前回までの様子はこちら)。

Raspberry Pi Zero Wは小型で便利なのですが、スタンドアロンのWifiカメラとして使用する際に、既存のモバイルバッテリーだとちょうどいいものがないので、できるだけZero Wのサイズにフィットした電源供給方法を既存の部品などの流用でつくれないかという試みです。まだ試作段階なので、仕上がりなどは中途半端です。

部品類:
・アクリル板:67x30mm、2mm厚(Zero Wのサイズは65x30mm)
・電源用スイッチ(ON/OFF)
・リチウム充放電回路(出力:5V、入力:5V/MicroUSB)
・リチウムポリマーバッテリー:48x30mm、8mm厚、3.7V/1200mAh
・その他、M2.6、M2ネジ、赤黒ワイヤ、ポゴピン


電源供給端子:
まずは、Zero Wのどの端子に電源供給するか?という部分からスタート。以前も書きましたが、

上画像のPP1とPP6(Zero基板には端子番号がプリントされているようですが、Zero Wだとプリントされていない)に5Vを接続することにしました。この端子、PP1(5V)、PP6(GND)は、電源供給用のMicroUSBと直結しているようなので、ここに5Vを接続。直接ハンダづけしてもいいのですが、前回書いたようにポゴピンを接点にしました。
スイッチの中央の端子にポゴピンをハンダづけしています。スイッチは秋月で購入した表面実装用の小型なもので、足の部分を折り曲げてまっすぐにしています。これはZero WにおけるGND側の端子となります。そして、これをアクリル板をベースにして以下のようにとりつけます。
アクリル板にポゴピンと同じ径の穴を開け(段差もついているので2段穴)、差し込みます。そのままだと抜けるので瞬間接着剤で固定。手前のポゴピン(GND:Zero WのPP6端子へ)がスイッチと直結、奥のポゴピン(5V:Zero WのPP1端子へ)は赤ワイヤとハンダづけしてあり充放電回路につながっています。
ポゴピンの直径は1.5mm(アクリル板の貫通穴)、見えている電気接点となる先端が丸い部分は直径1mm、全体の高さが3mmと非常に小さいので作業も大変です。
AliExpress.com Product - 10pcs Ultra small spring loaded pogo pin Diameter 2.3mm 3.0mm heigth brass material with Gold plated 1u 10個セットで344円(送料無料)


リチウム充放電回路:
一番悩んだのが、リチウム充放電回路です。今回は5V電源を供給するため、充放電回路に昇圧回路も内蔵しているものを探しました。Zero Wは3.3Vで動作するためGPIOピンに3.3Vを接続すれば動くようですが、5V電源も取れるようにということで5Vにしました。回路で昇圧して降圧するのでその分ロスが大きくなりますが、今回は5V入力の方向で。

条件としては、
・USB5Vで充電可能(できればMicroUSB端子つき)
・5V出力(昇圧回路つき)
・充電と放電が同時にできるもの
・できるだけ小型

以下は、前回試してみた充放電回路です。
左から、
・AliExpressで売っている昇圧充電回路(300円前後)
・アマゾンでも購入可能なTP4056搭載の回路(安い:100円前後)
・Wemos Battery Shield(AliExpressで200円前後)
・18650モバイルバッテリー内の回路流用(安い:AiExpressで100円程度)
上記各回路については前回参照。


上記以外にもいくつか試しに購入してみた結果、以下の回路が上の条件を満たしていたので採用。
AliExpress.com Product - 5V Lithium Battery Charger Step Up Protection Board Boost Power Module Micro USB Li-Po Li-ion 18650 For Power Bank DIY New XQ148円(送料込み)、サイズ:22x18x11mm
おそらくこれは18650モバイルバッテリーなどに内蔵されている回路だと思います。上画像上部に見えるのがMicroUSBソケット(メス)、ここからUSB経由で充電(5V入力)。基板真ん中付近のOUT-とOUT+端子が5V出力。ここをZero Wの電源端子へスイッチを介して接続。通常のUSBソケット(メス)を搭載できるような基板になっていますが、送られてきたものは、この画像にある通りUSBソケット(メス)はついていません。どうせ使わないので、このままのほうがいい。さらに基板下の左端とやや中央に見える穴がリチウムバッテリーと接続する端子。

配線図:ポゴピンはZERO Wの両端子の位置に取り付けます。
ただし、以前購入した18650モバイルバッテリー(100円程度)は、充電と放電が切り替え式になっており、充電しながらの電源供給ができないというタイプもたまにあるので注意。あるいは、充電中(5V入力)は5V出力するけれども、USB充電接続を外すとバッテリーからの出力に切り替わるため、昇圧回路が内蔵されていないものだと3.7V出力になってしまうものなどもあります。自分で充放電回路をつくったほうがいいかもしれないと思いましたが、面倒なのでいろいろ探しているうちに今回の回路(しかも安い)が見つかったというわけです。

この充放電回路は比較的小型なのですが、厚みが意外にあります。横からみると分かるのですが、基板の両面に部品が載っています。特にMicroUSBソケット(メス)が上面左にあり、コイルが下面右にあるため、全体的に厚くなってしまいます。そのため、以下のようにアクリル板にコイルの部分が埋没するように穴(直径6mm)をあけてなんとか厚さをを吸収しました。
それでも、コイル以外の部品ものっているので、スペーサーをいれて少し浮かせています。幸い固定用の穴も回路上についているので、アクリル板にネジ穴を切ってM2ネジで固定しました。ネジ固定されたので、充電の際のMicroUSBの抜き差しにも耐えられるでしょう。ちなみに、アクリル板とZero WはM2.6ネジで四隅を固定します。ナットは使用せず、タップでアクリル板にネジ穴を開けています。

バッテリー:回路の大きさによってバッテリーの大きさも左右されてしまうのですが、最低でも1000mAhのバッテリーという条件にして探してみました。30mm幅で厚みが8mmになるといくつかあり、今回は長さ48mmで1200mAhを使うことにしました。8mmも厚みがありますが、充放電回路もそこそこ厚みがあるので大丈夫でしょう。逆に薄さを優先するとバッテリー容量も減ってしまうので、このくらいがちょうどよさそうです。
AliExpress.com Product - Liter energy battery 3.7V lithium polymer battery 803048 1200MAH GPS navigator PSP game sound card1111円(送料込み)、保護回路つき。AliExpressでもリチウムポリマー電池はそれほど安くもないのですが、日本よりは安いかと。しかし、送られてきたのはTurkey Postからでした。最近バッテリーなどはトルコで生産しているのでしょうか?

全体的にはこのような厚み。バッテリー上面からZero WのHDMI端子までの厚さで15mmあります。バッテリーは両面テープで仮止めしています。さらに、これを全体的に覆うようなケースもあるといいかもしれません。いまのところGPIOピンは取り付けていないのですが(主にWifiカメラだけの使用を前提)、取り付けると更に厚みが増すので、もし使う場合はその部分もポゴピンにしてしまおうかと思っています。

ちなみにカメラをつなぐとこんな感じ。カメラを起動してもエラーがでるので、なんでだろうと思ったら、実はカメラの向きが逆でした。以下がこのカメラ(V1)に対しての正しい向き。ちなみにもう一つ持っている暗視カメラのほうは、この↑向きと同じ。カメラによって向きが異なる点も注意が必要です。
AliExpress.com Product - Free Shipping raspberry pi camera 5mp pixels RASPBERRY PI CAMERA739円(送料無料)、これは5メガピクセルのV1カメラです。フラットケーブルコネクタが基板背面についています。ちなみに最新のV2カメラは8メガピクセルにスペックアップしています。スペックの違いはここを参照
AliExpress.com Product - Raspberry Pi 2 Camera module 5MP OV5647 Night Vision Camera + 2pcs Sensitive infrared light compatible For Raspberry pi 3 camera2254円(送料無料)、こちらが暗視カメラです。5メガピクセル。カメラ両サイドに脱着可能な赤外線LED照明がついてます。このカメラの場合はフラットケーブルコネクタが基板上面についているので、先程のV1カメラとは向きが逆になります。

カメラは固定していないので、やや宙に浮いています。おそらく、上下にもう一枚ずつアクリル板などを重ねて、カメラの固定とバッテリー保護を兼ねてケース化するとよさそうです。右側に緑のLEDが光っているのが確認できると思いますが、とりあえずこの状態で動作確認できました。VNC経由でパソコンからもカメラ起動できましたが、何時間持つのかはまだ計測していないのでわかりません。確かWifiにつないでいる状態でも200mAくらいだったので数時間は持つかと。ただし、長期的な安定性などはまだきちんと検証していないので、その辺の問題はこれからでてくるかもしれません(今回使用した充放電回路もどの程度信用できるかわからないので)。


今回単にスイッチがついただけでも便利になりました。あとは、カメラとの一体化も含めた全体的なケースの制作です。
追記: その後、Aliexpressで以下のようなバッテリー(2086円、送料込み)を見つけました。 AliExpress.com Product - Raspberry Pi Zero 0 W UPS power Expansion board, integrated serial port, power detection



関連:Raspberry Pi Zero Wを購入Raspberry Pi Zero W:IPカメラ実験(Picamera)

2017年9月27日水曜日

Coursera:機械学習コース終了

先月の8/26日にCourseraに登録して、11週あるコースでしたが、32日間でMachine Learningコースを終えました。やはり、評判通り非常に勉強になるコースでした。
教え方が上手であるとか、細かく指導してくれるとか受講者の声が書いてありましたが、まさにそうだと思います。途中その他のコースをちょっとのぞいてみたけれども、やはりこのコースがどれだけ優れているかわかりました。しかも無料でここまでの内容を受講できるというのはすごいことだと思います。以前、ネットを頼りに機械学習を独学していましたが、やはりこのようなコースを受講したほうがずっと早いという感じです。優れた書籍も数多くあると思いますが、書籍を使った勉強だとタイムリミットがないため挫折も多くなってしまいます。人にもよりますが、個人的にはこのようなコースのほうが勉強もはかどりました。
このコースはプログラミングもしながら数式を理解できるので、いままでブラックボックスになっていた部分がかなりはっきりしました。オクターブ言語については、行列計算を楽にしてくれるツールという感じで、今回はじめて使いましたが、すぐに慣れて特に問題ありませんでした。
このコースのいいところは、それほど予備知識なくても一通り機械学習について勉強できるというところだと思います。通常、書籍など買い込んで(買い込んで終わりになってしまうパターンもよくある)で予備知識を得てから学ぶという手順になることが多いとおもいますが、そういった余計な書籍も必要とせず進められました。時間的にも金銭的にも一番ショートカットできるコースだと思います。
やはり教え方が上手いというか、分からない人に分からせようとする熱意みたいなものが感じられます。例えばWikiなどで機械学習について調べてみると、数学的に正確に詳しく書かれていたとしても、分からない人に分からせようという配慮ある表現ではないため理解に苦しみます。このコースは解説がとてもわかり易く(初心者が勘違いしそうな部分は何度も説明してくれたり)、クイズやプログラミング課題も適度な難しさがあって、初心者にとってどの部分を鍛えるのが一番効率いいか分かっているような教え方だと思います。


前半はコースの仕組みやオクターブ言語、そして機械学習そのものにも慣れずにそれなりに時間かかりましたが、後半はかなり順調に進み、授業内容もどちらかというと応用的な方向に移行していったので、思ったより時間がかからず一気に最後まで行ってしまいました。最後の2週は、プログラミング課題もないのですぐに終わってしまい、いきなり今後の楽しみが減ったというか、TV番組の最終回のように少しさびしい感じです。

線形回帰、最急降下法、ロジスティック回帰、正則化、ニューラルネットワーク、サポートベクターマシン、K-平均法、次元削除、PCA、異常検知、強調フィルタリングなどいろんな種類を学びました。複雑な数式も理解できるようになったのはよかったです。

やはりWeek5のバックプロパゲーションまでが大変という感じです。その後は、これまでの内容をベースに応用的に発展させたり、デバッグや評価、あるいは実際のプロジェクトを模倣した演習課題と移行していくので、前半に学んだ基本原理をどのような場面でどのように使うかということも学ぶことができて非常にためになります。

今後は、個人的にはCNNやGANに興味があるので、同じCourseraのDeep Learningコース(有料:$49/月)を受講してみようかと考えています。ここでDeep Learningを学んで、その後はできればGANのような画像生成に進んでいけたらと考えています。

続き:
Coursera Deep Leaning Specialization: Course 1 終了

2017年9月21日木曜日

Coursera:機械学習/サポートベクターマシン

Courseraの機械学習コースを始めてからカリキュラム上ではWeek5ですが、面白いのでどんどん先に進んで現在はWeek7のサポートベクターマシンが終わったところです。全部で11Weekあるコースですが、このサポートベクターマシンでどうやら「教師あり学習」は最後のようで、次のWeek8からは「教師なし学習」へ移行します。

コース前半について:
これまでを振り返ると、コース前半は機械学習の基本となる線形回帰/最急降下法のアルゴリズムを学び、ロジスティック回帰、そしてニューラルネットワークと進みました。途中から過学習を防ぐ正則化という方法を学んだのが、非常に勉強になりました。
基本となる最急降下法の式は上↑のようになりますが(最初この式を見たとき、Σが式中にあるので難しそうなイメージでしたが)、以下の式のように上の式の最後の部分にλの式を追加すると(更に複雑になる)、

自動的に過学習を防ぐ効果があるようで、アルゴリズムとしては一層賢くなったということです。
このコース以前に独学で機械学習を勉強していましたが、ネット検索などすると最初の式は基本の式なので見つけられたのですが、さらなる応用として正則化の式を追加するところまでは、なかなか気づきませんでした。というか、初心者にとっては最初の基本の式だけでも充分勉強になっているので、そこで終わりにしてしまいがちです。やはりこのようなことは独学というよりはコースを通して徐々に蓄積していくのがいいと思いました。

しかしながら、登場してくる式はどんどん複雑になっていきます。独学だとこのような複雑な式が出てくると、先へ進むことをためらってしまいますが、コースの中では何回も登場してくるし、きちんと中身を説明してくれるので理解も深まりつつ、このような複雑な式を見ても驚かなくなってきました。

例えばこれ↑、上の式は正則化されたロジスティック回帰の式。一見複雑に見えますが、ロジスティック回帰でどのように計算しているのかわかっていれば(それほど難しい計算ではない)、特に問題ありません。しかし、その下はWeek4〜5のニューラルネットワークに出て来る式です(相当複雑)。ニューラルネットワークかつ出力が複数あるためΣがたくさん重なっています。これなんかは、独学している最中にネット検索して登場してきたら、大抵の人は見ただけで諦めてしまうと思います。確かにバックプロパゲーションの式も複雑だし、プログラミングで実装する際も面倒です。しかし、一旦プログラミングコードに置き換えると、どのような順番でこの複雑な式が計算されていくかが分かるので、より理解が深まります。このWeek5が前半で最も大変なところかもしれません。個人的にはプログラミングコードに置き換えることで理解が深まりましたが、プログラミングが苦手だとかなり苦戦するかもしれません。
以下が、Week5のバックプロパゲーションのプログラミング課題内のコード。
それぞれの変数を用意し、順を追って計算してくので理解が深まります。式と言っても変数には行列が代入されているので、行列のマトリクスが食い違うとエラーがでてしまいます。しかもニューラルネットワークの場合、バイアス項を追加したり、削除して計算しなければいけない箇所があり、そのまま行列を代入して計算すればいいというわけではないところが面倒です。このコードを実装するために数時間試行錯誤しましたが、その分覚えてしまったという感じです。

ちなみにプログラミング課題は、Atomエディタを使ってやっています。Octaveの課題ファイル、課題説明のPDF、そしてターミナルを分割した画面で同時に開けるので便利です。


Week7/サポートベクターマシン:
カリキュラムの予定より2週間ほど先回りして、教師あり学習の最後であるサポートベクターマシンです。
以前にサポートベクターマシンは少し見たことはあり、マージンを持った決定境界のある分類アルゴリズムという程度の理解でした。あまり線形回帰やロジスティック回帰との区別もできなかったので、特に面白そうとは思っていなかったのですが(直線で区切ることしかできないと思っていた)、サポートベクターマシンにカーネル法が加わると強力なアルゴリズムになるらしく、かなり使えるということらしいです。
しかし、前半の数学的な説明を聞いていると複雑な仕組みとなっているようだったので、先に進む前に、いろいろネットを通して調べたりしてみました。
どうやら数学的にきちんと理解しようとすると、ラグランジュの未定乗数法というさらに難しい概念が出てきて、それによってどのような仕組みになっているのかの理解は深まるのかもしれませんが、あまり理論的な部分に首をつっこむと時間ばかりとられるので、理論的な理解よりも、どのようなことができるのかというような使用法のほうに焦点をあわせていくことにしました。


UdacityのIntro to Machine Learningのサポートベクターマシン:
サポートベクターマシンの数学的な説明によって難解なイメージを持ってしまったため、ほかのコースではどのように教えているのだろうと、以前少しだけ受講してみたUdacityのIntro to Machine Learningのサポートベクターマシンの部分を見てみました。このコースを見るのはもうやめようと思っていましたが、今回は案外役に立ちました。
Lesson3がSVM(サポートベクターマシン)です。このコースのほうが初心者向けという感じです。実際コース内では、ミニクイズやPythonによるプログラミング課題も同時にこなしていきます。
プログラミング課題では、Pythonの機械学習ライブラリであるscikit-learnを用います。プログラミングでは予め用意されたコードに少しだけ書き足すという程度なので、それほどコーディングの勉強にはならないのですが、このライブラリでどのようなことができるのかということを試したりするので、なにができるのかということは分かってきます。当然SVM用の関数も用意されているので、わざわざフルスクラッチでコーディングする必要はありません。いくつかパラメータを渡してあげることで、すぐにカーネル法を使うこともできます。
カーネル法を使うと、こんな感じ↑で複数の領域を曲線で区切ることもできます。パラメータによって、アンダーフィッティング/オーバーフィッティングも簡単に調整できます。

Courseraの授業内でも言ってましたが、数学的な理解を深めなくてもライブラリを使いこなすことはできるので、より実践的な方向性を求めているならば、数学的な原理を追求するよりも応用のスキルを身につけたほうがいいと思います。使用例を見れば、どのようなことができるのかというイメージが湧くので、あとはどこを調整すればいいのかということもわかりやすくなってきます。
ということで、このUdacityのIntro to Machine LearningのLesson3/SVMを一通り見て、大体の概要はつかめたのでよかったです。


再度、Courseraのサポートベクターマシン:
大体のイメージはつかめたので、再度Courseraのコースに戻り、カーネル法から勉強再開しました。カーネル法によってサポートベクターマシンが複雑な分類も可能になるので、これまでの分類アルゴリズムとは違って面白く感じてきました。
しかし、この辺になると、フルスクラッチでSVMを実装するというよりも、便利な既存ライブラリを使って何が可能か、このパラメータをいじるとどうなるのかという、どちらかというと実践的な内容に方向性が変わってきたと言う感じです。
最終的なプログラミング課題もスパムメール判定アルゴリズムについてであり、SVMの仕組みについてというよりも、SVMを使ってどのようにメールの文章をアルゴリズムに組み込んでいくのかという内容でした。最初は難解なイメージがあったので、プログラミング課題も大変なのかと思ったら、案外そうでもなくてあっさり終わってしまいました。


まとめ:
おそらく、Week5のバックプロパゲーションまでが原理的な勉強で、その後は実装したアルゴリズムをどうやって評価するのか、あるいはより良いパラメータの探し方や検証の仕方など、実際に使うことができるようにするために必要な知識やスキルというものへ移行して行った感じです。当然より高度なアルゴリズムを開発することも大事ですが、その使い方や評価も同時にできなければ、有効な結果を出すことができないので、実践的側面についても学ぶことができたのはよかったと思います。

次のWeek8からは教師なし学習なので、さらに面白くなりそうです。やはり、教師あり学習は、答え合わせができるので、その分学習もしやすいアルゴリズムというイメージですが、答え合わせができない教師なし学習によるアルゴリズムにおいて、どうやって答えを見つけていくのか不思議な感じがします。
機械学習を学んでからは数学に対するイメージが変わりました。いままでは数学と言えば、便利な公式があって、長さを知りたければ三平方の定理を使ったり三角関数を使ったりと、求めたいものに応じて公式を使い分けていただけでした。このような計算方法はどちらかというと静的であって、最急降下法のようなコンピュータのループ演算によって動的に答えを導きだす方法を知ったときはかなり新鮮でした。さらには、公式に当てはめて計算するというより、世の中に存在するいろんな数式を部品のように自由自在に組み合わせて、面白い挙動を示すアルゴリズムをつくることもできるということもわかりました。どうしても数学は、これを求めるためにはこの公式が必要という感じで手続きそのものも規則的なイメージがありましたが、優れたアルゴリズムをつくる上でも、もっと自由に計算していいというのが分かってきて、数学もかなり創造的なんだと最近感じでいます。

2017年9月17日日曜日

UdacityのDeep Learningコース(無料)

今日(日曜日)は、Coursera(Machine Learning)のWeek4の締切日ですが、Week4とWeek5を一気にやってしまい、もうすでにWeek6に突入です。Week4からはニューラルネットワークで、Week5には難しいとされるバックプロパゲーションも登場してきました。
使用する言語であるOctaveにも徐々に慣れて来たのですが、いざ動画での数学的な説明をプログラミングコードに置き換えようとすると一筋縄ではいきません。というのも、動画は主に数学的な説明が中心であり、プログラミングとしてどう実装するかまでの説明はあまりありません。プログラミングに関しては、課題文にも多少手ほどきがあり、またサイトには課題ごとのResourcesページがあるので、それを読みながら実装していく感じです(この辺の説明文はすべて英語)。
やはり複雑な行列計算になるので、頭の中に行列のマトリクスがイメージできないとエラーばかりでてしまいます。数学的な数式をコード化するのはまたちょっとテクニックが必要という感じです。なので何回も再提出してようやくクリア。しかし、クリアしたからと言っても、完全に理解したかというと多少怪しいところもあります。なので、バックプロパゲーションについては、forループを使うコード、使わないコードの2種類を書いてみて試してみました。
以前は数式を見てもわからなかったし、当然数式の意味がわからなければ、コードを見ても分かるわけがなかったのですが、いまは見れば分かるというくらいには理解が深まりました。

Udacity: Deep Learningコース(無料):
予定より先に進んでいるので、またUdacityの授業のほうも見ていました。前回の「Intro to Machine Learning」と「Machine Learning」の2つのコースに関しては、概念を理解するにはいいかもしれませんが、プログラミングしながら学ぶという感じではないのでもうやめようかなと(そもそも無料なので辞めても構わない)。その代わりにUdacityにある「Deep Learning」コース(無料:3ヶ月)のほうが面白そうなので少し見てみました。
このコースはGoogleによってつくられたコンテンツのようですが、Googleのエンジニアっぽい人が講師です。やや真面目そうな感じで前述の2つのコースとは違います。レベルもAdvancedなので、ある程度機械学習をやってきた人が見る感じなのだと思います。
内容的には、基礎知識の説明が終わると、すぐにMNIST(手書き文字認識)、そしてデュープニューラルネットワーク、コンボリューショナルニューラルネットワーク・・・と進んでいきます。コンボリューショナルニューラルネットワークに興味があるので(そこまで行けるかわからないけれども)、やってみようかなと。ディープラーニングのコースとなるとだいたいが有料で、このコースだけは無料のため試して見る分にはいいかもしれません。

言語はPython、そしてJupyter notebook(iPython notebook)を使用して、GoogleなのでTensorflowライブラリを用いるようです。Tensorflowに慣れるにはいいかもしれません。Jupyter notebookは以前インストールしてあったので、そのまま使えました。一応細かい説明などしてくれますが、やはり上級者向けだけあって、どんどん先に進んでいきます。なんとなくTensorflowに触れておしまいというコースにも見えなくはないのですが。

現在進めているCourseraのMachine Learningコース(全11週)が終われば、できればディープラーニングへ移行していきたいと考えています。以下は有料ですが、今後の理解度によっては受講してもいいかと。
・Coursera 「Deep Learning」($49/月)
・Udacity 「Deep Learning」($399?)ナノディグリーコース


追記:
もう少しこのUdacityのDeep Learningコースを見続けて見ましたが、Deep Learningの概要を短時間で説明しているという感じでした。プログラミングの課題もいくつかあるのですが、その内容についての細かな説明などはなく、勝手に各自でパラメータを変えてみたりしてという感じです。Lesson3の中ほどでバックプロパゲーションも登場するのですが、約2分間でさらっと説明するだけです(以下がダイアグラム)。
どのような手順で演算していくかまでは説明がありません。ライブラリを使えばすぐに済んでしまうのかもしれませんが、その使い方の説明もないので、おそらくこのコースはざっくりとDeep Learningの紹介をしているレクチャーというかんじで、実際にプログラミングできるようになるためのコースではなさそうです。
Lesson4のコンボリューショナルニューラルネットワークまで見てみましたが、大まかな説明なので期待していたほどの収穫はありませんでした。やはり無料コースであるから、この程度なのかもしれません。
これに比べれば、CourseraのMachine Learningコースは、細かく計算方法まで教えてくれるので、プログラミングしたいという人にはいいと思います。もしくは、ディープラーニングを学ぶなら有料のコースのほうがいいのかもしれません。

2017年9月13日水曜日

Udacityの機械学習コース

前回投稿したCourseraのMachine Learningコース(全11週)を引き続き受講中ですが、Week4のニューラルネットワークは予定より早く終わってしまったので、先回りしてWeek5に入りました。

多少余裕ができたので、他にもこのようなコースがないかと検索していると、オンライン学習サイトとして、Couseraと競合しているUdacityというのもありました。以前はこのようなオンラインコースは、登録も含め面倒なイメージがあって試してみようとも思いませんでした(必要な知識やアルゴリズムなどはネット検索でも充分なので)。しかし今回、試しにCourseraを受講してみると、予想以上にためになるので、このようなオンライン学習サイトも悪くないなと思い始めました。

ということで、Udacityの中にも機械学習やディープラーニングのコースはいくつかあるので、試しにちょっとのぞいてみました。

Udacity:Intro to Machine Learning(無料:全10週間):
まずはこの「Intro to Machine Learning」というコースです。Introと書いてあるので初心者向けっぽいですが、いちおうIntermediate(中級者向け)となっています。
言語はPythonを使用、Pythonについての細かなプログラミング指導はないらしく、プログラミングの知識は多少必要なので中級者という位置づけなのかもしれません。それとできれば統計学の知識もあったほうがいいと言っています。そのためUdacity内の別のコースである「Intro to Descripitive Statisics」や「Intro to Inferential Statistic」も受講すれば手助けになると。
内容的にはこれまでの機械学習という感じで、ナイーブベイズ、サポートベクターマシン、決定木、線形回帰、クラスタリング・・・という流れになっています。

こちらもCourseraと同様に、動画を見て途中にクイズが挿入され、プログラミングコード演習もあります。CourseraのMachine Learningコースと比較すると、動画の画質やシステムそのものはかなり完成度があると言う感じです。
UdacityはGoogleやAmazonなどにも支援されているようで、さすがに潤沢な資金があるのかいろいろ工夫されている印象です。要点だけを説明していく真面目な大学の講義とは違って、ややカジュアルな感じで(たまにジョークなど入れながら)、TVの教育番組を見ているという感じです。楽しみながら(飽きさせずに)学んでいくという工夫がなされているのかもしれません(あるいはエデュテイメント:エデュケーション+エンターテイメントという感じなのかもしれません)。
動画は字幕があるものないもの、ばらつきがあります。日本語の環境はそれほど整っているとは言えません。英語の字幕はあるので、聞き取りにくい場合は英語字幕を手がかりに理解していくと言う感じでしょうか。

このコースは無料なので動画はYoutubeでも見れるようです。一つずつの動画は短いもので1分以内、長くても5分程度です。かなりテンポよく進んでいきます。このテンポの良さで、次の動画また次の動画とついつい見てしまい、気づくと1時間くらい経ってしまいます。延々と長たらしい説明を聞くよりはいいのかもしれません。このテンポの良さも工夫されている点かもしれません。

動画による説明の合間や終わりに、以下のようなクイズ画面が出てきます(画面が突然切り替わる)。

選択方式のクイズもあれば、数値を空欄に入れるタイプもあります。「SUBMIT ANSWER」を押すと正解/不正解が確認できます。不正解になっても特にペナルティなどはないようです。

さらにPythonによるプログラミング演習の画面にも自動で切り替わります。
ブラウザ上でPythonのプログラミングができて、「TEST RUN」を押せば内容を実行できます。Pythonは事前にパソコンにインストールしておく必要がありますが、このコースのために特に設定などせずにすぐに動きました。勉強している内容というよりも、このブラウザ内でPythonコードを実行できる仕組みに感心しました。
CourseraのMachine Learningコースの場合(Octave言語使用)、一旦サイトのリンクからプログラミング課題に必要なファイル群をダウンロードし、各自のエディタやターミナルを使ってプログラミングするという仕組みでした。課題提出はターミナル上からできるので、それほど手間はかからないのですが、ブラウザだけですべて可能なUdacityのこの仕組はかなり便利だと思います。

全体の10%くらいを一気に見てみましたが、Introというだけあって機械学習の予備知識なしで始められるという感じです。多少機械学習をやったことがある人にとっては、余計なジョークや冗長な説明が必要ないとも感じられますが、たまに抜け落ちている知識もあるので、とりあえず勉強してみる分にはいいと思います。UdacityもCourseraもスマホに対応しているので、アプリをインストールすれば、電車などのなかでも受講可能(受講というか普通に動画を見る感じ)です。


Udacity:その他のMachine Learningコース:
先程のコースとは別に機械学習なら以下のようなコースもありました。
強化学習や教師なし学習などのコースも別に用意されているので、もう少し内容を絞って勉強したい場合はこちらのコースがいいのかもしれません。

とりあえず、真ん中のMachine Learningコース(無料:4ヶ月間)をちょっと覗いてみました。
このコースは二人の男性が講師となって機械学習の基礎から教えてくれます。一人の講師が講義してくれるモノローグタイプとは違って、二人の講師がお互いに質問したり、つっこみを入れながらテンポよく説明していきます。やはり、講義というよりは教育番組と言ったノリでしょうか。ただ、その分やや早口の口語表現が多いので英語が聞き取りにくいかもしれません。ただし、しばらく聞いていれば、この人たちの声質に慣れてくるので次第に聞きやすくなってくるとは思います。内容的には、機械学習の初心者に合わせて細かい説明やクイズがあるのでわかりやすいとは思います。


その他の有料コース:
Udacityにもたくさんコースがあり、機械学習のほか、AI、ディープラーニングなどの興味を引くものとして以下。
AIだとこんな感じのコースがあり、レベルもAdvanced(上級者向け)で有料(1ターム/12週間/$800)。無料コースとは違ってナノディグリーという修了証が取得できるようです。おそらくシリコンバレーなどで働くIT関係の人たちが、ここでナノディグリーを取って即戦力となって先端技術領域で活躍できるようなプログラムになっているのかと。会社に入ってからいちいち新米に教育している暇もないので、このようなコースで事前に必要な知識とスキルを身につけておけということでしょうか。コースの説明を見てみても、このスキルを身につければ、最低でもいくらの報酬がもらえる仕事につけるということまで書いてあります。


そしてディープラーニングのコースだと、以下のような感じ。

特にDeep Learningのナノディグリーコース(有料:たぶん$399)は気になります。このコースはそれぞれCNN、RNN、GANなどに分かれた構成になっているので、特に興味のあるGANのコースは受講してみたいと思いますが、もうすでに受講締め切りしており、現在次回受講の予約を受け付けているようです。

講師の一人であるShiraj氏(上画像左)のYoutube動画はたまに見ていたので(このコースの動画だとは知らなかった)、どんな感じか予想できますが、Courseraのdeeplearning.ai(Andrew Ng)という選択肢もあり、お互いに競い合っているような感じに見えます。Udacityとしては、このDeep Learningコースは特に力を入れているのかもしれません。GoogleやAmazonの支援だけではなく、こういったYoutubeで人気のある人たちも巻き込んでより一層オンライン教育プログラムを充実させているようです。しかもかなりの経済効果もありそうです。もはや、教育コンテンツだけでなくエンターテイメントコンテンツ(エデュテイメント)という感じです。


感想:
いろいろ目移りしても仕方ないので、Courseraのコースが終わったら、つぎにどうするか考えてみようと思います。ノリとしては、やや真面目路線のCourseraのほうが好みですが、Udacityのような試みも気になるところではあります。コースの受講内容というよりは、何かを学ぶというスタイルが徐々に変化/進化していて、従来のような書籍(教科書)を購入して学ぶという方法、学校に通って学ぶという方法は、もはや必要ないのかもしれません。
日本国内にもこのようなオンライン学習サイトはありますが(以前Node.jsをドットインストールの動画を見て学習したことがある)、まだまだボトムアップ的な内容が多いようで、ディープラーニングなどのようなコンテンツはあまり見かけたことはありません。やはりこういうコンテンツはアメリカのほうが進んでいるのでしょう。

CourseraやUdacityは魅力的なコースが多いのですが、やはり日本人にとって問題となるのは英語でしょうか。特にプログラミング関係は元々英語表記なので、この際日本語を忘れて(英語の勉強もかねて)、普段から英語を使ったほうがよさそうです(いちいち頭のなかで日本語訳しないようにする)。英語における文学的なニュアンスは難しいと思いますが、このような理系の説明であれば、専門用語以外はそれほど難しい表現もなく端的で明快な英語なのでわかりやすいほうだと思います。特にプログラミングの場合は、コードや数式があるので、それらを見ていけば大体理解できると思います。

2017年9月8日金曜日

CourseraのMachine LearningコースとDeep Learningコース

前回のRaspberry Pi Zero Wのリチウムバッテリー化が中断しているのは、CourseraのMachine Learningコースに多くの時間がとられているためでもあります。


以前から、人工知能には興味があったので、ネットで調べながらTensorFlowなど試してはいました。サンプルを試してみると面白いのですが、細かな設定や自分なりに工夫してコードを書くということになると、基本を知らなければ、このライブラリ自体がブラックボックス化してしまい、それ以上活用することができなくなってしまいます。

個人的には機械学習やディープラーニングで何をしたいかというと、DCGANをつかった画像生成です(TensorFlowをつかったDCGANもできるらしい)。これは何かを解析したり分類したりするというよりは、学習させた画像をもとに、複合的な画像を新たに生成することができるようなので、やや創造的な行為に近いところもあり気になります。
ただ、一気にこのアルゴリズムを理解するには基礎知識がなさすぎなので、きちんと最初から勉強してみようと思ったわけです。当然、基本がわかっていないと機械学習の説明やサンプルコードを見ても、何がなんだか分からなくなってしまいます。

いろいろと検索していると、CouseraのMachine Learningオンラインコース(無料)が評判いいので受講してみようかと。さらには最近同じAndrew Ng先生のDeep Learning(deeplearning.ai)コース(有料:$49/月)も出来たようです。
おそらくこちらはもっと本格的なので、まずは基本からきちんと学ぶということで(無料でもあるし)、Machine Learningコース(11週)をやってみることにしました。Couseraにはその他にもたくさんのコースがあるので、ネット検索で必要な情報を得ながら独学してもいいのですが、このような無料(一部有料の場合もあり)のオンラインコースを利用したほうが効率がよさそうです。

Machine Learningコース(11週:無料):
一週間単位で次のステップに進んでいきます。現在3週目が終わろうとしています(あとはプログラミングの課題を提出するだけ)。毎週日曜日が締め切りなのですが、それまでにトピックごとの授業動画(一つ10分程度を複数)を見て、途中に出題される4択ミニクイズ、トピック最後に出題されるテスト(5問:4問以上正解で合格)ならびにプログラミングによる課題を提出します。受講と言っても、実際に講師と何かをやりとりするわけではないので、自分のペースで学んでいくことができます。いちおうForumがあるので、もしどうしても分からない部分があれば質問すればいいという仕組みです。
無料コースなので、タイミリミットはあるとは言え、遅れてもとくにペナルティがあるというわけではありません。あるいは、どんどん先にすすんでいっても構いません。
授業自体は基本英語ですが、動画には日本語字幕もあるので、英語でよくわからなければ日本語訳に切り替えて、再度動画を見るという感じにしています(復習も兼ねて)。ただ、専門用語が日本語化されると、微妙にニュアンスがかわって、かえってわかりづらいということがよくあります。テストの出題は英語なので、できれば用語などは英語で覚えたほうがいいような気がします。

コースの難易度:
最初の1週目や2週目は入門という感じでやさしいのですが、3週目からは少々難しくなってきました。ただ、内容は高度になっていくとは言え、どんどん便利なアルゴリズムになっていくので面白さと関心度が高まっていきます。やはり説明動画を何回か見て、途中に出てくる公式もその場で覚えていかないとダメと言う感じです。動画を一回みただけだと(10分間程度の理解)、概要を把握するだけになってしまい、覚えた内容をすぐにコード化できるかというと、そうもいきません。つまり、プログラミングできるレベルまでの理解を得るには何回か動画をみたり、ひとつ前に遡ったりしながら、ある程度の反復作業が必要という感じです。見たり読んだりするだけでなく、手書きのノートで覚えていったりしたほうがよさそうです。

Octaveという言語:
例えば、3週目の授業は合計すると3〜4時間あれば終わることになっているのですが(つまり一日30分程度やれば済むという計算になる、場合によっては1日で終わらせることもできる)、きちんと理解するには、その2〜3倍の時間がかかりそうな気がします。個人差にもよるのですが、ある程度復習したり、本や他のサイトなどで理解を深めていかないと、本当に身についたかどうかが怪しいという感じです。実際身についたかどうかは、プログラミング(Octaveという言語で)で書けるかどうかでも確かめることはできると思いますが、Octaveの使い方もある程度平行して勉強しないといけません。Octave自体は難しくないのですが、ちょっとした癖があるので、最初のうちは間違えないようにしないといけないと言う感じです。Octaveだとforループをつかわずに行列計算ができるので便利です。スマホにもOctaveが使えるアプリがあるので、簡単な演算などの練習はスマホで試したりもしています。

学習のペース:
ちょっと数日休んでしまうと、すぐに締め切り日が来てしまうので、毎日少しずつでもいいからコツコツやったほうがよさそうです。継続的に毎日やれば、それだけ頭にも入ってくるので、短期間に何かを覚えるなら、多少時間に追われながらでもやったほうがよさそうです。
コースはスマホでも見ることができるので、電車の中で勉強することも可能です。そうやって暇な時間を使って勉強していくこともできます。大学で数学をやっていたとか、仕事でこのようなことをやっているのであれば理解は早まるとは思いますが、専門領域でもない人にとってはきちんと理解するためには、多少まとまった時間を設けたほうがいいと思います。

まとめ:
おそらく人工知能や機械学習に関心を持っている人は多いと思います。機械学習についての概要を説明してある記事などを読んで、なんとなくどんなものなのかということを理解するまではいいのですが、突然複雑な数式が出てくると急に敷居が高くなって、その手前でやめてしまう人も多いと思います。個人的には、数学は高校以後ほとんどやっていませんが、プログラミングを通して、そのつど必要な計算方法を身につけていった感じです。つまり数学的な数式はあまり得意ではないのですが、それをプログラミングコードに置き換えてあれば理解しやすくなります。
しかし、数学やプログラミングのどちらもやったことがないとなると二重苦で難しいのかもしれません。さらには、Courseraの場合基本英語なので、英語も苦手だと三重苦になるのかもしれません。
とりあえずコース3週目までにも一見複雑な数式はいくつか出てきましたが、どんなことがなされているのか理解していくと、その数式の意味もわかってきました。複雑な数式を見ることにも慣れてきたと言う感じです。
機械学習を学ぶ上で、ネット検索すればたくさんの情報が見つかるので独学も可能ですが、その多くは概要的な説明であったり、要点をまとめたメモのようなものであったり、必ずしもこれから学ぶ人のための記述にはなっていないので、教えることに主眼をおいたCourseraのようなコースのほうがいいと思います。

次週(4週目)からはニューラルネットワークなので楽しみです。以前パーセプトロンまでは独学したのですが、多層パーセプトロンあたりから中断してしまっていたので、ここの壁を乗り越えられればと思っています。ニューラルネットワークあたりから面白くなってくると思うので、この機会に理解を深めておきたいと思います。

関連:
機械学習/Deep Learningについて

Raspberry Pi Zero Wのリチウムポリマーバッテリー化(その1)

Raspberry Pi Zero Wは、小型なのでそのままスタンドアロンで使いたいところですが、外部電源を接続するとUSBケーブルが邪魔だったりするので、なんとかならないかと、Raspberry Pi Zero Wの外形(65x30mm)にあったリチウムポリマーバッテリーを探していました。

Raspberry Pi Zero Wの短手30mmと同じ30mm幅のリチウムポリマーバッテリー。そして、リチウムポリマーバッテリー(3.7V出力)を使うからには、DCDC昇圧コンバーター(3.7V→5.0V)兼充電回路も必要。
青いアクリル板の上にRaspberry Pi Zero Wが固定されていますが、左側の長い部分は後からカットする予定です。

リチウムポリマーバッテリーに関してはアマゾンで探すとドローン用も含めいろいろありますが、やはりAliExpressで探すともっと種類があり少し安いので、今回もAliExpressから購入。
Raspberry Pi Zero WをWifiカメラとして使う予定でもあるので、バッテリー容量は1000mAh程度あったほうがいいかと。そうするとこのサイズのバッテリー(30x50mm程度)だと厚さが8mmくらい。つまりは、Raspberry Pi Zero Wの裏側に昇圧/充電回路とバッテリーを配置するのでこんなサイズにおさめてみました。

Raspberry Pi Zero Wとの電源供給ライン:
Raspberry Pi Zero Wに外部バッテリーから電源供給するには、いくつか方法があるようです。
(1)PimoroniのLipo SHIM(手っ取り早いのはこの部品、しかし充電機能がない)
(2)Raspberry Pi Zero WのGPIO2(5V)とGPIO6(GND)に接続(こちらのサイトを参考に

今回は元々ついているMicroUSB端子に直結している5V電源の端子(基板裏にある2つの端子:PP1とPP6)に接続することにしました。

これは↑、Raspberry Pi Zeroの基板裏面の画像ですが、PP1(5V)とPP6(GND)に接続するといいようです(Raspberry Pi Zero WにはPP1やPP6はプリントされていないのですが同じ位置にある端子です)。ここに直接ハンダづけしてもいいのですが、今回はポゴピンをつかって接続しようと思います。


ポゴピン:
Raspberry Pi Zero Wの端子に直接ハンダづけしてしまうと、交換するさいに面倒なので今回はすぐに脱着可能なポゴピンを間にはさみます。
今回用いたポゴピンは非常に小さく、直径1.5mm(下部の段の直径2mm)、高さ3mm程度です。内蔵してあるスプリングで先端の丸くなっている部分が約1mm沈みます。右側の黒い円筒形のものは、このポゴピンを保護するためのもの?
AliExpress.com Product - 10pcs Ultra small spring loaded pogo pin Diameter 2.3mm 3.0mm heigth brass material with Gold plated 1u 331円(10個セット:送料無料)。

このポゴピンを2mm厚のアクリル板に1.5mmと2mmの段差のある穴を開けて差し込みます(以下)。

そうすると、こんな感じになります。通電テストしてみると大丈夫そうでした。そしてこのポゴピンの底面(上画像では上面)に導線をはんだ付けし、昇圧/充電回路と接続する予定。
ここまでの作業はCNCマシンを使えばよさそうですが、実は手作業でやっています。というのも、まだ試作段階なので、各寸法や部品の配置位置を検証していると言う感じです。


昇圧充電回路:
リチウムポリマーバッテリーの昇圧充電回路もいくつかあります。今回探しているのは、5V電源供給可能かつバッテリー充電可能な回路。
(1)18650モバイルバッテリー内の回路流用(安い:AiExpressで100円程度)
(2)アマゾンでも購入可能なTP4056搭載の回路(安い:100円前後)
(3)Wemos Battery Shield(AliExpressで200円前後)
(4)AliExpressで売っている昇圧充電回路(300円前後)
(5)Adafruits PowerBoost1000 Charger($19.95:かなり高い)
というかんじで、候補はこれくらい。

(1)の18650モバイルバッテリーに使われているUSBコネクタ付きの昇圧充電回路。ダイソーでも300円で売っているようですが、AliExpressなら100円以下。ただしバッテリー(18650)は含まれていません。
AliExpress.com Product - Blue Portable Mini 18650 Battery Charge Box Case 18650 External Backup Battery Charger With Key Chain f#UO87円(送料無料)。安いので、ここから部品取りをするといいのかもしれませんが、実はこの回路、充電時は放電シャットアウトするタイプのようです。つまり充電しながらの使用(放電)はできないようです。
(2)のアマゾンでもよく見かけるTP4056搭載の昇圧充電回路。
HiLetgo 3PCS TP4056 1A リチウム バッテリ 充電ボード ミニ USB 充電器モジュール 4.5V-5.5V [並行輸入品]
HiLetgo
Amazonで詳細を見る
3個で120円なので、かなり安い。中国製基板には品質のばらつきがあるので複数買って比較しながら使うといいと思います(どれかが不良品という場合もあるので)。
この基板は充電放電を同時にできますが、USB接続時(充電中)は出力端子からは4.2Vが出ているようです。そしてUSB充電を外してバッテリーだけで駆動すると3.7Vが出力されます。つまり出力が5Vではないので、5Vが欲しいならさらに昇圧回路が必要となります(降圧して昇圧するためロスが大きい)。

(3)のWemos Battery Shield。
AliExpress.com Product - Battery Shield V1.1.0 For WEMOS D1 mini single lithium battery charging and boost
259円(送料込み)
これはESP8266のWemos D1 mini用のバッテリー充電シールド。この基板だけで充放電可能。
USB接続中は5Vがそのまま出力されるようです。バッテリーだけでの出力については、まだ未検証(ブーストしてくれるようなのでおそらく5V出力)。D1 mini用のシールドなので端子が両端に並んでいるぶん、やや大きい。

(4)AliExpressでその他リチウムバッテリー用の充放電回路を探すと、
こんな回路も売っています。350円(送料無料)。充放電可能で、InputにUSB接続(5V)、Outputが5VなのでそのままRaspberry Pi Zero Wの5V入力に使えそうです。現在の候補はこれ。サイズ:23x15.4mmも比較的小さい。

(5)Adafruit PowerBoost1000 Chargerもよさそうなのですが$19.95と高い。
右下に見えるのが、PowerBoost1000 Charger。これも充放電可能のようで便利そうですが、とにかく高い。それと想定しているサイズより少し大きめなので候補から除外。23x45mm。

ということから、(4)の基板にMicroUSB端子(メス)を接続して使う予定です。それぞれ安いので購入して試してみました。
左から、(4)、(2)、(3)、(1)です。それぞれかなり小さいのですが、(3)のWemos用のバッテリーシールドだけちょっと大きめ。機能的には左端の(4)がいいのですが(5V入力、5V出力、充放電同時可能)、MicroUSB端子(メス)をはんだづけしなければいけない。それと、電源ON-OFFスイッチもつけなければいけない。

リチウムポリマーバッテリー:
バッテリーのほうはというと、様々なサイズがありますが、Raspberry Pi Zero Wのサイズが65x30mmなので、30mm幅のもので1000mAh程度を探すと、

AliExpress.com Product - 3.7V,1000mAH,[803040] PLIB; polymer lithium ion / Li-ion battery for GPS,mp3,mp4,mp5,dvd,bluetooth,model toy616円(送料無料)、40x30mm、厚さ8mmで1000mAhというのがあります。1200mAhだと50x30mmというのもあります。だいたいこのあたりのバッテリーを採用。保護回路もついているので、そのまま使えます。そこそこ厚みはあるのですが、充放電回路のスペースも含めRaspberry Pi Zero Wの外形にはおさまる感じです。
という感じで、パーツ類はほぼ揃ってきたのですが、一旦中断しています。このRaspberry Pi Zero Wとリチウムポリマーバッテリーを一体化して、さらにはカメラも装着して、コンパクトにまとめたIPカメラをつくることがとりあえずの目標です。
追記:続きはこちらへ
関連:Raspberry Pi Zero W:IPカメラ実験(Picamera)

人気の投稿