No Code, No Life

データサイエンティストを目指すしがないエンジニアのブログ

Day 56 親や環境を言い訳にして不貞腐れるのは簡単。だが、そこからいかに大成するか考えるほうが100倍難しく、1億倍楽しい

インフルエンサー

  • ネットでいろんな人が簡単に情報共有できるようになったから、インフルエンサーを見て、「自分もひょっとしたら、同じことができるかもしれない」と思ってしまう。けど、情報発信している人が「それだけのことを発信できている」のは、これまでの育ってきた環境や背景などの、いろんなことの"結果"であって、その結果だけを見て真似しても、決して同じようにはできない。だって、その人が歩んできた歴史、環境が全く違うのだから。

    • 舞台経験が全くない、ただのサラリーマンが、「これから俳優になる!」と30歳になって言っても、厳しい話。20年かければいけるかもしれないが。
    • これが真実なんだけど、インフルエンサーは決してそんなことは言わない。だって、それを言ってしまったら「元も子もない」から。「みんな育った環境が違って、自分はたまたま恵まれた環境に居たから、これだけ成功しました、すごいでしょ~」と言っても、何も感動しないでしょう?むしろ嫌悪感を抱く。
    • 彼らも「ビジネス」で発信している (すなわち、顧客への営業である)のだから、「あたかも、誰でもできる」かのごとく見せる。けど、残酷なことに世の中はそんな甘くなくて、これまでの自分の環境と歴史ですべてが決まってしまうんだ。捨てられる過去なんてない!
  • じゃあ、生まれ育った環境が悪かったら、人生諦めたほうがいいのか?というと、決してそうではなくて、「じゃあ、(与えられた環境で)どうすれば成功するか?」を考えるのが至極真っ当な考え方だと思う。

    • 親のせい、環境のせい、これまでの経歴のせいにするのは簡単である。だが、それを変えることはできない。これは事実。
    • どんなに悪態をついたって、どんなに悪口や愚痴を書き込んだって、親や、これまでの自分の歴史は変えることができない。
    • 変えられるのは、過去でも未来でもなくて、「今この瞬間」。
    • だったら、変えられる「今」に集中して、どうやったら「成功できるか?」を考えるべきだと思わんか。
    • 親を恨むのは簡単だ。上司や、会社を恨むのも簡単。だが、そこからどう這い上がるか?を試されているのだ、と考えれば、クエスト感覚で楽しいでしょう?
  • だから、「これまでの人生を振り返った上で、自分は、他の人と何が違ってて、何が人よりもできるのか?そして、それを活かしてやりたいことは何か?」を考えよう。

    • ネットでちらっと見ただけのインフルエンサーに影響されて、「自分もこうなる!なれるんだ!」と考えるのは、危険。

Day 55 「共有すること」がいかに大事か

1. 画像処理

  • Segmentationの評価軸 IoUについて学習.
    • torchmetricsでは、今はjaccard indexというメソッドに変更されている.
    • Jaccard Indexについては、refにも記載がないややこしじ扱い方がある...これもQiitaにまとめて発信しておこう.
      • torchmetrics.functional.jaccard_indexが一番使いやすい
    • UNetのバックボーンをResnet18に変更し、初期重みをimagenet, epoch 30で学習させた → あまりIoU上がらず. (0.61 → 0.58)
  • Data augmentationについて改めて学習.

    • albumentationというライブラリを用いることで、mask, image両方に同じような拡張が施せる.
    • PyTorchのエコシステムがいかに広いかを改めて実感.
  • 演習問題として、犬/猫と背景の2クラスを分類するセグメンテーションに挑戦. Resnet18をバックボーンとしたUNet構築により、IoUとしては0.88近くを達成.

    • そもそも2クラスのため、IoUは講義中に扱った12クラス分類よりも高めに出やすい. そのため、特に工夫なくepoch 30程度学習させて0.88近くの高スコアを達成した.
    • セグメンテーション結果としても、下図の通りで、実用面で問題なさそうなレベル.
    • やはり、クラス数が少ないとその分IoUも上がる (自明). 実用に問題ないレベルで、どこまでクラス数をおさえ、パラメタを抑えるか.
  • Object Detection

    • trialとしてretinanetを使用.
    • reference見てると、姿勢推定に関するモデルもあった. これ、使えないかなあ

2. 自然言語処理

  • 前処理について再度復習. 呼吸をするかのごとく、さっと前処理できるようにしたい. (クリーニング→正規化→形態素解析→基本形→ストップワードの除去...)

  • 正規表現について学習

    • 繰り返しの表現について、書き方はわかったが、どうしても「繰り返されている文字列を1回だけの記載に直す」方法が分からない.

思ったこと

  • 睡眠は大事. 自分の場合、眠いと、「もうひと踏ん張り」ができなくなる.
  • 共有されていない知識や発見は、積極的に発信しよう. そのためのWEB.

Day 54 class、やはり分かってなかった

1. 画像処理 Segmentation

  • dataset作成等にクラスが多用されるが、まだclassについて曖昧な点があるなあ

    • __XX__っていう関数はデフォルトで実行されるの?とか。
    • 調べた所、特殊メソッドといって、クラスに特定の文字列の関数を定義してあげると、特定の動作を行えるらしい。
  • segmentationでcudaに関するruntime error発生

    • 調べた所、data loaderで一度numpyに変換したりしているのがおかしかった模様。データの型とか調べた後は、きちんと整理して再度実行するのがいい。
    • 色々とGPUを回した結果、すぐにcolabの制限にひっかかった。-> KaggleのGPUへシフト。kaggleのkernelも使えるあたり、便利。
  • 論文通りの構造の実装
    • 講義資料内でのDecoder classが非常にややこしい書き方をしていたので、論文通りの動きとなるよう、自分なりに修正。

2. 自然言語処理 前処理編

. 全体感

  • 講義の内容をざーっと改めて確認。
  • 自然言語処理では、文章生成およびTransformer、BERTまで取り扱ってくれている…!大変ありがたい。
  • 探索的データ解析 (EDA)についても講義があった!自分が探していたのはまさにこれだ…!ありがたい。
  • WEB開発のあたりでは、Nuxt.jsにまで言及があった。ただ、あくまで機械学習をメインとしたWEBページを作るのであれば、pythonをベースとしたフレームワークを使うのがベストなのだろう。あくまで、フロントエンドのjsを書くためのUIフレームワークとして、vue.jsと、認証関係のfirebase authを触っておく、くらいがベストか。
  • とにかく、フロントエンドは優先度下げて (いつでも取得できるため)、今は統計処理/画像解析/自然言語処理の基礎を叩き込もう。

思ったこと

  • 迷う時間があるなら、動いたほうがいい。
  • 「この人になら、仕事を任せたい」と思われる人材にならないと。

次やること

  • 講義資料の構造との比較

Day 53 巨人の肩に座る

1. 画像認識の応用分野

  • 講義のコードを理解しながら再現する過程で、referenceを見る癖がだいぶついた。そして、英語のreferenceを読むことに抵抗感がほぼなくなった。
  • DeepLabV3によるsegmentation実装。

    • 1秒ほどの短時間で、縦横1312ピクセルほどの画像のsegmentationが完了。
    • 出力された画像は、結構粗があって画像合成できるほどの精度にはなっていないが、どうすればもっと高精度になるんだろ。
    • 試しにresizeせずにぶちこんだ。ただ、一部馬や鳥にクラス分けされるピクセルもあり、うまくいかず。= 単に画素を上げて打ち込めばいいというわけではない。
      • 馬/鳥に分類されたのは、犬の毛のところ。ここは「ピクセル」だけ与えられても、たしかに判別は難しい。
      • というか、どういうふうに推論しているんだ??
  • CNNにおける「パラメタ」数とはそもそもなんぞや。をもう一度確認。

  • 計算コスト削減の歴史

    • 面白い手法はたくさんあるが、「なぜそうしたのか?」「それで十分か?」という必要十分性が全く満たされていないようにみえるのが、ちょっと歯がゆい。
    • それこそ、Convolution層 = 特徴抽出できている、という点がまだ実感として湧いていないのかもしれない。
  • segmentation labeling tool (labelme)のインストール

    • Githubのreadmeに記載されているコードの通りにインストールしてもエラー。少し苦戦。
    • issues見ると、python=3ではなくpython=3.8でインストールすればうまくいったとの記載。(ちょうど3週間ほど前のissue)
    • うまくいかないときは素直にissueを見よう。

思ったこと

  • Inputは、outputしない分、楽で楽しい。これだけしてても仕方はないのだが。。。

Day 52 作ることが目的にならぬよう

1. 雲判別アプリについて

  • Cloud classificationについて、KaggleのDatasetを用いて学習。
    • resnet50 fine tuning: 4 epochs validation accuracy score: 95%
    • resnet18 fine tuning: 4 epochs validation accuracy score: 90%
  • Datasetの利用規約を確認: 特に明記されておらず。
  • resnet50 fine tuning: 10epochで作成したモデルを採用。モデルとして保存。
  • 判別できる種類: 巻雲(すじ雲)、高積雲(ひつじ雲)、層積雲(うね雲)、積雲(わた雲)、積乱雲、乱層雲 (雨雲)、晴天
  • フロントエンドの実装を開始。faviconの設定~トップページのデザインと実装まで完了。
  • ただ、ここで、ふと「本当にニーズのあるアプリなのだろうか?」と我に返る。
    • ここにもある通り、ただ「作る」だけではだめなのだ。ビジネス力 (課題の発見~解決までの道筋を立て、実装まで一通り行える力)を見られているのだ。
    • これでは、ただ「作るために作った」のと何ら変わりない。手段が目的化してしまっている。
    • 一旦、この雲判別アプリについては、「練習用アプリ(Toy app)」として封印。

2. ネタ探し

  • WEBエンジニアのポートフォリオというと、色々と情報が出てくる。が、機械学習エンジニアというと、あまり情報が出てこない。
  • その中でも貴重なアドバイスが載っているのが → の記事 (https://qiita.com/masso/items/44437b48706483ce9f30)
  • この記事でも言及されている通り、テーマ選定には時間をかけたほうが良いと思う。→ まだ世の中になくて、少しの工夫で解決できそうな課題はなかろうか?
  • 2時間ほどKJ法やブレストをしていく中で、何個か良さげなアイデアが降ってきた。
    • これまでの発想法は、「習得した技術で、解決できる課題はないか?」だった。
    • これだと、「習得した技術」にだけにアイデアが凝り固まってしまうし、自分の技術力も全く向上しない。
    • そのため、「これがあったらなあ」という視点から、アイデアを出す方向へ。
    • その結果、「これ、どうやったら実装できるんだろうな」というものまで生まれているが、少し時間をかければいけそうな気もする。。。
  • うーん、あとは、もう少し基礎技術を習得して、実際に手を動かしていくしかない。。。

3. Flaskを用いたWEBアプリ作成基礎

  • DBとの連携
    • Bootstrapを用いた見た目の整理
    • Bootstrapのtableクラス、本当に便利で驚き。
  • Docker基礎
    • Docker hubへの登録と環境構築完了。loginして、ターミナルからpull, pushできるようになった。
    • YoutubeでDocker調べると、「初学者にとって必須ではない。Linux系コマンド等、もっと基礎的で大事なことを習得すべき」とのアドバイス
      • → なるほど。。。Docker composerとかのref見て「訳分かんねえな」と思っていたけど、そこに時間を費やしすぎてはいけないのか。
      • Youtube () で解説されていたこと:
        • Dockerを導入している企業は50%未満
        • 1からの環境構築は新人に任せない。
        • 大事なのは、必要なときにキャッチアップできること。
        • 短期間で転職活動完了させたいならポートフォリオに入れる必要はなし。
    • と、いうことで、興味はあるが、一旦優先順位を下げる。

4. 優良企業とは? (Youtubeチャンネルからのメモ)

  • CTO業界のランキング
  • テックブログの賑やかさ
  • テックイベントへ投資できているか?

5. 思ったこと

  • 「なんで将来役立つかも分からないのに勉強するの?」という学生さんに対する答え

    • 「将来の可能性を狭めないため」
    • 将来、何があるかわからない。いまキラキラしているように見える職種は陳腐化して、もっと高度な知識やスキルが要求される職がキラキラしだすかもしれない。
    • きっと、そのとき、「(高度な知識、スキルが必要とされる)仕事がしたい!」って思うだろう。けど、そのときに、"基礎力"がなければ、太刀打ちできないんだ。
    • 君が"やりたいこと"を実現するために、将来の選択肢を狭めないために、いろんなことを勉強しておく必要があるんだ。
  • データ系の仕事をはじめて、色々勉強して実感したのは、「英語をさらっと読める力がないと無理」「数学/統計ができないと無理」ということ。

    • それを学生時代にサボって、基礎力もないのに「できる」はずがない。本当に、学生時代に英語と数学/統計をやっておいてよかった。
    • だから、学生時代にサボりまくって、基礎力も何もない状態からこの職種を始めるのは正直非現実的。

6. 今後行う必要があること

  • DB基礎/WEBアプリとの連携
  • 画像認識/自然言語処理の応用分野
  • 新たな自主制作アプリ 構想開始

Day51 アプリ制作進捗

1. 自主制作アプリ構想~データ取得

  • 雲の画像を再度精査し、一度ImageFolderでラベリング実施
    • 1ラベルにつき50枚弱しか画像がなかったので、再度crawling実施
  • icrawlでGoogleImageCrawler、max_num = 300と指定するも80枚程度しかDLされず
    • icralerのissueをgithubで確認したところ、同様の事例が他の人も発生している.
    • 一旦、解決策として「時間指定」で分割してDLするも、同じ画像が多数DLされる問題. (同じ画像を消していけば良いのだけど、そうすると一気に画像数が減りそう)
    • BingImageCrawlerに切り替えて、max_numをあえて上限あげてクローリング実施
      • 体感的に、Bingは意外にもGoogleよりかはまともなイメージを拾ってくる.
      • そして、英語による検索ワードのほうがはるかにいい.
    • GCPで実行し、max_num = 700で、画像516枚収集. max_num通りにはならなかったが、及第点.
  • この条件で、他の雲画像も拾っていく.
    • 拾った画像の中で、イラストになっているもの + 他に写ってしまっているもの、とかがあるが、それを除くのが結構地道で大変.
    • 人間でさえ見分けるのが難しい画像がある....精度をどこまで求めるか.
  • 前処理終わったが、画像選別だけでも2時間近くかかった...!大丈夫か.
    • お花とか、もっと見分けがはっきりつくものを選んだほうが最初は良かったのかもしれん.
  • 画像の選別が終わり、一度resnet18で回す. ただし、valとしてはやはり50%ほどの正解率.
  • resnetをさらに深くしたresnet50で回す. 1 epochからほぼ学習完了している. が、valの精度が全く出ない. 1 epochから過学習とは...

  • GoogLeNet, AlexNetも試したが、どれもvalidationのaccuracyに大きな変化はなかった. ← コードにミスが発覚. 正しく実装できていなかったので後日再度実行する.

  • 何かしら参考となる文献/資料がないか今一度探したところ、下記参考情報を発見.

  • Kaggleのこのコンペデータセット (https://www.kaggle.com/competitions/cloud-type-classification2) でresnet50 finetuningしたところ、0.90近くのval score達成. やはりデータセットの良し悪しはかなり重要ということらしい.

  • 上記Kaggleとpaperを見て思ったこと: データセットがよいこと + 分類するクラスを限定的なものにしていること

    • 最初自分がやろうとした分類: 9クラス. 正直、人間でも見分けがつかないクラスもあった. (羊雲とウロコ雲とか..、層 (高度)が違うらしいが、それを画像判別するのは非常に厳しい.
    • 現実的に、明らかに違うものをKaggle/paperではトライしていた. (羊雲と積乱雲のような)
  • 精度50%でずっと唸るのも時間の無駄なので、一旦は完成させることを目標に、Kaggleで手に入れたデータセットとモデル、テスト画像を使ってアプリを引き続き作っていく.

2. DBの基礎

3. 今後の課題

  • アプリのフロントエンド作成開始
  • Dockerの基礎学ぶ
  • DBとの連携 (一旦はFlaskで行う)
  • 画像認識/自然言語処理の発展学習
  • データ分析 (実務編)

Kaggle日記

本日はキカガクに集中したため進捗なし.

Day50 Dataset探索

キカガク進捗日記

1. 自然言語処理章末問題クリア.

BoWによるベクトル化とNNによる分類で、精度90%近くは達成.

他にもTf-Idfを用いた分類をためしたが、全く精度出ず. この違いは何なのだ?

Tf-Idfについては下記サイトが分かりやすい.

https://www.sejuku.net/blog/26420

一旦、これでNNに関する基礎の基礎講座はすべて1周目完了.

2. Flask基礎完了

  • 犬/猫を判別するtoy appの仮組完了.
  • DBとやり取りせず、画像をHTMLに直接組み込むやり方になっているので、実装自体は簡単ではあるが、さらに応用していく必要あり. (というか、これで終わりではいけない)
  • キカガク会長の著書 (下記)を読んだ所、DBとの連携まで詳しく記述があるので、それを参考に、DBとの連携~本格的なAPP作成まで腕を磨く.

3. Django講義ざっと見

  • DBのCRUD操作はFlask講義内になかったので、ざっとDjangoの講義内容で確認.
  • アプリの開発の流れも書いてあり、Flask講義よりもずいぶん丁寧な印象.
  • ただ、一旦はFlaskで、Docker + DBを操作に慣れることを優先し、プロトタイプを組めることを優先したい. → 規模が大きくなってきたらDjangoへ.

4. 自主制作アプリ構想~データ取得まで

  • 一番最初は手軽にできるものを作る.
  • 雲の種類を判別できるアプリを作りたい. (ずっと前から雲のことが好きだった. 秋は特に雲が高く、美しい)
  • スライド作成開始
  • データのスクレイピングも開始
    • datasetを英語も含めて探したが、いい感じのdatasetが見つからず
    • 「雨雲」「雷雲」については、それぞれ乱積雲と積乱雲で調べないと適切な画像がヒットしない.

5. 今後の課題

  • Dockerの基礎学ぶ
  • DBとの連携 (一旦はFlaskで行う)
  • Flaskによるアプリ作成開始 (ネタはあるので、簡単なスケッチとモデル作成から)
  • 画像認識/自然言語処理の発展学習
  • データ分析 (実務)

Kaggle日記

本日はキカガクに集中したため進捗なし.