宇宙の渚を眺めるエンジニアのブログ

技術的な備忘録や、日々思ったこと、たまに宇宙関連について綴る

Keras のBatchNormalization レイヤーのバグ?

Keras(version 2.2.4)でBatchNormarizationを下のようにかけようとして、

model = BatchNormalization(axis=1)(model)

次のようなエラーが出た。

Shape must be rank 1 but is rank 0 for 'batch_normalization_1/cond/Reshape_4' (op: 'Reshape') with input shapes: [1,96,1,1], [].
Traceback (most recent call last):
  File "/home/hirotoshi/.pyenv/versions/anaconda3-2019.10/lib/python3.6/site-packages/tqdm/std.py", line 1039, in __del__
  File "/home/hirotoshi/.pyenv/versions/anaconda3-2019.10/lib/python3.6/site-packages/tqdm/std.py", line 1223, in close
  File "/home/hirotoshi/.pyenv/versions/anaconda3-2019.10/lib/python3.6/site-packages/tqdm/std.py", line 555, in _decr_instances
  File "/home/hirotoshi/.pyenv/versions/anaconda3-2019.10/lib/python3.6/site-packages/tqdm/_monitor.py", line 51, in exit
  File "/home/hirotoshi/.pyenv/versions/anaconda3-2019.10/lib/python3.6/threading.py", line 521, in set
  File "/home/hirotoshi/.pyenv/versions/anaconda3-2019.10/lib/python3.6/threading.py", line 364, in notify_all
  File "/home/hirotoshi/.pyenv/versions/anaconda3-2019.10/lib/python3.6/threading.py", line 347, in notify
TypeError: 'NoneType' object is not callable

入力 tensor の shape 等には問題なし。

https://github.com/keras-team/keras/issues/10648

を参考に、 Keras のライブラリ中の tensorflow_backend.py の "()"を"[]"に変更することでバグが解消された。該当行は、1908,1910,1914,1918。バージョンによっては、行が若干違うかも。

2019年を振り返ってみる

暇なので、この1年で起こったこと、やったことや身につけたスキル等を振り返ってみる。

Multi-Head Self-Attentionを用いたSNLIタスク への挑戦

機械学習の勉強のために、年末年始の休暇を使って、Multi-Head Self-Attentionを用いて SNLI タスクを実行してみた。 論文を読んでKerasのレイヤーを作るのができるようになったのと、ある程度の考察ができたのが満足。 記事は以下 hiro-uchi.hatenablog.com

ハッカソンに初参加

2月に初めてハッカソン(Geospatial Hackers Program 福井)に参加してみた。短い時間で、それなりに動くものを、初めて会う人と協力して作れたことが非常に自身になった。ブログ内では書けていなかったが、このハッカソンには続きがあって、3月に各地域で優秀だったチームが集まってデモを実施。そこで自分のチームは最優秀賞を手に入れることができた。ハッカソン後も時間をかけてアプリをアップデートしていたのでそれが実になった。
ハッカソンに関する記事は以下

hiro-uchi.hatenablog.com

日商簿記2級に合格

ふと思い立って、知識0から日商簿記2級に挑戦して無事に合格した。学習期間は1.5~2ヶ月、学習時間は150時間前後だった。役立てるつもりは特に無いが、どこかで役に立ったら面白い。
記事は以下

hiro-uchi.hatenablog.com

AWS の勉強

Udemy のオンラインコースAWSを学習した。現状は仕事で使用したりはしていないが、広く(浅くだが)身につけた知識自体は少し役に立っている。

宇宙天気の予測プロジェクトを開始

宇宙天気(というと大仰だが、単に磁気嵐の指数)を予測するプロジェクトを開始した。データを集めて、簡単なモデルを作るところまでやったが、他のことに手をつけて進んでいない。2020年は時間をかけて進めたい。

Electron + Vue.js でのアプリ作成

Electron + Vue.js で OpenCVをビジュアルプログラミングするアプリを作成した。githubはこちら。Qiitaに上げたところ、バズってデイリートレンドのトップになったので驚いた。初めて本格的に Vue.js を触ってみたが、その可能性を感じた。また、日々の作業時間をメモりながら進めたのもそれなりに手応えを感じた。

qiita.com

DDDの勉強やベイズ統計の勉強

社内勉強会で DDD(ドメイン駆動設計) や ベイズ統計について勉強して発表した。本ブログでもどこかでまとめられたらといいと思っている。DDDについては、仕事でも自分の書くコードにはそのスタイルを導入している(いわゆる軽量DDDっていうやつ?)。もっとつきつめて理解していきたい。

第一子誕生

これだけプライベートな話だが、10月末に第一子が誕生した。女の子。いろいろあったが、無事生まれてきてよかった。大変だとは思うが頑張っていこう。

30歳になった

驚くべきことに、自分も30歳になってしまった。といってもとくに変わったと感じることはないが、少しずつ衰えを感じるようになっていくのだろう。

2020年に向けて

2020年の前半までは力を蓄えて、後半から外に目を向けていきたいと思っている所存。つくりたいアプリ、勉強したいことがまだまだある。取捨選択しつつ、自分を信じてやるべきことをやっていく。

pyinstaller --onefile で PermissionError が出たときの解決法

pyinstaller --onefile {path-to-src}/main.py をしようとしたときに、

(中略)
PermissionError: [Errno 1] Operation not permitted: '{path-to-src}/dist/main'

が出て困った。
その前に pyinstaller main.py を実行しており、すでに{path-to-src}/dist/mainディレクトリができていたので、そのディレクトリを消去すると、エラーが解決できた。

pyenv install 時の zlib 関連のエラーを解決

要約

pyenv install {python-version} で特定のバージョンの python をインストールしようとしたら、

zipimport.ZipImportError: can't decompress data; zlib not available

というエラーが出た。環境は、MacOS Catalina。 pyenv は Homebrew で入れていたので

brew upgrade  pyenv

としたらエラーが解決できた。

解決までの流れ

そもそも最初は、MacOS Mojaveの状態で

zipimport.ZipImportError: can't decompress data; zlib not available

のエラーが出ていた。このエラーで検索すると、

sudo installer -pkg /Library/Developer/CommandLineTools/Packages/macOS_SDK_headers_for_macOS_10.14.pkg -target /

すればいいよ!みたいな記事が多数出ていたので、それに従ったが、これでもエラーが出ておりうまくいかず。

半ばやけになって、ひとまず Catalina にアップグレード。もちろん、それでも上記のエラーが出続けた。
ただし、Catalina では /Library/Developer/CommandLineTools/Packages...というディレクトリは存在しなくなるので、上記の解決策はまず違うだろうと思いたった。

よく考えたら、pyenvを全くアップグレードできていないと思い、要約のとおりアップグレードしたら成功。結局1日かかってしまった...(泣)

「iPhoneを探す」が役に立った話

今日、バスに乗ってる最中にiPhoneを触っていたのにもかかわらず、バスを降りるときには無くなっていた事案が発生。 ポケット、リュック等にもなし。座席を結構しっかり調べても見当たらず。バスの運行もあったのでひとまずその場は諦めた。

あとでバス会社に電話して探してもらっても、「見当たりません」と言われた。これはマズイ。

無くなった経緯を考えると、絶対バスのどこかにあるはずだと思い、ダメ元で「iPhoneを探す」機能をつかってみると、なんとバス会社の車庫にあることが地図上で判明。 これを機にもう一度探してもらい、かなり見つかりづらい場所で発見して返してもらうことができた。

iPhoneを探す」機能は、オフラインでは使えないっぽいので、なくしたら基本的にあんまり使えないかな?と思っていたけど、今回はバス内のWi-fiにつながっていたため発見することができた。Apple に感謝するとともに、こういう設定は面倒くさがらずしとくべきだな、と思った。

LibreOffice Calc で 日付に任意の時間を足す(引く)方法

例えば、LibreOffice Calcで2019-07-15 20:20 とか定義されているセル(A1)があったとして、これに10分とか足したセル(B1)を作りたい!といったときに、B1のセルの定義をどうすればいいかというと、

= A1 + 10/60/24

ってするといいらしい。引きたい場合は、+の部分を-にする。これは、1.0が1日を表しているらしく、それを24で割ると1時間単位に、それをさらに60で割ると1分単位になるっぽい。 結構知られてないかもしれないのでメモ。

以下のサイトを参考にした。

Add or subtract to a Time field in LibreOffice | The Linux Page

日商簿記2級に合格した話

先月行われた日商簿記2級を受験し、知識0から1.5ヶ月程度で無事に合格した。せっかくなので、それまでの流れを記録していこうと思う。

受験しようと思った理由

自分はエンジニアとして働いているので、現状の仕事とは一切関係がない。それでも簿記をなんとなく受験しようと思った理由は、

  • お金の流れに関して知識0だったので、そのへんの把握をしてみたかった
  • エンジニアリングの勉強に若干飽きて来たので、気分転換
  • 普段と違う頭の使い方を身につける

ぐらいか。なんとなくで始めて、「まあそれなりの期間とれば受かるやろ」ぐらいの考えだったが、それが結構甘かった。

勉強方法・期間

 資格試験の塾などには通わず独学。当然、簿記や会計に関する知識はまったく無し。簿記の試験日が2019年6月9日、受験を思い立ったのが3月下旬で、実際に勉強開始したのが4月に入ったからだったが、4月中はあまり力を入れず、ゴールデンウィーク明けから本腰を入れたので、実質の勉強期間は1.5ヶ月ぐらいだと思う。これは、簿記2級を合格するのに平均的な期間らしい。
 勉強時間の確保は、平日は朝の通勤時間(~45分程度)と、夜の1~2時間。ゴールデンウィーク過ぎてから本格的に休日も勉強し、5時間前後だった。勉強時間の合計はよくわからないが、おそらく150時間前後だと思われる。まず200時間は到達していない。

参考書など

勉強に使用した、参考書・問題集は以下の通り。これも他のブログなどでおすすめされているものを参考にした。種類を増やしすぎることは良くないと思い、これだけに留めた。

スッキリわかる 日商簿記2級 工業簿記 第8版 [テキスト&問題集] (スッキリわかるシリーズ)

スッキリわかる 日商簿記2級 工業簿記 第8版 [テキスト&問題集] (スッキリわかるシリーズ)

スッキリわかる 日商簿記2級 商業簿記 第11版 [テキスト&問題集] (スッキリわかるシリーズ)

スッキリわかる 日商簿記2級 商業簿記 第11版 [テキスト&問題集] (スッキリわかるシリーズ)

スッキリとける 日商簿記2級 過去+予想問題集 2019年度 (スッキリわかるシリーズ)

スッキリとける 日商簿記2級 過去+予想問題集 2019年度 (スッキリわかるシリーズ)

ゴールデンウィークぐらいで、参考書のみでは仕訳の問題を手早く数をこなすことができないということに気づき、あとから【パブロフ簿記2級(商業簿記)】のアプリをスマホに導入。結果的にこれが功を奏した。

4月上旬~ゴールデンウィークまでの勉強方法

 この期間はそれほど本腰を入れることなく、商業簿記・工業簿記の参考書を読み、読んだトピックに関して、直後に練習問題を2・3問かに1問解いてみるという方法をとっていた。こうすることで、たった今読んだトピックに対する考え方が間違っていないか確認しつつ、一通りの知識をぼんやりと頭の中に植え付けることにしていた。

ゴールデンウィーク~試験直前までの勉強方法

 ゴールデンウィーク中に想定試験問題を1度解いてみて、やはり全く知識が定着していなかったことを確認。そもそも、仕訳を全く覚えられていなかったので、上記のアプリを通勤時間中にひたすら解くということを始めた。この段階で、基本的な勉強方法として、商業簿記はアプリで仕訳の知識を定着させ、一方で工業簿記は手を動かして計算して解き方を覚えていくという方針を定めた。 工業簿記は、参考書の練習問題を2週した。
 この方針によって、仕訳に対してそこそこの自信がつき、工業簿記もある程度点が取れるようになったところで、本格的に過去問を解き始めた。それでも、過去問に取り組み始めて最初のうちは、個別論点(損益計算書貸借対照表・銀行勘定調整表など)の実践が完全に不足していたので、解き方を参考書で確認しつつだった。苦手な個別論点は、別途、参考書の練習問題をいくつか解いて定着させるようにした。
 6年分の過去問(一部の問題は2度解いた)+予想問題を解き、試験直前には、第1問の仕訳問題、第4問・第5問の工業簿記でそれなりの点数を取れるようになり、第2問・第3問で部分点を稼げばいけそうだというぐらいにはなっていた。

自分なりの勉強の工夫

 上記の勉強法を続けつつも、すぐに知識を定着させたい、あるいは、どうしても覚えられないといった論点については、メモ帳に要点を一度書き出してみることにした。基本的には、参考書をほぼ書き写したものだったが、一度手を動かすということと、自分なりの理解の方法を付け加えて書くことで、しっかりと記憶することができた。内容としては、工業簿記の原価計算方法全般・原価差異の計算など、連結決算や前払いの論点などだった。
 この方法のもう1つの狙いは、試験直前で参考書を見直さずにこのメモ帳を見直すことで、自分の苦手な部分や工業簿記などの大問を解くうえでの前提知識(シングルプランやパーシャルプランの定義など)を最終確認できることであった。特に工業簿記は、前提となる定義をど忘れしてしまうと大幅に点を落とす可能性があることを過去問で把握していたので、この方法によってある程度の安心感を得ることができた。

試験本番と結果

 上記のメモ帳をギリギリまで確認して、試験本番に臨んだ。解く順番は最初から決めており、大問1(仕訳)→大問4(工業簿記1)→大問5(工業簿記2)→大問2→大問3 という順番で解いた。銀行勘定調整表が出そうだな、となんとなく前日ぐらいに思っていたのが的中したので、いけそうな感覚がつかめた。
 しかし、実際に解き始めると、大問5の工業簿記で計算が合わないという自体に陥って、少し焦った。ひとまず後回しにして、大問2→大問3をある程度片付けて、それでも比較的時間があったので、大問5に戻ると無事に解けた。やはり、少し落ち着いてから取り組む、最後まで諦めずに問題に挑むということが重要である。
 解答速報を見て、大体受かってそうということはわかったものの、確実かどうかは微妙だったのでやや心配しながら結果を確認。大問1. 8/20、大問2. 16/20、大問3. 14/20、大問4. 16/20、大問5. 20/20で、合計 74/100で合格だった。解答を見て、大問1. は16/20 とれたと思っていたので(過去問でもほぼ16点は取れていた)、思ったよりギリギリの合格だった。なにか凡ミスをしたのかもしれないが、受かったから良しとしよう*1

総括

 結果的に、完全に思いつきだったものの、知識0から実質1.5ヶ月程度で簿記2級に合格することができた。最初のうちは、知識が全く頭に入って来ずに無理そうだと思ったが、自分なりに工夫してなんとか合格に達した。なにごとも0から始めてある程度の領域に達するには、それなりの時間をかける覚悟が必要だと感じた。果たして、この資格が人生に活かされることはあるのだろうか。活かす気は、今のところ毛頭ないけど。

*1:今回は過去数回に比べて、若干難易度が下がり合格率が25%程度だったのも運が良かった