思考ノイズ

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

イヤイヤ期と成長

我が家の2歳児はイヤイヤ期の真っ最中です。

昨日も、彼にとってこの世で一番嫌いであろう歯磨きをしようとしたのですが、かたくなに拒否をされて、手足で最大限の抵抗をしながら、大号泣。私も奥さんも手におえずその日の歯磨きは諦めようということになりました。

しかし、10分後、泣きじゃくりがおおよそ収まりつつもベソをかきながら台所に向かい、「あれとって」との要求が。なにかなと思ったらその先には歯ブラシセットがありました。

イヤイヤ期は彼にとっては抑えることのできない、生理現象と呼んでもよい過程なのだと思います。ただ一旦落ち着いたときに、どのような思考の回しなのかはわからいのですが、「やらなくてはならない事」として気持ちの整理ができたのかと、勝手に解釈しました。そんな彼の成長をみて少しウルっときてしまいました。当方もなかなかのおっさんです。

イヤイヤ期は成長のステップなのだから、こっちもイライラせずに喜べるような心構えでいたいと感じたエピソードでした。

week2 -> More Practice: Univariate Analysis Using NHANES

www.coursera.org

ようやく、Understanding and Visualizing Data with Pythonの2週目のJupyterを使ったPracticeを終わることができました。 Courseraは一週間でキャンセルすればコースの課金はされないので、それを目指してやってましたが、このPandasを使ったデータの表示の練習問題でだいぶ時間がかかることがわかり、あきらめた。次の目標は一回の課金で終わる一か月以内での終了となります。

難しいのですが、正直楽しくやってます。

いままで断片的に取得してきた知識が、こうした授業のカリキュラムで体系的に学ぶことで点が線となっていく感覚がとても気持ち良いのです。

Coursera: What is Data Science? 了

f:id:bython-chogo:20200422223340p:plain

リモートワークの上、タスクも減ってしまい、空きの時間増えちゃいました。もちろん子供の世話や家事もあるのですが、それでもプラスマイナスで余暇ができることが多くなってきました。

せっかくなので今までやりたくても時間の関係でできなかったことをやってみようと思い立ち、以前はてなブックマークで見つけたWeb学習サイトの、Courseraで学習を始めてみることに。

www.coursera.org

機械学習系かと考えていたのですが、せっかくならもっと体系的、俯瞰的なものと考えた末、データサイエンスの入門コースを受けることにしました。手始めに、IBMがホストするWhat is Data Science? を着手したのが一週間前。意外と楽しくできてサクサク進みあっという間に終わりました。いぇい!

内容はData Scienceとは、Date Scientistとは何する人ぞ、といったもので、データから新しい見地を得るエンジニアの技術はもちろん、その内容をきちんとストーリーテリングできるコミュニケーション能力も必要だよ、といったド入門な内容でしたが、ぼんやりしていたData Scientistのお仕事を理解することができました。

このタイミングだから、というのもあるかと思うのですが、Web学習が意外に性に合ってそうということに気づいたのは新しい発見です。今はPythonを使った統計基礎の授業を受けているところです。このままモチベーションをもってガンガン進めていきたいと思ってます。これを機にWeb英語学習もいいかもなぁ。

子どもとリモートワークと外出自粛

コロナではいろんな立場の人たちがそれぞれの苦労を抱えていて、頑張っていると思います。 うちのケースではイヤイヤ期を抱える共働きで両方ともリモートワークとなりました。

仕事は時間で代わりばんこで子供を見るようにしています。 ただ仕事が忙しい時は子供を見ながらメールを打つといった作業が入ってきて、しょうがなしにYou Tubeやとりだめたアンパンマンなどをみせるとしていました。

しかしそれだと子供がずっとテレビ・スマホにかじりつくようになってしまいました。これは中長期的には別の問題を引き起こす、と思うようになりました。外出自粛中である、ということに心を痛めながらも晴れた日には近所の公園にでます。大きくはないのですが、やはり同じような境遇の子供が集まっています。子供はとくにですが、ずっと中にいるというのも精神衛生面の不安があり、親としてはジレンマです。接触を避けるように細心の注意を払いながら、子供の外遊び、中遊び、仕事のバランスをとっていくことしか解決方法がみつかりません。

つくづく、今回のコロナは人間の文化や健康の根幹を揺るがす、いやらしい感染症だと思いながら日々過ごしています。

4月16日

コロナの影響はすさまじく、ブログで日記のエントリーを書くように掻き立てしまった。続くかはわからんですが。

今日は有休をとりました。非常事態宣言により保育園が閉鎖して、共働きと子供のケアを家でやるというまさに非常事態。昨日は結果的にYou Tube漬けにしてしまい返ってイヤイヤ期デビューしたての息子にてこずるようになった。もうしょうがない。テレワーク推奨中の中での有休をとりながら、今日は息子と向き合う。

午前中に近所の公園に連れて行く。同じ状況のような子供がたくさんいる。お気に入りの滑り台を無限ループ。途中でお菓子を与えてのんびり過ごす。いい天気で最高。

お昼を食べたあとはドライブ。好きな電車や乗り物で興奮させながら眠りにいざなう。夜眠れなくならないように一時間半ほどで起こすが、その間CourseraにてDataScientistのWeb授業の続き。Data Mining, Regressionあたりを学習。

Eテレを見た後にまた別の公園に。前に合った同じぐらいの子供と一緒に遊ぶ。まねっこがブームらしく、そのお友達のムーブをコピーし続ける。とても楽しそうだった。

雨が降ってきたので退散。

10時にようやく就寝。昨日は11時だったことを考えると進歩。公園2回行ってようやくこの一時間を引き出せた。。。辛い。

その後Netflixにて、バナナフィッシュと、とある一方通行をみる。やばい、どちらも盛り上がってきた。見たいものが多すぎて時間が足りない。大げさに言うと寿命が足りん。

Covid-19がもたらす新世界秩序

久しぶりの投稿となります。COVID-19について感じたこと。 私もコロナパンデミックの影響を多少なりとも受けていますし、当然のことながら世界で見ても影響を受けていない人はほとんどいない状況なのではないでしょうか。

まだ収束の目途も立っていない状況ではありますが、この2020年というコロナパンデミック前後で社会のスタイルが大きく変わっていくものと想像します。これは最新のNew World Order(新世界秩序)の始まりで、そのきかっけは”やっかいな感染症である”、とだれもが認めるものとなります。

この社会がいかに物理的に人が集合し、接触することでなされていたことがコロナで明確になりました。今回、コロナという要素にその社会の根幹部分がリスクとして浮き彫りにしてしまった事になります。今回の騒動がきっかけに非接触のコミュニケショーン(SUICAやないかい)の進化はすすんでいくでしょう。その変化により、実は非接触でできてしまう、こっちのほうが便利かも、と気づくことが増えていきます。その循環がすすでいくと、もちろんすべてではありませんが、接触型のコミュニケーションは縮小していくことになります。

この接触・非接触のバランスの変動が新しい秩序の土台となりその上で経済・社会・文化の発達が育まれていきます。この環境下で自分はどっちを向いて進むのか、選択していく必要があるのだと感じました。

<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()

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