思考ノイズ

無い知恵を絞りだす。無理はしない。

<Pythonで学ぶ強化学習> DQNサンプルコードでつまづいて、なんとなく解決したメモ

*追記 結局、Tensorflow 2.0への活用は諦めて、Tensorflow 1.15へバージョンを戻すことでサンプルコードが走ったことを確認しました。まだ僕の実力ではこのバージョンアップの改変は早すぎたようです。もう少し精進しますー :)

本屋で衝動買いしたこの本ですが、強化学習について分かりやすくかかれた良本であり、かつサンプルコードなどもGIT HUBにまとめられており、再現も簡単にできて素敵!・・・と思っていたのですが、進めていくうちにバージョン互換性と思われるエラーがでてきました。それを本当に正しいかどうかはわからないのですが、何となく解決した時のメモとなります。問題は次の2つ。それぞれを順番に見ていきます。

  • ValueError: Tried to convert 'y' to a tensor and failed. Error: None values not supported.
  • AttributeError: 'ResourceSummaryWriter' object has no attribute 'add_summary'

著者様のGIT HUB GitHub - icoxfog417/baby-steps-of-rl-ja: Pythonで学ぶ強化学習 -入門から実践まで- サンプルコード

ValueError: Tried to convert 'y' to a tensor and failed. Error: None values not supported.

サンプルコードをとりあえず実行してみたけど次のエラーメッセージが。

Traceback (most recent call last):
  File "dqn_agent.py", line 214, in <module>
    main(args.play, args.test)
  File "dqn_agent.py", line 203, in main
    trainer.train(obs, test_mode=is_test)
  File "dqn_agent.py", line 143, in train
    observe_interval)
  File "C:\Users\ore\Documents\python\github\dqn\baby-steps-of-rl-ja\FN\fn_framework.py", line 127, in train_loop
    self.step(i, step_count, agent, e)
  File "dqn_agent.py", line 159, in step
    self.loss += agent.update(batch, self.gamma)
  File "dqn_agent.py", line 66, in update
    loss = self.model.train_on_batch(states, estimateds)
  File "C:\Users\ore\AppData\Local\Continuum\anaconda3\envs\rl-book\lib\site-packages\tensorflow_core\python\keras\engine\training.py", line 1017, in train_on_batch
    self._make_train_function()
  File "C:\Users\ore\AppData\Local\Continuum\anaconda3\envs\rl-book\lib\site-packages\tensorflow_core\python\keras\engine\training.py", line 2116, in _make_train_function
    params=self._collected_trainable_weights, loss=self.total_loss)
  File "C:\Users\ore\AppData\Local\Continuum\anaconda3\envs\rl-book\lib\site-packages\tensorflow_core\python\keras\optimizers.py", line 476, in get_updates
    grads = self.get_gradients(loss, params)
  File "C:\Users\ore\AppData\Local\Continuum\anaconda3\envs\rl-book\lib\site-packages\tensorflow_core\python\keras\optimizers.py", line 92, in get_gradients
    if None in grads:
  File "C:\Users\ore\AppData\Local\Continuum\anaconda3\envs\rl-book\lib\site-packages\tensorflow_core\python\ops\math_ops.py", line 1336, in tensor_equals
    return gen_math_ops.equal(self, other)
  File "C:\Users\ore\AppData\Local\Continuum\anaconda3\envs\rl-book\lib\site-packages\tensorflow_core\python\ops\gen_math_ops.py", line 3626, in equal
    name=name)
  File "C:\Users\ore\AppData\Local\Continuum\anaconda3\envs\rl-book\lib\site-packages\tensorflow_core\python\framework\op_def_library.py", line 545, in _apply_op_helper
    (input_name, err))
ValueError: Tried to convert 'y' to a tensor and failed. Error: None values not supported.

解決方法は git に記載していました。

tensorflow.python.kerasをtensorflow.kerasに変更 · Issue #37 · icoxfog417/baby-steps-of-rl-ja · GitHub

Tensorflow のバージョンが2.0にあがったことにより、Karasのライブラリを変更する必要があるようです。よかった、これで解決。。。と思ったのですが。

AttributeError: 'ResourceSummaryWriter' object has no attribute 'add_summary'

上の変更をおこなった後、次のエラーが出てしまいました。

Traceback (most recent call last):
  File "dqn_agent.py", line 214, in <module>
    main(args.play, args.test)
  File "dqn_agent.py", line 203, in main
    trainer.train(obs, test_mode=is_test)
  File "dqn_agent.py", line 143, in train
    observe_interval)
  File "C:\Users\ore\Documents\project\dqn\FN\fn_framework.py", line 132, in train_loop
    self.episode_end(i, step_count, agent)
  File "dqn_agent.py", line 166, in episode_end
    self.logger.write(self.training_count, "loss", self.loss)
  File "C:\Users\ore\Documents\project\dqn\FN\fn_framework.py", line 254, in write
    self.writer.add_summary(summary, index)
AttributeError: 'ResourceSummaryWriter' object has no attribute 'add_summary'

ここの解決には時間がかかりました。結局原因をしっかりとつかむことはできなかったのですが、予想としては最初の問題と同じようにTensorBoardのバージョン 2.0 の互換性が関係しているのかと思ってます。Tensorboardは実行したデータを表示するための機能ではあるので、機械学習の本質的には影響しないのですが、ビジュアルを使った評価がなくてはより正確な機械学習の最適化はできなさそうなので、必須といっても過言ではないでしょう。

とりあえず、fn_framework.py を以下のように変更することで動くことは確認しました。ただ、この結果が目的に合っているかの検証はできていません。ぶっちゃけ、これ書いている今もスクリプトぶん回している最中です。

  1. fn_framework.py 255行あたり - writer関数内
        with self.writer.as_default():
            tf.summary.scalar(name, value, index)
        self.writer.flush()
  1. fn_framework.py 275行あたり - write_image関数内
    def write_image(self, index, name, frames):
        # Deal with a 'frames' as a list of sequential gray scaled image.
        last_frames = [f[:, :, -1] for f in frames]
        height, width = last_frames[-1].shape
        if np.min(last_frames[-1]) < 0:
            scale = 127 / np.abs(last_frames[-1]).max()
            offset = 128
        else:
            scale = 255 / np.max(last_frames[-1])
            offset = 0
        channel = 1  # gray scale
        tag = "frames_at_training_{}".format(index)
        values = []
        images = []

        with self.writer.as_default():
            tf.summary.image(name, tf.reshape(last_frames, [len(last_frames), height, width, channel]), index)
        self.writer.flush()

はてさて、これでエラーを出さずに回すことができたのですが、この修正がどこまで正しいのかは検証できていません。

UbuntuでWifi sniffをするためにやったこと

仕事の関連でWifi snifferの環境を構築する必要がでてきた。*1。 いろいろ試行錯誤して知識が積み重なったのでここにまとめてみる。

試した環境: - 環境はUbuntu 18.04.3LTS でシステムはもともとWin10が入っていた市販のノートPC(FMV LIFEBOOK UH75)にインストール。 - Wifiは内臓の Intel Dual Band Wireless-AC 8265 と、USBドングルのNETGEAR A6210の2パターン

monitor mode の設定

外部のwifiパケットをキャプチャするためにはWifiインターフェイスをMonitor Modeに変更する必要がある。(通常はManaged Mode)

  • iwconfigコマンドでの設定

現在のインターフェイスをMonitorモードにかえる。一旦インターフェイスをInaciveにしてからMonitorモードに変更、そしてアップをおこなう。

sudo ifconfig wlp2s0 down
sudo iwconfig wlp2s0 mode monitor
sudo ifconfig wlp2s0 up
  • iwコマンドでの設定

iw コマンドによりmonitor modeのWirelessのInterfaceを追加する方法。ここではmon0として追加。

sudo iw wlp2s0 interface add mon0 type monitor
sudo ifconfig mon0 up
  • airmon-ngの設定

aircrack-ngパッケージに含まれるairmon-ngでのMonitorモードの設定。自動的にMonitorモードのインターフェイスが新しい名前で追加される。

sudo airmon-ng start wlp2s0

どの方法でも iwconfig で monitor mode の確認ができる。

wlp2s0    IEEE 802.11  ESSID:"RHYMESTER"  
          Mode:Managed  Frequency:5.58 GHz  Access Point: xx:xx:xx:xx:xx:xx   
          Bit Rate=866.7 Mb/s   Tx-Power=22 dBm   
          Retry short limit:7   RTS thr:off   Fragment thr:off
          Power Management:on
          Link Quality=66/70  Signal level=-44 dBm  
          Rx invalid nwid:0  Rx invalid crypt:0  Rx invalid frag:0
          Tx excessive retries:0  Invalid misc:40   Missed beacon:0

Wifi モジュールの選択

  • Intel Dual Band Wireless-AC8265 (内蔵)

システム内蔵のモジュール。Linux入れとけばどんなモジュールでもSniffできると考えていたが、実際とれるパケットは多くなかった。WifiモジュールをManagedモードに戻すバッチファイルを実行するとそのタイミングだけパケットがおおくキャプチャできるようにみえたのだが、何がトリガになっていたのかは不明。

  • NETGEAR A6210 (USB 外付け)

上記のあと、ダメ元で使ってみたら、常時Sniffをしている状態になったのでびっくりした。ただ下のさいとによると、これでも制限があるようで、A6200のほうがよいらしいけど、古いから手にはいらなさそう。

monitor mode WiFi cards under windows with Acrylic

製品によってかなり個性が違うようで、今後Wifi6関連でもこのあたりの情報は仕入れて行く必要があると感じる。

Sniffソフトの設定

とりあえず、いかの3つで動作を確認しました。

  • Wireshake

言わずとしれた、King of パケットキャプチャソフト。Monitorモードに設定したInterfaceを指定すると、802.11のパケットもキャプチャできる。

  • Scapy

Python用のLibrary。自分で細かいフィルタをかけるときに便利そう。とりあえずサンプルスクリプトとして、WebであったBeaconからAPのリストアップするスクリプトので動作を確認。

  • airodump-ng

現在のSSIDのリアルタイム情報を表示するコマンドラインツール。使いやすくわかりやすい。チャネル指定してもFilterがうまくできないのが今の悩み。

  • Kismet

超高機能なSnffプログラム。まだ動作について理解しきれていないが、最低限動いていることを確認した。このツールに関して言えば、monitor mode用に追加したインターフェイス(mon0 など)ではうまくキャプチャできず、もとからあった物理インターフェイスでの動作を確認できた。

*1:正確に言うと、必要ではないのだが、あったほうが断然はかどるといった感じ

Pythonと機械学習の学習について地盤固めのロードマップ <具体的なプラン編>

bython-chogo.hatenablog.com

実際に以下の順番で進めていこうかと思ってます。ただまだ実際に自分の目的にあっている内容なのか不明確なものもあるのでそこは柔軟に変更していくつもりです。 特に、後半はデータ基盤エンジニアに適切な内容とのことで、そこが自分の進みたい方向性なのか、もう少し時間をかけて吟味してみたいです。 目標は5か月。来年の3月までには一通りこなしていければと考えています。

エンジニアリングの基礎

まずはPythonを手段とした機械学習のためのエンジニアリングの知識やスキル地盤固め

独学プログラマー Python言語の基本から仕事のやり方まで

独学プログラマー Python言語の基本から仕事のやり方まで

もうすでに通読しました。エントリ上げる予定

機械学習に食わせるデータの前処理をまとめた本と理解してますが、RとSQLも入ってくるので、そこをどこまで掘り下げるかは方向性を決めたいです。

前々から興味があった本。プログラムはプログラマーのものではなく、オフィスワーカーが当たり前のようにつかえるようになれば、生産性は確実に向上するとは前々から考えていましたので、この視点の本はよいと思いました。

機械学習理論の基礎

この手の本はすでにたくさん持っているので、どこまで追加して買う必要があるのかとは思うのですが、あまりブレずに道に乗ってすすんだほうがよさげかなと考えています。

見て試してわかる機械学習アルゴリズムの仕組み 機械学習図鑑

見て試してわかる機械学習アルゴリズムの仕組み 機械学習図鑑

現場で使える! Python機械学習入門 機械学習アルゴリズムの理論と実践 (AI & TECHNOLOGY)

現場で使える! Python機械学習入門 機械学習アルゴリズムの理論と実践 (AI & TECHNOLOGY)

実務系

機械学習のための特徴量エンジニアリング ―その原理とPythonによる実践 (オライリー・ジャパン)

機械学習のための特徴量エンジニアリング ―その原理とPythonによる実践 (オライリー・ジャパン)

これ、興味あるんです。特徴量をどこから引っ張ってくるのか、ロウデータからどこに目をつけるべきなのか。

データ基盤エンジニアリング

このあたりはやるべきか再検討はしようかと考えています。正直タイトルのワードがなんたるかもよくわかっていないというのが正直なところとなります。

データ指向アプリケーションデザイン ―信頼性、拡張性、保守性の高い分散システム設計の原理

データ指向アプリケーションデザイン ―信頼性、拡張性、保守性の高い分散システム設計の原理

SRE サイトリライアビリティエンジニアリング ―Googleの信頼性を支えるエンジニアリングチーム

SRE サイトリライアビリティエンジニアリング ―Googleの信頼性を支えるエンジニアリングチーム

入門 監視 ―モダンなモニタリングのためのデザインパターン

入門 監視 ―モダンなモニタリングのためのデザインパターン

入門 PySpark ―PythonとJupyterで活用するSpark 2エコシステム

入門 PySpark ―PythonとJupyterで活用するSpark 2エコシステム

Pythonと機械学習の学習について地盤固めのロードマップ <前置き>

Pythonが好きで機械学習が好きで、このスキルが欲しいと思いながら漠然と考えて特にプランも立てないままよさげな本を買っては試しで数年たってしまっていました。その結果、断片的な知識は確実についてきたのかなと考えていますが、技術人材としてご飯を食べれるようなスキルをもっているかというととても程遠いかなという主観をもっています。いや、そもそもそういう気はなかったのですが、せっかくやるからにはその道にすすないにしろ、そこを目標に筋道を立ててたほうがよいよなーともやもとと考える日々。

もう一つ、機械学習の技術的なスキルをもった人材、というものに進むのに抵抗があるのは自分の年です。アラフォーに差し掛かり、小さな子供もいる状態でいまさらレッドオーシャンの海を深く潜っていってどうなるものか、という気持ちがありました。

そんなもやもやの中、機械学習やAIは何たるか、という情報もこなれてきて、幸か不幸かもうすでに技術としての過渡期はすぎているかと思います。学習リソースは増え続け、学習法の情報もでてきています。

そして、一つの転機になったは、機械学習ではないですが仕事でPythonを書くという機会がたまたまあり、普段はメールでのお客様対応を死んだ目でおこなっていた私の労働意欲をかぎたてるものでした。ひらったくいうと、やりがいのある仕事ってやつでした。べつにプログラムや、機械学習をメインでご飯を食べなくても、また将来あるかもしれない、こうしたチャンスにきちっと向き合えるためのベースアップをしてみたい。やり続ければ、おっさんでもおじいちゃんでも、こうしたやりがいのある仕事の道をこじあけるチャンスがあるかも、と考えるようになるようになっていきました。だめなら趣味でもいいんです。好きなことをやっていて、チャンスが回った時にきっちりこたえられるか、が重要。

そこで、自分のPythonならびに機械学習スキルアップを目的とした、学習のロードマップをきちんと作ってみようとおもいました。まずはスキルの地固め。つぎはぎな自分の知識をもう一度塗りなおして、スタート地点に立つための、基礎的な知識とスキルをつけていくことが目標。そしてベースは以前にほっとエントリーにあがっていた、以下のエントリーとなります。

shinyorke.hatenablog.com

で、前からうすうすは感づいていて、今回思考としてまとめられたこととして、僕の機械学習勉強のモチベーションのベクトルって少しおかしいんです。「プログラミングを使って、機械学習を実行したい。そのためにはデータ処理の知識を学ばなくてはいけない。」。機械学習に携わるひとたちは多分、データ処理がモチベーションで、その方法として機械学習を使うんですよね。そのばあい、データ処理の知識は多かれ少なかれあるものなのですが、私はそこをほぼゼロから学ばなくてはならない。学習ロードマップを考えるときはそこ考えておく必要があります。

肝心のロードマップは次のエントリにしたいと思います。前置きが長くなってしまいました。「1つの関数には1つのことだけさせよう」、独学プログラマーの言でもあります。

それでもって、自分の学習にたいしてどうだったか評価をしていく必要があります。あまり学習成果があがらなくてもそれはそれでよいのです。ただ、なぜかをきっちりと精査したうえで次の学習プランに反映していく必要があります。それはこのブログに記載をしていければと考えています。

うしろシティ星のギガボディ 2019年9月4日

うしろシティ放送で自分たちの10年間の芸歴において、アイドル的な売れ方・売られ方と、お笑い芸人としてのプライドの狭間の葛藤があり、仲が悪くなっていることを笑いを交えながら語っていました。

自分たちの仕事の売れ方・事務所の売られ方が純粋なお笑い芸人というよりも、若い女性人気の高いアイドル的(=ワーキャー)な立ち位置が先行していることにモヤモヤがあったようです。特に金子さんは芸人としてのプライドが先行してティーン雑誌の写真撮影でカメラをにらみつけていたりと態度にでてしまっていたとのこと。 一方の阿諏訪さんはバイトをしなくてもギリギリ食べていける状態で、尖ることでこのチャンスを逃したらもうこの業界で仕事をすることができなくなるという危機感から求められる仕事を受け入れていくスタンスのようでした。当然、意見が合わないので二人の仲も悪くなっていったようです。

したい仕事と、求められる仕事(=お金をもらえる仕事)の葛藤はサラリーマンでもよくある話で、テレビ・ラジオにでているお笑い芸人も同じ悩みがあるんだと感心しました。いわゆるキャリアパスの視点は共通なんでしょうね・・・。

またハライチ岩井さんから受けた言葉も印象に残っているようです。 「女に媚を売った匂いは、時間がたってもとれないぞ」

辛辣・・・!

話は転がり、ワーキャーサイドの視点から、芸人要素も入っていることで、自分たちが完全にワーキャーにも振り切れていない、半端ものだという反省がはっいてから、10年たったいま変化がおきる、の振りが入りました。そして、サンリオのキャラクターになることが発表さました。

どうやら10年ワーキャーのほうに完全に振り切れるようですw

オードリーのオールナイトニッポン 8月31日

今回のオードリーのANNは控えに行って神回だったと思います。

今回の放送はむつみ荘からの生放送。春日さんが数か月まえまでの約20年住んでいた、阿佐ヶ谷で家賃4万円を切るアパートです。引っ越してからも定期的に前を通り様子をみるという春日さん、それくらい思い入れが強いようで、オフィシャルにまた部屋に入れてうれしいのか生放送の声も弾んでいるように聞こえました。 オードリーが2008年のM-1で注目を浴びてからテレビの仕事が増えて、大きな部屋に住むのに十分な収入が入っているのにも関わらず、結婚をする今年2019年までずっと住み続けたアパートになのでなかなか気持ちが振り切れない気持ちも理解できます。

一方の若林さんも、まだ無名の芸人時代にこの部屋で数名のファンをいれて単独ライブを行ったり、ネタを考えたり、売れてからはことあるごとにロケで入ったりと芸人の仕事での訪問ももちろん、プライベートでのこの部屋の思い出を語っていたのが印象的でした。

面白かったのがこの部屋に入って思い出したというクリスマスのエピソード。彼女とケーキを買ってラブホテルに行こうとしたがどこも満室、途方に暮れた若林さんは春日さんに連絡して3時間だけむつみ荘を借りることに。3時間だけなので、急いで行為を終えてからケーキを食べようとしたら、古い木造のアパートがよく揺れたのか、ケーキの上のサンタがうつぶせで白いクリームに埋った状態に。それをみて映画のファーゴの表紙だと思っていたという思い出話をしていました。

このような二人の思い出話があふれて止まりませんでした。

家とか部屋の思い出はそれまでの生活とか人生とかを直結する場所なんだと改めて感じました。オードリーにとってむつみ荘は売れる前の10年と売れてからの10年の酸いと甘いが詰まっていて、その部屋からの放送はかれらの芸人人生のエピソードを楽しくきける神回となったと思います。

ハナコのオールナイトニッポン0 2019年8月24日

週替わりの土曜ANN0でハナコがでているのをRadikoで視聴。 ハナコ、名前はよく聞きますがコントとかみたことがなかったのですが、初ANNなのに堂々としたラジオっぷりで、面白かったです。

三人のバランスの良さがとてもよかった。特に秋山さんのまわし、適切な相槌・つっこみがうまく入るので話が滞りなく回っている感じでした。ここの軸がしっかりしているので、菊田さんの狙いだか天然だかわからないプチ・クズエピソードやボケがうまく笑いに昇華できていて聞いててハラハラするところがなかった。岡部さんはあまり話に入ってこないけど、口を開いたときには適切な分析が話に組み込まれて話に厚みができて次への菊田のボケへのトスが上がっている感じです。

個人的にはラジオ芸人の新星となりうりそうと感じました。生のリスナーのリアクションとの絡み方もうまそうなので、次のレギュラーゼロ枠が一番よさそう?期待しています。