自己組織化マップで色マップ画像作成

[やること]

自己組織化マップ(Self-Organizing Maps)で、RGBで表現された色データを、教師なし学習して、色マップを作成します。

 

[自己組織化マップの説明]

教師なし学習の手法です。

入力データに関して、近いデータを近くに配置するマップを作成します。

参考資料[1]がわかりやすいです

  

[結果1]

黒、緑、黄、赤、紫、白、水、青の8色を学習させた結果です。

青と水、赤と紫、など、近い色が近くに配置されています。

f:id:wada0421514:20200329114954p:plain

 

[結果2]

以下の12色相環の12色を学習させた結果です。

12色相環を再現できています。

f:id:wada0421514:20200329115153p:plain

f:id:wada0421514:20200329115156p:plain

 

[プログラムについて]

参考資料[2]をかなり参考にしました

import numpy as np
import cv2

class SOM:
def __init__(self, n_side, n_learn=1000, c=0.5):
#n_side:マップのサイズ,n_learn:学習回数,c:更新率
self.n_side = n_side
self.n_learn = n_learn
self.c = c
self.n_weight = self.n_side * self.n_side

def fit(self, input_vector):

input_vector = np.array(input_vector)
n_input = len(input_vector)
n_vector = input_vector.shape[1]

# pointsにはそれぞれの重みの(x,y)座標が入っている(範囲は[0,1))
points = np.array([[i // self.n_side, i % self.n_side] for i in range(self.n_weight)])
points = points / (1.0 * self.n_side)

# 重みベクトルの初期化
self.weight = np.zeros((self.n_weight, n_vector))

# ランダムなインデックス
random_index = np.arange(n_input)
np.random.shuffle(random_index)

for t in range(self.n_learn):

# ランダムに一つ抽出
vec = input_vector[random_index[t % n_input]]

# 勝ちニューロン決定
winner_index = np.argmin(np.linalg.norm(diff, axis=1))
winner_point = points[winner_index]

# 近傍関数の計算
alpha = 1.0 - float(t) / self.n_learn#α=1-t/T:学習回数に応じて単調に減少
delta_point = points - winner_point
dist = np.linalg.norm(delta_point, axis=1)#勝ちニューロンとの距離
h = self.c * alpha * np.exp(- (dist / alpha) ** 2)

# 重みを更新
diff = vec - self.weight# 入力ベクトルと重みの差
self.weight += np.atleast_2d(h).T * diff


if __name__ == "__main__":

    #8色のRGB
    input_vector=[[255,255,255],[255,255,0],[255,0,255],[0,255,255],
                  [0,0,255],[0,255,0],[255,0,0],[0,0,0]]

    #12色相環のRGB
    color_wheel=[[255, 0, 0],[255, 127, 0],[255, 255, 0],[127, 255, 0],
                 [0, 255, 0],[0, 255, 127],[0, 255, 255],[0, 127, 255],
                 [0, 0, 255],[127, 0, 255],[255, 0, 255],[255, 0, 127]]

    # SOMクラスの作成・学習
    n_side = 500 # 一辺の長さ
    som = SOM(n_side, n_learn=1000,c=0.75)
    som.fit(color_wheel)

    # 重みベクトルの取得
    output_imgs = som.weight

    # 重みベクトルを並べて、画像作成
    output_imgs = output_imgs.reshape(n_side, n_side, 3)
    tile = np.zeros((n_side, n_side,3))
    for x in range(n_side):
    for y in range(n_side):
    tile[(x):(x+1), (y):(y+1)] = output_imgs[x, y]

    # 画像の保存
    print(tile)
    cv2.imwrite("tile.png", tile)

  

[参考資料]

[1]自己組織化特徴マップ(SOM)

http://www.sist.ac.jp/~kanakubo/research/neuro/selforganizingmap.html

[2]MNISTの自己組織化マップ(SOM)を作った[Python]-もりとーにのブログ

https://tony-mooori.blogspot.com/2016/01/mnistpython.html

山手線を徒歩で一周した

山手線を徒歩で一周しました。

新宿がスタート、ゴールで外回りで歩きました。

約40キロ、8時間21分かかりました。

f:id:wada0421514:20191120194455p:plain

1. 新宿駅:スタート

大きな駅。なんでもある。雑多。

f:id:wada0421514:20191120194950j:plain

2. 新大久保駅

韓国料理のお店がたくさんある。

新大久保ー高田馬場:きれいなマンション。落ち着いた感じ。

f:id:wada0421514:20191120195930j:plain

3. 高田馬場駅

豚カツ。全体的に低めの建物。とん太。

高田馬場ー目白:住宅街。

f:id:wada0421514:20191120195927j:plain

4. 目白駅

駅前オシャレ。住宅街。住みやすそう。落ち着いた感じ。ケーキ。

f:id:wada0421514:20191120195924j:plain

5. 池袋駅

大きな駅。雑多。なんでもある。飲み屋街。SEIBUビル。

池袋ー大塚:キレイめ。タワマンがあった。

 f:id:wada0421514:20191120195922j:plain

6. 大塚駅

路面電車。落ち着いた感じ。緑多め。カッチャルバッチャル。

f:id:wada0421514:20191120195918j:plain

7. 巣鴨

地味な感じ。

f:id:wada0421514:20191120195914j:plain

8. 駒込駅

地味な感じ。

f:id:wada0421514:20191120195912j:plain

9. 田端駅

地味な感じ。

f:id:wada0421514:20191120195910j:plain

10. 西日暮里駅

神田っぽい。栄えている。

f:id:wada0421514:20191120195907j:plain

11. 日暮里駅

駅前がオシャレ。タワマンがある。

f:id:wada0421514:20191120195902j:plain

12. 鶯谷

駅前にラブホたくさんある。鶯谷苑。

f:id:wada0421514:20191120195859j:plain

13. 上野駅

上野動物園。公園。不忍池。博物館。

f:id:wada0421514:20191120195856j:plain

14. 御徒町駅

神田っぽい。

f:id:wada0421514:20191120195853j:plain

15. 秋葉原駅

大きい駅。オタク。なんでもある。

f:id:wada0421514:20191120195850j:plain

16. 神田駅

線路下に店色々。飲み屋色々。低めの建物多い。

f:id:wada0421514:20191120195848j:plain

17. 東京駅

大きな駅。駅前かっこいい。なんでもある。皇居。

中間地点。ちょっと休憩した。

f:id:wada0421514:20191120195844j:plain

18. 有楽町駅

東京駅の続き見たいな感じ。

f:id:wada0421514:20191120195841j:plain

19. 新橋駅

大きな駅。なんでもある感じ。

この辺りで、脚を痛めた。ラスト10kmくらい、かなりしんどかった。

f:id:wada0421514:20191120195838j:plain

20. 浜松町駅

品川っぽい。

f:id:wada0421514:20191120195836j:plain

21. 田町駅

品川っぽい。大きな駅。

f:id:wada0421514:20191120195833j:plain

22. 品川駅

大きな駅。なんでもある。結構きれい。

f:id:wada0421514:20191120195831j:plain

23. 大崎駅

オシャレ。新しい。キレイ。

f:id:wada0421514:20191120195828j:plain

24. 五反田駅

雑多な感じ。品川っぽい。

f:id:wada0421514:20191120195826j:plain

25. 目黒駅

色々ある感じ。ちょっとオシャレ。

f:id:wada0421514:20191120195823j:plain

26. 恵比寿駅

オシャレ。色々ある。蕃 YORONIKU。

f:id:wada0421514:20191120195821j:plain

27. 渋谷駅

大きな駅。なんでもある。若い。人多い。

f:id:wada0421514:20191120195818j:plain

28. 原宿駅

竹下通り。若い。人多い。

f:id:wada0421514:20191120195816j:plain

29. 代々木駅

新宿駅の続きっぽい。

f:id:wada0421514:20191120195814j:plain

30. 新宿駅:ゴール

f:id:wada0421514:20191120195811j:plain

物体検出+クラス分類で白のトイプードルの画像収集

やること

以下のようなことがやりたいです。

  1. 様々な画像がフォルダに含まれている

    f:id:wada0421514:20191102113725p:plain

  2. 白のトイプードルだけ取り出して保存する

    f:id:wada0421514:20191102113729p:plain

学習

学習用の画像準備

347枚の犬が写っている画像を集めました

各画像にラベルを付けました

  • 白のトイプードル : 164枚

  • それ以外 : 183枚

画像から犬部分を切り出す

犬が小さいと学習に使えないので、画像から犬部分を切り出します

学習済みの物体検出モデルYOLOv3を使いました

クラス分類モデルVGG16を学習する

集めた犬の画像で学習します

50epochで収束しました

バリデーションの精度は95%でした

推論

  1. テスト用の9枚の犬画像があります

    f:id:wada0421514:20191102195624p:plain

  2. 物体検出モデルYOLOv3に入力し、犬部分を切り出します

  3. 今回学習したクラス分類モデルVGG16に切り出した犬画像を入力します

  4. 白のトイプードルの画像のみ取り出すことができました

    f:id:wada0421514:20191102195631p:plain

コード

作成したコードは全てgithubに上げてあります。 github.com

参考文献

qiita.com

www.itd-blog.jp

サブサンプションアーキテクチャによる知的な振る舞いの創発

サブサンプションアーキテクチャの説明

以下の画像がわかりやすいです

 従来の知能ロボットの処理系は、モジュールが縦に並んでいます。センサからの情報をモジュールが1つずつ順に処理して、最後、アクチュエータにつながります。

 それに対して、サブサンプションアーキテクチャは、モジュールが横に並んでいます。複数のモジュールが、同時に、独立に、非同期に、動いている感じです。

f:id:wada0421514:20191003062539p:plain

 

やりたいこと

  • サブサンプションアーキテクチャを試せるシミュレーションソフト、SB-MASEを利用します
  • 知的な振る舞いをするエージェントを作りたいです。つまり、賢そう、複雑そう、考えてそう的な動きをするやつを作りたいです

 

SB-MASEの説明 

2枚目の画像がシミュレーション世界です。赤いやつがエージェントです。

1枚目の画像は、このエージェントの中身です。サブサンプションアーキテクチャでエージェントの動きを構築できます。

f:id:wada0421514:20191003062948p:plain

f:id:wada0421514:20191002174350p:plain

 

やったこと

  • サブサンプションアーキテクチャを1層ずつ重ねていく
  • 最終的に5層にして、「獲物がいないなら待機、直進を繰り返す。いるなら追いかける。見失っても数秒その方向に進む。エージェント」を作る

 

1層
  • WALK:ひたすら直進する

→ひたすら直進する

f:id:wada0421514:20191002174219p:plain

2層
  • WALK:ひたすら直進する
  • AVOID:障害物があったら避ける

→障害物を避けながら、ひたすら直進するf:id:wada0421514:20191002174238p:plain

3層
  • WALK:ひたすら直進する
  • AVOID:障害物があったら避ける
  • PROWL:獲物がいないなら待機。いるなら直進
  • STEER:獲物の方向に向き変更

→獲物がいないなら待機。いるなら追いかける

f:id:wada0421514:20191002174242p:plain

 

4層
  • WALK:ひたすら直進する
  • AVOID:障害物があったら避ける
  • PROWL:獲物がいないなら待機。いるなら直進
  • STEER:獲物の方向に向き変更
  • PROWLKEEP:見失っても、直進を数秒続ける

→獲物がいないなら待機。いるなら追いかける。見失っても数秒その方向に進む。

f:id:wada0421514:20191002174245p:plain

 

5層
  • WALK:ひたすら直進する
  • AVOID:障害物があったら避ける
  • PROWL:獲物がいないなら待機。いるなら直進
  • STEER:獲物の方向に向き変更
  • PROWLKEEP:見失っても、直進を数秒続ける
  • EXPLORE:直進、待機を繰り返す

→獲物がいないなら待機、直進を繰り返す。いるなら追いかける。見失っても数秒その方向に進む。

f:id:wada0421514:20191002174248p:plain

 

動画

以下のリンクで、5層サブサンプションアーキテクチャのエージェントの動きが確認できます。緑のやつです。

youtu.be

 

考察と結論

  • 賢そうな動きをするエージェントを作ることができました
  • 構造はかなりシンプル
  • 推論、記憶などは実現できるのか?
  • ハードウェアレベルで実装して身体性と絡めたい

2019年、学部3年、夏季休暇研究

自分で以下のテーマを設定しました

「夏季休暇の15日間を使って、研究っぽいことをしてください」

この結果についてまとめます。

 

1. やったこと、時間的な流れ

1-4日目

人工知能関連にしようと決めました。人工知能関連の論文を読みました。

その後、サブサンプションアーキテクチャ関連に絞りました。

 

5-8日目

サブサンプションアーキテクチャ関連の論文を読みました。

サブサンプションアーキテクチャを試せるシミュレーションソフト、SB-MASEを見つけました。

具体的なテーマを、「サブサンプションアーキテクチャによる知的な振る舞いの創発」に決めました。

 

9-10日目

SB-MASEで、サブサンプションアーキテクチャを構築、実装しました。

具体的な内容は後ほど、説明します。

 

11-13日目

人工知能学会誌を読みました。201905、201907、201909。

 

14日目

今後の展開について検討しました。

 

15日目

内容をパワポにまとめ、家族に発表しました。

 

2. 成果

・研究の難しさがわかった

・論文を読んだ

・情報収集のやり方がわかった

・研究テーマの実行:サブサンプションアーキテクチャによる知的な振る舞いの創発

 

・研究の難しさがわかった

研究テーマ決定が一番難しく、一番重要

  • 時間内で達成できる内容である必要がある
  • 意味のある研究である必要がある
  • 最終的な目的から、トップダウンに降ろしてくるのが難しい
  • 先行研究がどこまで進んでいるか把握する必要がある

 

・論文を読んだ

7本の論文と、2本の解説を読みました。

  • 論文:テーブル上の物体の片づけを促すためのロボットの振る舞い
  • 論文:医師国家試験自動解答プログラムの処方薬問題への拡張
  • 論文:感情表現を用いた説得対話システム
  • 論文:恒常性創発にむけた自発的同期に基づく振動子の集合体による自律制御
  • 論文:人間型ロボットのキャラクタ表現のための対話の振る舞い制御モデル
  • 論文:対話アンドロイドに対する主観的意見の帰属と対話意欲の関係
  • 論文:追加データを用いない未来の分類器学習法
  • 解説:サブサンプション・アーキテクチャ
  • 解説:サブサンプションアーキテクチャを用いたロボットの制御

 

・情報収集のやり方がわかった

  • 自分の過去の調べ学習を漁る
  • インターネットで検索する
  • 論文、特集、学会誌を読む
  • 人工知能学会、日本ロボット学会に入る
  • キーパーソンについて調べる
  • 海外の有名なコミュニティについて知る

 

・研究テーマ実行:サブサンプションアーキテクチャによる知的な振る舞いの創発

 

以下の記事で紹介します。

person.hatenablog.jp

 

3. 今後について

  • 4年の研究テーマはどうする?
  • 秋学期は何をする?
  • 脳をサブサンプションアーキテクチャでモデル化できる?
  • 方向性は、AGIの実現を目指す、で良いの?
  • 機械学習がビジネス的には強いけど、専門にしないの?

 

4. まとめ

  • 15日間で、情報収集、研究テーマ決定、研究、発表をやった
  • 研究テーマは、SAによる知的な振る舞いの創発
  • 論文を読んだ:論文7、解説2
  • 研究テーマ決定の難しさがわかった
  • 情報収集のやりかたがわかった

 

オススメの芸能人をレコメンドするアプリの実装

2択の質問に5回答えてもらい、その結果をもとにオススメの芸能人をレコメンドするWebアプリを作りました。

 

 

1:アプリの説明

2:実装について

3:感想

4:今後の展開

 

1:アプリの説明                     

STARTボタンを押して解答を始めます。

STARTボタンを押すと、図2のような2択から選択する画面に移動します。画像をクリックすることで選択することができます。5回選択してもらいます。

5回選択すると、図3のような画面に移動します。5回の選択をもとにオススメの芸能人をレコメンド結果を表示します。

 

f:id:wada0421514:20180813150759p:plain

図1 スタート画面

 

f:id:wada0421514:20180813150852p:plain

図2 2択選択画面

 

 

f:id:wada0421514:20180813150906p:plain

図3 レコメンド結果表示画面

 

2:実装について                     

芸能人の画像を集めて、それぞれの芸能人を表現するベクトルをオートエンコーダで学習して、Webページを作りました。

 

3:感想                      

画像を収集するのに苦労しました。WebAPIを使ったのですが、結構時間がとられました。

Webページの実装も手間取りました。レンタルサーバを使ったのですが、まともなWebページの制作は初めてだったので、やり方がさっぱりわからず試行錯誤しました。

ニューラルネットワーク関連の実装は学習や推論ではなく、その前後の準備、インターフェースなどに時間がかかるとよく言われていますが、自分の身をもって実感しました。

 

4:今後の展開                     

このWebアプリに関してやりたかったことがもっとありましたが、今回はこの辺で一旦、完成としました。今後やりたいことは以下です。

 

・レコメンドのアルゴリズムを改善する(現在はかなり単純)

・学習用の画像を増やす(現在は1人100枚前後)

・レコメンドされる芸能人を増やす(現在は500人前後)

・男性芸能人、犬猫など、他の対象にスケールする(現在は女性芸能人のみ)

スマホアプリ版を実装する(現在はWebアプリのみ)

・インターフェースをモダンにする(現在は最低限のみ)

・2択の回答回数を増やす100回などに増やす(現在は5回)

 

強化学習の手法まとめ

強化学習の有名な手法をまとめます。

強化学習とは、知能を、環境によって行動を決定するエージェントと見なして学習する、機械学習の1つです。

 

以前、強化学習の1つである、モンテカルロとQ-Learningは実装したので、そのリンクを貼っておきます。

 

person.hatenablog.jp

 

 

以下の順番で説明します。この他にも、SARSA、DDQN、DuelingDQN、PPOなどいろいろありますが、時間がないので割愛します。

 

1:Q-Learning

2:モンテカルロ

3:DQN

4:A3C

5:UNREAL

 

 

1:Q-Learning

 

Q-LearningはQ関数を利用する手法です。Q関数はある状態sにおける行動aによって決まり、Q(s|a)と表現されます。Q(s|a)はある状態sにおける行動aの適切さを示します。Q(s,a)が一番大きい行動をエージェントは行います。ですから、学習してQ関数の最適なパラメータを得ることで、エージェントは最適な行動がとれるようになります。Q関数は表で表現されます。取り得る状態が10種類、可能な行動が3種類である場合、(10*3)の表です。Q-Learningでは、Q関数は以下の式で更新されます。

Q(s,a)←(1-x)*Q(s,a)+x*(r+y*max(s',a'))

x,yは学習率などのハイパーパラメータです。この式で繰り返し更新することで、適切なQ関数を得ます。

 

2:モンテカルロ

 

Q-Learningと同様に、モンテカルロもある環境のある行動を評価する方法です。しかし、内容はかなり異なります。モンテカルロでは、ある行動を評価する時、実際にその行動が行われたと考えて、報酬が得られるまで、行動を続けます。その結果、得られた報酬をもとにある行動を評価します。オセロであれば、ある一手を評価するために、その一手を打ったとして決着がつくまでゲームをして、これを繰り返すことで勝率を出して、ある一手を評価します。

 

3:DQN(Deep Q-Network)

 

Q-Learningは表で表現されたQ関数を学習する手法です。しかし、表は有限であるため、できることに限りがあります。それを解決するために、Q関数を深層ニューラルネットワークで近似したのがDQNです。

 

4:A3C(Asynchronous Advantage Actor-Critic)

 

DQNにAsynchronous、Adavantage、Actor-Criticを加えた手法です。Adynchronousとは、複数のエージェントを並列に動かして、その結果を集めて学習する方法です。Advantageは数ステップ先まで考慮した報酬の計算方法です。Actor-Criticはある環境である行動をする確率と状態の価値の推定を独立に行うことで、行動が連続的でも対応できるようにする方法です。

 

5:UNREAL(UNsupervised REinforcement and Auxiliary Learning)

 

A3Cのネットワークに直接の目的とは異なる補助タスクを組み込むことで、学習をうまくさせる方法です。DeepMindから発表されたかなり新しい方法です。

 

 

参考にしたリンクを貼っておきます。

 

qiita.com

 

blog.brainpad.co.jp

 

以上、強化学習の手法まとめでした。アドバイス、改善点があればお願いします。