atlab

モノづくりを楽しむ大学生の備忘録。まだまだ初心者です。お手柔らかにお願いします。

C++でニューラルネット(XOR) with Eigen

こんにちは、今回は最近の記事と打って変わってニューラルネットワークについてです。 以前、はじめてのdeep learnigについての記事を書きましたがその続編みたいな記事ですね。

あの記事を書いてから、講義などで人工知能に学んだり、個人的な興味から勉強したりとdeep learningなどを学んでいました。 何かアウトプットをしてみたいと思い、まずはxorでもニューラルネットで組んでみることにしました。

はじめてのdeep Learningではpythonで書かれていましたが、C++を扱えるようになりたかったのでC++で組んでみました。ほとんど初めてのC++だったので少し時間がかかりましたが良い経験になりました。また行列計算を行うためにEigenというライブラリを使用しました。

今回作成したのは、三層ニューラルネットでXORを学習させるといったものです。

実際に、ニューラルネットワークの記述の中身はこちらです。

教師データように論理回路関数をまとめたlogic_circuit.hをダウンロードしていますが、こちらはただ論理回路の役割の関数のため省きます。

今回作製したニューラルネットバッチ処理などの操作はしていない単純な物ですが、行列を用いることにより関数を重ねることで簡単にニューラルネットを組むことができるようなものを作りました。今後はさまざなな手法を取り入れながら発展させて行きたいです。 プログラムは詳しくはこちらをご覧ください。

github.com

自作人工筋肉 その2 材料検討①

こんにちは、今回も前回に引き続き自作人工筋肉についてです。
前回記事

atmos-tic.hatenablog.com

前回の中で試し中と書きましたが、いくつか材料を購入し試しに作って見たので途中経過の報告をしていきたいと思います。前回の動画にもあげられているようにナイロンのテグスが良く使われているようで、ひとまず、周りで見つけたテグスをいろいろと購入してみました。 f:id:atmos-tic:20180114174549j:plain

太さやナイロンでも材質が違いそうなものをいろいろと試していきたいと思います。 今回は以下の2つを試してみました。

  1. テグス
    30号(太さ約0.91mm)
    切断荷重約33.8kg
    まつうら工業株式会社(購入場所:コーナン)

  2. ナイロンコートワイヤー
    ナイロンでコーティングされたワイヤー 線径0.4mm
    貴和製作所(購入場所:東急ハンズ)

f:id:atmos-tic:20180114174645j:plain

これらを選んだ理由としては、実際に使用する上で必要な強度が一番大きいものと実際に制御する上で利点となりそうな伝導性を考えて上記の2つを選びました。

現在、加工環境が悪く加工の様子はお見せできる状況ではないので、ひとまずは加工後の写真をお見せします。まだまだうまく加工ができず試行錯誤の最中ですがなんとか一部をコイル状にすることはできました。

コイル状にした材料を温めると実際に30号テグスでは動きは以下のように観測することができました。実は以前、1号テグスで製作を試みたことがあるのですがその時と比較して動きは激しく良い結果を得られたのではないかと思います。実験環境が整いきらず、冷却時の動きはまだ正確に観測はできていません。

30号テグスの動きは良い感触を得られたものの、形状が太く加工が難しいと感じました。

ナイロンコートワイヤーはコイル状にはできたものの、温めても動く様子は全く見られませんでした。芯は金属ですのでやはり難しいですね。

今回は以上の2つの材料での製作を試みました、まだまだ製作や実験環境が整っておらず大変ですが、これからいろいろ準備した他の用意した材料も試していきたいです。前回、せっかく理論的な面から導入を始めたので、もう少し理論的に材料の選択ができるようにしていきたいところ、、、

他の趣味や勉強なども同時進行でやっておりなかなか時間が取れないところですが、気長にやっていくつもりですのでよろしくお願いします。

自作人工筋肉 その1 エントロピー弾性

あけましておめでとうございます。 今年もたくさん挑戦していこうと思います。

さて今回はタイトルの通り、人工筋肉を自作してみようという記事です。
今までアクチュエータとしてモータばかり扱っていたので何か新しいアクチュエータを使用してみたいと思い、人工筋肉に興味を持ちました。 自作している方を見かけたので、自分も挑戦してみようと思い、これからその過程を記事にしていきたいと思います。

まず今回作成する人工筋肉は、以下の動画のように糸を使用したもの作ってみようと思います。

www.youtube.com

一度作ってみたのですが、工具や実験器具が足らず大したものが作れず、現在準備中です。 今回は製作する人工筋肉がどのような性質を利用したものであるかについて調べたのでまとめていきたいと思います。

今回製作する人工筋肉は、加熱すると収縮し冷却すると膨張するといったものです。通常は加熱によって膨張する現象が多く見られますが、収縮してしまうのです。ゴムの弾性においてよく話されるエントロピー弾性というものによってこの特徴が見られます。

そのエントロピー弾性について見ていきましょう。エントロピー弾性はゴムなどの高分子における性質です。まずは高分子はたくさんの分子鎖で構成されており、その分子鎖1つを一本のひもに見立てて引張った際のエネルギーの変化について考えていきます。
張力fがかかった、長さLのひもが微小変形dLだけ伸長されたときの熱力学第一法則から自由エネルギー変化dUを表すと、

 dU = TdS - pdV + fdL

となります。非圧縮で体積変化がないとします、この時 dV = 0となり、定圧定温下で張力fを表すと以下のようになります。

 f = (\frac{\partial{U}}{\partial{L}})_{p,T} - T (\frac{\partial{S}}{\partial{L}})_{p,T}

この式はマクスウェルの関係式  -(\frac{\partial{S}}{\partial{L}})_{p,T} = (\frac{\partial{f}}{\partial{T}})_{p,T} を用いることにより、以下のように書き換えることができます。この式をケルビンの関係式とも呼ばれているそうです。

 f = (\frac{\partial{U}}{\partial{L}})_{p,T} +  T (\frac{\partial{f}}{\partial{T}})_{p,L}

よって以上の第1項をf_eとして内部エネルギーの変化が原因となるエネルギー弾性、第2項をf_sとしてエントロピー変化が原因となるエントロピー弾性に分けられます。このエントロピー弾性項を確認するとエントロピー弾性は温度に比例することが分かります。

実際の高分子は以下の図のように、たくさんの分子鎖が絡み合っています。この分子鎖がそれぞれが先ほどまで考えていたひものであり図のように集まっています。 f:id:atmos-tic:20180102202700j:plain:w200
エントロピーは煩雑さを示すものと言われています。ひものような形状の高分子が伸長した時の現象を考えます、自然長と比べ伸長時では各分子鎖は引っ張られた状態になり分子鎖は伸長方向に伸び、自然長時でランダムに絡みあっていた分子鎖は伸長時では分子鎖それぞれが整列した状態となり、ランダムな状態から整列した状態となるため、煩雑さを示すエントロピーが減少した状態になってしまうのです。
ここで高分子を加熱した場合を考えます。熱を加えることは高分子内の分子にエネルギーを与え、エントロピーが上昇する方向に動きます。そこでエントロピーの高い自然長に戻る方向、収縮方向に力が働きます。このようにして、加熱によって収縮する人工筋肉が理論づけられます。

今回は人工筋肉の理論的な部分について書きましたが自分のメモ程度に書きましたので、前提知識がたくさんいると思いますがご容赦ください。これからは実験の結果を記録してくことになると思います。目標はとりあえず人間の指型のマシンを動かせるくらいまでできるとよいと思っています。

過去に大学で受けた授業のノートなどと以下の資料を参考にしました。 http://www7b.biglobe.ne.jp/~ftanaka/member/ftanaka/webct/rubber.pdf

2018/01/31更新:説明補足

ESP32でBLE with Arduino (ubuntu )

はじめに

以前から気になっていた、ESP32を今回使用してみました。BLEのサンプルの使用までを紹介していこうと思います。

まずESP32についてですが、
240MHzデュアルコアWi-fiBluetoothを持つという高性能なマイコンでありながら1000円以下で購入できるという、とても魅了的なマイコンです。

今回は秋月さんで購入した以下のDIP化キットを使用します。

Wi−Fiモジュール ESP−WROOM−32 DIP化キット: 無線、高周波関連商品 秋月電子通商 電子部品 ネット通販

今後趣味で扱う、メインマイコンとして使用していきたいです。また今後ROSを使用してみたく、Ubuntuで環境を構築してみました。

開発環境としては以下の環境が挙げられます。

  • ESP-IDF
  • Arduino
  • MicroPython
  • Mongoose OS

先日BLEのライブラリも公開され他のライブラリも豊富だと思われるArduinoを使用しました。

UbuntuArduino

以下のページを参考にしました。以下のページ通りにやるとJavaのupdateやドライバ権限などに問題があるようで、そこを改善することでなんとかArduinoに書き込みを行うことができました。

Arduino - Linux

実際にArduinoに書き込みが成功した様子です。

ESP32に書き込み

続いてESP32に書き込みが行えるようにしました。環境を整えるのには以下のページ通りに行うことで環境を整えることができました。

github.com

 実際にはArduinoIDEを起動し、以下のようにツールからボードを選択することができるようになります。

f:id:atmos-tic:20171225115859p:plain

つづいて書き込みのための回路を組みます。

今回はひとまずブレッドボード上で組み上げました。実際に開発ボードなどを購入しても良かったのですが、手元にUSBシリアル変換モジュールであるFT232RLがあったのでそちらを使用して書き込み用回路を組み上げました。
FT232RL以外にタクトスイッチ×2とプルアップ抵抗10kΩ×1を用意しました。

書き込みに使用するPINとしては電源の3.3VとGND以外に以下の通りです。

  • TXD0 : FT232RLのRXD
  • RXD0 : FT232RLのTXD
  • IO0 : タクトスイッチ+内部プルダウン(押すとGNDに落ちるように)
  • EN  : タクトスイッチ+プルアップ抵抗10kΩ(押すとGNDに落ちるように)

その他に書き込み時にIO2がHighにならないようにします。(内部プルダウン済み)

書き込み時はIO0とIO2、ENをLowにし、その後ENを先にHighにします。
今回の場合は、IO0とENのタクトスイッチを押し、ENのタクトスイッチから先に離します。

実際にこのような回路を組みました。

f:id:atmos-tic:20171225124101j:plain

ESP32 BLE接続

続いてはBLEのサンプルを試していきます。

上記の環境設定でダウンロードされているので、以下のように見ることができます。

今回は

  • BLE_server
  • BLE_uart

の2つを使用しました。

f:id:atmos-tic:20171225125410p:plain

ESP32にプログラムを書き込み、実行します。Bluetoothを使用する際は、消費電流が大きくFT232RLからの給電ではBLEDevice::init()を実行する際にリセットがかかってしまったので注意してください。

ESP32にプログラムを実行後パソコン側で、Bluetoothの接続を行います。

まずはBLEデバイスをスキャンします。以下のコマンドを実行してください。

sudo hcitool lescan

以下の写真のようにデバイスが表示されます。
BLE_uartのサンプルプログラムの場合はUART Serviceと表示されます。これによってESP32がBLEデバイスとして認識されたことが確認できます。

また使用するESP32のアドレスが「30:AE:A4:00:B9:D6」だとわかりました。

このコマンドは終了しないので、Ctrl+CまたはCtrl+Zで終了してください。

 

次に実際に接続を行います。

getttool -b 30:AE:A4:00:B9:D6 -l

gatttollを開きます。

 

そして以下のコマンドで接続します。

connect

Connection successfulと表示されると、接続成功です。自分はここで理由も分からず接続できずに時間を消費しました。もし繋がらない場合はパソコンを再起動をするなどしてみてください。

 

続いて以下のコマンドで確認します。

characteristics

ここで確認した情報でデータを読み取ります。

f:id:atmos-tic:20171225145724p:plain

BLEデータ受信

続いてデータを受信していきたいと思います。

先のcharacteristicsコマンドで得られたデータを活用していきます。
その前にhelpでコマンドを確認しました。T

ESP32のプログラムでCHARACTERISTIC_UUID_TXを設定していたUUIDでのchar value handleを確認します。今回はUUIDは「E400003-B5A3-F393-E0A9-E50E24DCCA9E」ですので「0x002a」でした。そこで以下のコマンドを入力します。

char-read-hnd 0x002a

そこで以下の写真のように値が得られます。このプログラムでは、1000ms間隔で値を表示させるプログラムですので、上のコマンドを何回も実行することで値が更新されていることが確認できました。

f:id:atmos-tic:20171225151909p:plain

今回は、ESP32とのBLE接続の確認のみでしたが、今後更にためしていきたいと思います。

その他の参考資料

kakakikikekeのブログ: 10月 2015

ubuntuからESP32にbluetooth接続して信号を送受信する方法 : 試行錯誤な日々

第70回 ESP-WROOM-32をArduinoで触ってみよう(Bluetooth-BLE接続編) | Device Plus - デバプラ

blog.reinforce-lab.com

UbuntuでLiveUSB

お久しぶりです、サークルなどで忙しくほとんど更新ができていませんでしたが、また更新を再開していこうと思います。

少し近況をお話しますと、競技プログラミングは自分のやりたいこととなんか違うと思ったり、マイクロマウスは時間がなさそうでなにも触っていませんでした。

二ヶ月前にやったことですが、メモ程度に書いていこうと思います。

今回はUbuntuのLive USBを作ったお話です。Robot Operating SystemであるROSを使ってみたく、まずはubuntu に慣れてみよう、ということからでした。

使用したUSBメモリSanDisk USB3.0対応 64GB です。

こんな感じでPCに挿すと光ってかっこいいです。速そうなので選びました。

f:id:atmos-tic:20171223150518j:plain

以下の参考にさせていただいたページでほとんど詰まることなくできたと思います。(覚えてない)

Ubuntu16.04LTSをUSBメモリにインストールする - 余白

今回、作成したLiveUSBは、最終的にはパソコン本体にデュアルブートなどをしたいですが、今回はお試しでやって見ました。レスキュー用などに使えたらよいかと思います。

Twitterでbot!

1年ほど前から、twitterを用いて自分でプログラムしたbotを作ってみたいと挑戦していました。現状、報告としてとりあえず現在の状況を書いてみます。

最初はtwitter上で薦められ、日本産の言語であるRubyを用いたbotを作成していました。しかし、twitterAPIを用いた、プログラムによるtweetができませんでした。

それから、しばらく時間を空けて、現在、人工知能と言ったらPythonがライブラリや書籍がそろっており、適していると思いPythonに書き換えてみるとすぐにtweetまですることができました。

現在は、tweepyというライブラリを用いています。

今は、cronによる定期ツイート、tweepyのstreamingAPIを用いたリアルタイムのリプライに返信、mecabの導入などを行うことができます。

今後は、mecabによる自分に向けられたリプライやタイムラインに流れているtweetを形態素解析によりデータを扱いやすくするプログラムを作成し、ひとまずはマルコフ連鎖による自動文章作成をしてみたいと思います。

ゼロから作るDeep Learning

去年、大学の生協で少し安く売っており、前から興味を持っていたので買ったのですが、読む暇もなく帰省中についに読んだので内容を復習程度にまとめます。

パーセプトロン

パーセプトロンとは、ニューラルネットワークの起源となるアルゴリズムで複数の入力信号を1つの出力信号にするもの。

例えば2入力のパーセプトロンは以下のように図示される。
f:id:atmos-tic:20170223130450j:plain
画像の文字が少し違うのは勘弁です。

図の〇は「ニューロン」、「ノード」と呼ばれている。
{ω_1,ω_2}は各入力信号固有の重み。
出力信号yは入力信号に重みを付けた総和がある限界値を超えた場合に1となります。この限界値を閾値と呼び、θする。
数式で表すと以下のようになる。
{
    \begin{eqnarray}
    y=\left\{ \begin{array}{ll} 
    0 & (ω_1 x_1+ω_2x_2 ≦ θ) \\
    1 & (ω_1 x_1+ω_2x_2 > θ)
  \end{array}\right.
\end{eqnarray}
}

入力信号も0または1として、{ω_1,ω_2}、θを定めることでAND、NAND、ORという論理回路パーセプトロンを使うことで表現できる。

バイアス
{
    \begin{eqnarray}
    y=\left\{ \begin{array}{ll} 
    0 & (b+ω_1 x_1+ω_2x_2 ≦ 0) \\
    1 & (b+ω_1 x_1+ω_2x_2 > 0)
  \end{array}\right.
\end{eqnarray}
}
上の式は、先の式を少し変えたもの。入力信号に{ω_1,ω_2}の重みをつけてb(バイアス)を加え、その値が0を上回れば1を出力し、そうでなければ0を出力するというものです。

多層パーセプトロンによるXORゲート
{y=AND(NAND(x1,x2), OR(x1,x2))}
ように組み合わせることでXORの論理回路を作り出すことをできる。これを多層パーセプトロンという。

ニューラルネットワーク
活性化関数
下の図のh(X)を活性化関数と呼ぶ。入力信号の総和がどのように活性化するか決定する関数。
f:id:atmos-tic:20170223155820j:plain
活性化関数は非線形関数であることが重要。活性化関数が線形関数の場合、ニューラルネットワークの層がどれだけ深くしても意味がなくなる。

ステップ関数
{
    \begin{eqnarray}
    h(x)=\left\{ \begin{array}{ll} 
    0 & (x ≦ 0) \\
    1 & (x > 0)
  \end{array}\right.
\end{eqnarray}
}
シグモイド関数
{h(x)=\frac{1}{1+exp(-x)}}
ReLU関数
{
    \begin{eqnarray}
    h(x)=\left\{ \begin{array}{ll} 
    0 & (x ≦ 0) \\
    x & (x > 0)
  \end{array}\right.
\end{eqnarray}
}

損失関数
ニューラルネットワークがどれだけ不正確を表す関数。正確さを扱うのではなく不正確さを扱うのは、この関数を微分しより正確になる方向にパラメーターを調節するのだが、正確さを扱うとこの微分が0になりやすく扱い辛いため。
損失関数が最小となるパラメータが最適なパラメータとなる。

{y_k}ニューラルネットワークの出力、{t_k}は教師データとして
2乗和誤差
{E=\frac{1}{2}\sum_{k}(y_k - t_k)^2}
交差エントロピー
{E=-\sum_{k}t_k\log(y_k)}

今までは、難しい本を何とか読んでいましたがこの本は分かりやすく説明してあり読んでいて楽しかったです。
あとこの記事で初めてLatex使いました。難しいけど、数式を表現できるのはうれしいですね。