俺人〜OREGIN〜俺、バカだから人工知能に代わりに頑張ってもらうまでのお話

俺って、おバカさんなので、とっても優秀な人工知能を作って代わりに頑張ってもらうことにしました。世界の端っこでおバカな俺が夢の達成に向けてチマチマ頑張る、そんな小さなお話です。現在はG検定、E資格に合格し、KaggleやProbSpaceのコンペに参画しながら、Pythonや機械学習、統計学、Dockerなどの勉強中です。学習したことをブログにアウトプットすることで、自分の身に着けていきたいと思います。まだまだ道半ばですが、お時間がありましたら見て行ってください。

機械学習初心者がコンペサイトProbSpaceで金銀銅を獲得し総合4位に到達するまでの道のり

機械学習について全くの専門外で初心者だった私が先日コンペサイトProbspaceのYouTube動画視聴回数予測コンペで9位入賞し、累計で金銀銅を獲得することができ、総合で4位に到達することができました。

f:id:kanriyou_h004:20200723175611p:plain

これまでたどってきた道のりを振り返って、良かった点、悪かった点を見直して、今後の進め方を考えていきたいと思います。

悪戦苦闘、一進一退しながら勧めてきた内容を、思いつくまま記載しているので、お見苦しい箇所もありますが、これから機械学習を始める皆さんや、始めたばかりの皆さんの何らかのキッカケになれれば光栄です。

では、振り返ってまいりたいと思います。

1.G検定との出会い(2019年2月〜3月)

私の人生を変えたといっても過言ではない出来事が、G検定という資格との出会いでした。

この資格は、まだ新しい資格で、実際に受験された方々の中でも様々な評価があるところなのですが、私にとってこの資格を取得するまでの過程があって、今の私があるのは間違いないです。

 

この資格を受験する前は、ただぼんやりと人工知能を利用して何かがやりたい、社会に貢献できることがしたいと考えていただけでした。

このままでは、何も前に進まないと思い、とりあえず「人工知能」「勉強」「資格」「AI」などなど、いろいろキーワードを入れて片っ端から検索してみました。

その結果、以下のサイトにたどり着き、どうやら「G検定」(JDLA Deep Learning for GENERAL)という資格があることがわかりました。

資格試験について - 一般社団法人日本ディープラーニング協会【公式】

 

この資格に取り組むことで、人工知能とはなにか、何が解決できて何が課題なのか、どのような経緯をたどってきているのか、どこに向かっているのかなど、いろいろな背景や現在の状況を知ることができました。

 

また、勉強すううちに「機械学習」というものがあることを知り、「もっと深く勉強したい!」と強く意識付けされるキッカケとなったのが、この試験でした。

 

そして、無事、G検定に合格できたことも、まだまだ自分もやれるんだという大きな自信につながりました。

実際に受験してみた感想や、勉強内容については、過去の記事にまとめていますので、興味がございましたら、そちらもご参照ください。

g-kentei.hatenablog.com

2.Pythonの勉強を始める(2019年4月)

G検定に合格して、すぐにその上位資格のE資格を受験したいと思ったのですが、受験するためには、JDLA認定プログラムを修了している必要があり、実習としてPythonというプログラミング言語を使って、実際に機械学習モデルを自ら構築できる必要がありました。

Python」の読み方すら知らなかった私は、以下の2冊の本を急いで購入し、1から勉強をはじめました。

入門Python 3 [ ビル・ルバノビック ]

ゼロから作るDeep Learning Pythonで学ぶディープラーニングの理論と実装 [ 斎藤 康毅 ]

f:id:kanriyou_h004:20190831215305j:plain

 

特に、ゼロから作るDeep Learning Pythonで学ぶディープラーニングの理論と実装 [ 斎藤 康毅 ]は、名著で、現在も、続編の自然言語処理編、フレームワーク編とともに愛読しています。

ゼロから作るDeep Learning 2 自然言語処理編 [ 斎藤 康毅 ]

ゼロから作るDeep Learning 3 フレームワーク編 [ 斎藤康毅 ]

f:id:kanriyou_h004:20190713165650j:plainf:id:kanriyou_h004:20200723205241j:image

 

Pythonについては、最初、Anacondaのインストールに四苦八苦して、環境構築に悪戦苦闘していましたが、講座が始まる頃には、以下のようなことができるようになっていました。

これまで、本格的にプログラミングをやったことがなかったのですが、プログラミングは、プログラムしたとおりに必ず動いてくれて、自分の思い通りに動く喜びをしることができました。(もちろん、プログラムしたとおりに忠実に動くので、少しのミスがあると、全く動かなかったりすることもあるのですが・・・。)

3.kaggleのデータセットを使って機械学習に挑戦する(2019年4月〜5月)

知り合いからKaggleというものの存在を教えてもらい、データ分析のコンペティションなどが行われていることを知りました。

実際にコンペに参加するのは、まだまだ厳しかったのですが、kaggleのデータセットを使って、自己流も混ざっていますが、機械学習について、本格的に勉強をはじめました。

なかなか精度が向上しなかったり、精度が向上したかと思えばリークしてしまったり、一進一退を繰り返していました。

しかしながら、今思うと、このときに、データを分析したり、前処理を行ったり、モデルのハイパーパラメータを調整したり、結果を評価したりすることで、全体の流れを実際に手を動かして取り組んでいたことが、非常に役に立っていると思います。

具体的には、以下のようなことに取り組みました。

4.E資格を受験する(2019年5月〜8月)

 Python機械学習を事前に学習した状態で、E資格の認定講座を受講いたしました。

まっさらな気持ちで受講されている方々もいらっしゃいましたが、私は受講してすぐ理解できるタイプではないので、事前に十分な予習をしてから受講できたのは、非常に良かったと思いました。

 

認定講座では、理論と平行して実装も行っていくので、知識だけでなく、技術を感覚的に身につけられていると感じました。

また、今、いろいろなコンペに参加する際に何も考えずライブラリを使っている各種学習モデルについても、中身を理解して、1から手組で作る経験が得られたことは、パラメータの調整等の意味がわかって調整できるので、非常に有意義でした。

 

その効果もあって、E資格(JDLA Deep Learning for ENGINEER 2019 #2)に合格することができました。

詳細は、以下の過去記事もご参照ください。

oregin-ai.hatenablog.com

5.Probspaceで給与推定コンペで47位入賞(銅賞)(2019年11月〜12月)

E資格取得後、1〜2ヶ月ほど、復習をしながら、準備を整えて、満を持してProbspaceというデータ分析プラットフォームで開催されていた給与推定コンペに参戦しました。

結果としては、310チーム中 47位 ということで、上位15%に入り、銅賞をいただくことができました。

 

テーブルコンペだったので、取り組みやすく、チュートリアルもわかりやすかったので、初めてのコンペながら楽しんで参戦することができました。

実際に他の皆さんと切磋琢磨しながら取り組むのは、自分一人で学習を進めるのに比べて、何倍も進歩が違うと感じました。

一方で、これまでの積み上げがあったからこそ、なんとかついていけたのだとも思いました。

 

今のところ、自分自信の理解を深める積み上げの期間と、積み上げた結果を確認するアウトプットの期間を織り交ぜていくのが自分の中ではベストです。

コンペに参加しながら、いろいろな最新情報のインプットもできる人には、本当に感服いたします。

 

給与推定コンペの振り返りは、以下もご参照ください。

oregin-ai.hatenablog.com

6.Probspaceで浮世絵作者予測コンペで10位入賞(銀賞)(2019年10月〜2020年1月)

先程の、給与推定コンペと並行して、浮世絵の作者を予測するコンペにも参戦いたしました。

こちらは、約4ヶ月の長丁場でしたが、E資格時に画像分類はさんざん実施してきていたので、知識をフル動員して頑張りました。

結果は、232チーム中 10位に入賞することができ、銀賞をいただきました。

ここまで来ると、だんだん欲がでてきて、どんどんコンペに参加したくなってきていました。

しかしながら、今回のコンペでは、E資格で学習した内容でそこそこの成績までは到達できたものの、10位まで到達するまでには、いろんなパターンを組み合わせて、いろいろ試した結果、スコアが向上したという行きあたりばったりの改善策もありました。

このため、なぜそうなるのかということも理解したい気持がわいてきました。

コンペでの取組内容は、以下をご参照ください。

oregin-ai.hatenablog.com

7.東京大学GCI Winter 2019を受講(2019年12月〜2020年3月)

浮世絵作者予測コンペを取り組む中で、もっと理解を深めたい欲求がでてきたときに、ちょうど東京大学のGCI寄附講座という無料講座を見つけ、早速申し込み、運良く参加することができました。 gci.t.u-tokyo.ac.jp

 こちらは、オンラインの講座だったのですが、単なる講義だけでなく、毎回宿題もあり、コンペもあり、コンペも開催される、かなりハードな4ヶ月間を過ごすことになりました。

しかし、その甲斐あって、確率統計などの基礎知識から、モデルの検証方法や、チューニング方法にいたるまで、基礎理論から実装、さらにはビジネスへの応用まで含めた、スキルアップをすることができました。

 

この内容を無料で受けられるのは、非常にありがたいと思いました。機会があれば、絶対受講をおすすめいたします。

詳細は以下の記事も、ご参照ください。

8.ProbspaceでYouTube動画視聴回数予測コンペで9位入賞(2020年4月〜6月)

そして、GCIでの成果を発揮すべく、YouTube動画視聴回数予測コンペに参戦しました。

このコンペは、一見、テーブルコンペのように見えましたが、コメント欄を自然言語処理したり、サムネイル画像を画像処理したりするなど、工夫次第では、どんどん領域が広がる複合的なコンペでした。

今までのなかで一番難しく、一番楽しいコンペでした。

結果としては、446チーム中 9位に入賞することができ、金賞をいただきました!

f:id:kanriyou_h004:20200724001856p:plain

このコンペで一番苦労したのは、環境構築と維持でした。

いろいろな学習モデルを使う際に、テーブルデータ用の分析するための環境、自然言語処理をするための環境、画像処理をするための環境など、いろいろな環境をつくらなくてはならず、一個の環境をつくるために、前の分析を行うための環境が崩れてしまったりして、とても苦労しました。

また、たくさんのコードを作って、いろんなバージョンができたので、どの組み合わせだったか等の管理にも非常に苦労しました。

今回のコンペでは、単に機械学習という観点だけでなく、「システム開発」としての、効率的な運用も考えて行く必要があるということに気づけたとても有意義なコンペでした。

9.現在取り組み中の内容、そして今後にむけて

現在は、ProbspaceのRe:不動産コンペや、Kaggleのコンペに参戦しつつ、YouTubeコンペの反省を込めて、環境構築や管理に必要なDockerについて、 かめ@usdatascientistさんの以下の講座を受講して勉強中です。 これまで学習してきた内容は、まだ受講途中ですが、以下のとおりです。

また、このDocker講座が終わったら、自分のコードについて、適切にバージョン管理等ができるように、GitHubについても勉強していきたいと思います。

 

以上が、これまでの私の取り組んできた道のりになります。

G検定に出会ってから約1年半、いろいろ紆余曲折がありましたが、なんとかここまでやってくることができました。

まだまだ道半ばではございますが、世間様にお役に立てるアウトプットを出していけるよう、今後も精進してまいりますので、引き続きよろしくお願いいたします。

 

f:id:kanriyou_h004:20200723175611p:plain

Docker daemonとbuild contextについて学ぶ(米国AI開発者がゼロから教えるDocker講座)

これまでは、Dockerfileの中に記載された内容だけでDocker imageを作成してきましたが、Docker daemon や、build contextについて学習し、docker buildについて、さらに理解を深めました。

今回もかめ@usdatascientistさんの「米国AI開発者がゼロから教えるDocker講座」をUdemyで受講しながら進めています。

とても分かりやすく解説いただけますし、ハンズオン形式で講座が進むので、まさに「手で覚える」ことができるので、おすすめです!

www.udemy.com

では、振り返っていきたいと思います。

Docker daemonとbuild contextについて学ぶ

1.Dokcer daemonとbuild contextについて

これまで、DockerfileにDocker imageを作成するINSTRUCTION(命令)等を記載して、docker buildを実行する際は、引数にDockerfile自体ではなく、Dockerfileの入ったディレクトリを指定してきました。

これは、docker build実行時にDockerfileだけではなく、そのディレクトリ内にある他のファイルも使ってDocker imageを作成します。この、ディレクトリ内の「状況」を「built context」といいます。

また、build contextを受け取って、Docker imageを作成する役割を担っているのが、Docker daemonになります。

実際にこれまで、doker buildを実施してきたときに以下のように「Sending build context to Docker daemon」と表示されていて、contextをDocker daemonに受け渡していたことが確認できます。

f:id:kanriyou_h004:20200712201418p:plain

図1.contextをDocker daemonへ受け渡す

上記の場合は、Dockerfileだけしかディレクトリに入っていなかったので、「2.048kB」のデータを受け渡すだけですんでいますが、このディレクトリ内に不要なファイルが入っていると、受け渡す容量がそれだけ大きくなりますので、このディレクトリ内には、必要最小限のファイルだけにしておく必要があります。

2.build context内のファイルをDocker imageに取り込む(COPY)

build contextのディレクトリ内にあるファイルをDocker imageに取り込むためには、COPYというINSTRUCTION(命令)を使います。

では、build contextのディレクトリに「something」ファイルを作成して、このファイルをDocker image内のディレクトリにコピーします。

以下の内容を記述したDockerfileを作成します。

COPYについては、arguments(引数)に、コピーしたいホスト側のファイルと、Docker image側のコピー先を指定します。今回は、コピー先のディレクトリをあらかじめ、RUNを使って作成(mkdir)しておきます。

FROM ubuntu:latest

RUN mkdir /new_dir

COPY something /new_dir/

 docker buildを実行する前に、まず、ディレクトリ内のファイルを確認します。

ls

f:id:kanriyou_h004:20200716204252p:plain

図2.build contextとして受け渡されるファイル

これらのファイルがdocker buildを実行した際にDocker daemonに受け渡されます。
では、buildしていきます。

docker build .

f:id:kanriyou_h004:20200716204908p:plain

図3.docker buildを実行する

無事、Step3でCOPYも実行されて、Docker imageが作成できました。

次に、作成したDocker imageからコンテナを立ち上げて、「something」がコンテナ内にコピーされていることを確認します。

docker run -it a4be1c8a525e bash

f:id:kanriyou_h004:20200716205320p:plain

図4.コンテナを立ち上げる

ls /new_dir/

f:id:kanriyou_h004:20200716205504p:plain

図5./new_dir/ディレクトリ内に「something」ができていることを確認する

無事、build contextのディレクトリ内の「something」を、コンテナ内のディレクトリにコピーすることができました。

これで、事前に作成したファイルを、コンテナ内に持ち込むことができるようになりました。

3.build context内のtarファイルをDocker imageに取り込む(ADD)

今度は、単にbuild context内のファイルをコピーするのではなく、build context ディレクトリ内の圧縮ファイル(tarファイルなど)を、コピーして解凍するためにはADDというINSTRUCTION(命令)を使用します。

これは、build contextをDocker daemonに受け渡す際に、圧縮した状態のままで受け渡すことができますので、送信にかかる時間を短縮することができます。

では、試しに「hello」というファイルが入った「sample_folder」というディレクトリを圧縮した「compressed.tar」というファイルを、Docker image内に解凍するためには、以下のDockerfileを作成します。

ADDは、arguments(引数)に、解凍したいホスト側の圧縮ファイルと、Docker image側の解凍先を指定します。今回は解凍先にルートディレクトリを指定します。

FROM ubuntu:latest

ADD compressed.tar /

 docker buildを実行する前に、まず、ディレクトリ内のファイルを確認します。

ls

f:id:kanriyou_h004:20200716211818p:plain

図6.build context内のファイルを確認する

では、buildしていきます。

docker build .

f:id:kanriyou_h004:20200716212415p:plain

図7.docker buildを実行する

無事、Step2でADDが実行できました。

次に、作成したDocker imageからコンテナを立ち上げて、「compressed.tar」が解凍され、「sample_folder」が作成されていることを確認します。

docker run -it 4bfdf382a056 bash

f:id:kanriyou_h004:20200716212806p:plain

図8.コンテナを立ち上げる

ls /sample_folder/

f:id:kanriyou_h004:20200716213017p:plain

図9.sample_folderが作成されていることを確認する

無事、「compressed.tar」が解凍され、「sample_folder」ディレクトリと、その中に「hello」というファイルができていることが確認できました。

4.Dockerfileがbuild context以外にある場合

これまで、Dockerfileは、必ずbuild contextのディレクトリ内に配置してきました。

 しかし、Dockerfileを切り替えながら使っていきたい場合に、build contextのディレクトリ内にDockerfileをいちいち入れ替えていると面倒です。このような時に、Dockerfileをbuild contextのディレクトリ以外に、複数のDockerfileを作成し、docker build時に指定できると便利になります。

では、実際にDockerfileを指定して、docker build を実施していきたいと思います。

今回は、Dockerfileを図10のように、build contextのディレクトリの親ディレクトリに保存します。

f:id:kanriyou_h004:20200717211912p:plain

図10.build contextのディレクトリの親ディレクトリにDockerfileを作成する

Dockerfileには、以下を記載しました。

ubuntu のDocker imageに、「hogehoge」というファイルを作成して、bashを立ち上げるDockerfileになります。

FROM ubuntu:latest
RUN touch hogehoge
CMD ["/bin/bash"]

 Dockerfileを指定して、docker build を実行するためには、「-f」オプションを使って、Dockerfileを指定します。「..」は、親ディレクトリを表し、「.」は、カレントディレクトリ(現在いるディレクトリ)を表します。

docker build -f ../Docerfile .

f:id:kanriyou_h004:20200717213257p:plain

図11.Dockerfile を指定してdocker buildを実行する。

 無事、Docker imageが作成できました。

この方法を使うと、build contextのディレクトリと、Dockerfileの組み合わせを変えてdocker buildを行うことができます。

5.コンテナをコマンドのように引数を渡して使いたい(ENTRYPOINT)

 DockerfileにCMDでコマンドを実行した場合は、docker runを実行してコンテナを起動した時に、CMDで指定したコマンドか、docker runで引数として渡したコマンドのどちらかのコマンドが実行され、CMDで指定したコマンドに引数を渡すことはできません。

例えば以下の通りDockerfileで、Docker imageを作成した場合

From ubuntu:latest

RUN touch hogehoge

CMD["ls"]

docker runで実行できるのは、以下の通りです。

docker run -it [Docker image ID]

 → この場合は、CMDのコマンド(ls)が実行される

docker run -it [Docker image ID] pwd

 → この場合は、引数に渡したコマンド(pwd)が実行される

docker runの引数に、CMDのコマンド(ls)の引数は指定できず、いかのようには実行できません。

× docker run -it [Docker image ID] -la

上記のように、docker run を実行する際に、コマンドではなくDockerfileで指定したコマンドの引数だけを指定したい場合は以下のようにENTRYPOINTというINSTRUCTION(命令)を使用します。

このとき、ENTRYPOINTの引数には、実行するコマンドを指定して、CMDで、そのコマンドの引数を指定します。

こうすることで、docker runを実行した際に、ENTRYPOINTまでは、デフォルトで指定され、docker runで引数を渡す(CMDで指定した引数を上書きする)ことができます。

From ubuntu:latest

RUN touch hogehoge

ENTRYPOINT ["ls"]

CMD["--help"]

 では、実際にコンテナを起動していきます。

まずは、Docker imageをbuildします。

docker build .

f:id:kanriyou_h004:20200718201902p:plain

図12.docker buildを実行する

buildされたDocker imageからコンテナを起動します。

このとき、[ls]の引数として「-la」を指定してみます。

docker run -it 5aff4de5619b -la

f:id:kanriyou_h004:20200718202213p:plain

図13.docker run でENTRYPOINTで指定したコマンドに引数を渡す

無事、CMDで指定した[--help]オプションではなく、[-la]オプションが引数として渡され、カレントディレクトリにあるファイルの詳細情報が表示されました。

このようにコンテナを起動するときに、引数を渡してコマンドのように実行することができるようになりました。

6.Docker imageの環境変数を設定する(ENV)

DockerfileでDocker imageの環境設定をするためには、ENVというINSTRUCTION(命令)を使います。

ENVは、引数に環境変数名=設定する値と指定するか、環境変数の後にスペースを入れて設定値と指定することができます。

以下のようなDockerfileを作成して試していきます。

FROM ubuntu

ENV key1 value1

ENV key2=value2

では、試してみます。

docker build .

f:id:kanriyou_h004:20200718203817p:plain

図14.docker buildを実行する

次にコンテナを立ち上げて、環境変数の状態を確認します。

docker run -it 2af76fdfc73f bash

f:id:kanriyou_h004:20200718204001p:plain

図15.コンテナを立ち上げる

envコマンドで、環境変数の一覧を確認する。

env

f:id:kanriyou_h004:20200718204139p:plain

図16.環境変数の一覧を確認する

無事、key1にvalue1が、key2にvalue2が設定されていることが確認できました。

このようにENVというINSTRUCTION(命令)を使うことで、環境変数の設定もできました。

7.Dockerfile内のINSTRUCTIONの実行ディレクトリを指定する(WORKDIR)

 Dockerfileに記載されたRUNや、CMDなどのINSTRUCTION(命令)は、何も指定しなければ、すべてルートディレクトリで実行されます。

例えば、ディレクトリを作成して、そのディレクトリ内でコマンドを実行したい場合は、WORKDIRというINSTRUCTION(命令)でディレクトリを指定して実行します。

以下のようなDockerfileを作成して試していきます。

FROM ubuntu:latest

RUN mkdir sample_folder

WORKDIR /sample_folder

RUN touch sample_file

では、試してみます。

docker build .

f:id:kanriyou_h004:20200718210353p:plain

図17.docker buildを実行する

次にコンテナを立ち上げて、作成されたファイルを確認します。

docker run -it b062abc9c389 bash

f:id:kanriyou_h004:20200718210613p:plain

図18.コンテナを立ち上げる

WORKDIRで、ディレクトリを移動しているので、立ち上げ時のカレントディレクトリも、/sample_folderとなっています。

では、sample_folderファイルの中身を確認します。

ls /sample_folder/

f:id:kanriyou_h004:20200718210838p:plain

図19./sample_folder/の中身を確認する

無事、sample_folder内に[sample_file]が作成されていました。

これで、Dockerfile内でコマンドを実行する際のディレクトリを指定することができるようになりました。

 

今回の振り返りは以上になります。

今回、Docker daemonと、build context の仕組みを理解し、様々なINSTRUCTION(命令)を利用して、Dockerfileからコンテナ作成までのレパートリーが、かなり増強できたと感じました。

いろいろな、コンテナを作成して実際に手を動かしながら、自分のものにしてきたいと思います。

 

今回受講している「米国AI開発者がゼロから教えるDocker講座」では、もっと詳しくわかりやすくご説明いただけているので、ほんとうに良い勉強になります。

今後も、継続して受講して、もっと、Dockerを使いこなせるようになりたいと思います! 

www.udemy.com

 

 【過去記事】

2019年8月31日(土)にE資格を受験して、合格しました!

E資格対策として勉強の進め方や、参考書などをまとめました。

これから受験される方がいらっしゃいましたらご参考まで。

oregin-ai.hatenablog.com 

 

 2019年3月9日(土)にG検定を受験し、見事合格できました!

受験の体験記や勉強法などを別のブログにまとめました。

これから受験される方がいらっしゃいましたらご参考まで。

g-kentei.hatenablog.com

 【E資格対策に使った参考書】

 

f:id:kanriyou_h004:20200714220856p:plain

E資格取得に向けた勉強の振り返り(まとめ)

これまで投稿してきた、E資格関連の勉強の振り返り記事をまとめました。

今後、受験される皆さんの参考になれれば幸いです!

では、振り返ってまいりたいと思います。

受験体験記編

oregin-ai.hatenablog.com

応用数学

E資格対策振り返り(応用数学-固有値、固有ベクトル、固有値分解)

E資格対策振り返り(応用数学-特異値分解)

E資格対策振り返り(応用数学-確率)

E資格対策振り返り(応用数学-対数関数)

E資格対策振り返り(応用数学-情報理論-自己情報量)

E資格対策振り返り(応用数学-情報理論-エントロピー)

E資格対策振り返り(応用数学-情報理論-カルバック・ライブラー情報量(KLダイバージェンス))

E資格対策振り返り(応用数学-情報理論-クロスエントロピー)

E資格対策振り返り(応用数学-確率統計-オッズ比)

深層学習編

E資格対策振り返り(深層学習-ゲート付きRNN-LSTM)

E資格対策振り返り(深層学習-ゲート付きRNN-GRU)

E資格受験に向けて最適化(optimizer)を自分なりに整理!

E資格復習のつぶやき

E資格 復習のつぶやきまとめ 

 

取り急ぎ、簡単にまとめてみました。

今後、プログラミング編もまとめて行きたいと思います。

 

px.a8.net

 

 【過去記事】

2019年8月31日(土)にE資格を受験して、合格しました!

E資格対策として勉強の進め方や、参考書などをまとめました。

これから受験される方がいらっしゃいましたらご参考まで。

oregin-ai.hatenablog.com 

 

 2019年3月9日(土)にG検定を受験し、見事合格できました!

受験の体験記や勉強法などを別のブログにまとめました。

これから受験される方がいらっしゃいましたらご参考まで。

g-kentei.hatenablog.com

 【E資格対策に使った参考書】

DockerfileのINSTRUCTION(FROM,RUN,CMD)を学ぶ(米国AI開発者がゼロから教えるDocker講座)

今回は、前回学んだDockerfileのINSTRUCTION(命令)についてさらに理解を深めました。INSTRUCTIONは、FROM、RUN、CMDの三つになります。

今回もかめ@usdatascientistさんの「米国AI開発者がゼロから教えるDocker講座」をUdemyで受講しながら進めています。

とても分かりやすく解説いただけますし、ハンズオン形式で講座が進むので、まさに「手で覚える」ことができるので、おすすめです!

www.udemy.com

では、振り返っていきたいと思います。

DockerfileのINSTRUCTION(FROM,RUN,CMD)を学ぶ

1.FROMについて理解を深める

Dockerfileにおいて、FROMは、Docker imageを作成する際に、もとにするDocker imageを何にするかを指定するINSTRUCTION(命令)になります。Dockerfileの一番最初に、指定する必要があります。

ここで指定したDocker imageをもとに環境が構築されるので、OSのDocker imageか、OSを含むDocker imageを指定することになります。

たとえば、Docker fileに以下を記述することで、ubuntuの最新版のDocker imageからDocker imageを作成できます。

FROM ubuntu:latest

2.RUNについて理解を深める

 RUNは、コマンドを実行するINSTRUCTION(命令)になります。

コマンドを実行することで、Docker imageに、任意の変更を加えていくことができます。また、RUNを1行追加するごとに、Docker imageのLayer(層)が追加されていくことになります。

たとえば、以下を記述することで、testというファイルを作成し、ファイルの中に'hello world'という文字列を書き込みます。

RUN touch test

RUN echo 'hello world' > test

先ほどの、FROMと合わせて、以下のDockerfileを作成します。

FROM ubuntu:latest

RUN touch test

RUN echo 'hello world' > test

作成したDockerfileのディレクトリに移動して、以下のコマンドを実行します。

docker build .

f:id:kanriyou_h004:20200712165702p:plain

図1.docker buildの実行

作成されたDokcer image(bda713f6179f)からコンテナを起動して中身を確認します。

まずは、コンテナを起動します。

docker run -it bda713f6179f

f:id:kanriyou_h004:20200712170435p:plain

図2.コンテナを起動する

起動したコンテナでに、「test」ファイルが作成され、「hello world」が書き込まれていることを確認します。

cat test

f:id:kanriyou_h004:20200712170721p:plain

図3.testファイルの中身の確認

無事、「hello world」と書き込まれた「test」ファイルが作成されていることが確認できました。

3.Docker imageのサイズを小さくする工夫

先ほど、Docker fileにRUNを2行記載しましたが、RUNが実行されるたびに、Layerが追加されていくため、RUNを記述し続けるとDocker imageのサイズがどんどん大きくなってしまいます。

Dokcer imageをなるべく小さくするためには、Layer数を小さくするための工夫が必要になります。この工夫のために「&&」を使います。

たとえば、先ほどのDockerfileは、以下の通りRUNで実行する2つのコマンドを「&&」でつなげて記述することで、Layerをひとつ少なくすることができます。

FROM ubuntu:latest

RUN touch test && echo 'hello world' > test

4.Docker image上にパッケージをインストールする

 Dokcer image上にパッケージをインストールするためには、apt-getコマンドを使います。updateオプションで、パッケージのリストを更新し、installオプションでインストールするパッケージを指定します。例えば、「curl」、「nginx」をインストールする場合は以下の通りのDockerfileを作成します。

また、「-y」オプションを指定することで、インストールの際に、入力を求められた際に、すべて[y]で入力することができます。

FROM ubuntu:latest

RUN apt-get update && apt-get install -y curl nginx

上記のDockerfileからDokcer imageをbuildします。

docker build .

f:id:kanriyou_h004:20200712201418p:plain

<中略>

f:id:kanriyou_h004:20200712201235p:plain

図4.docker buildを実行する

なお、今回は最初の実行だったので、インストールに時間がかかりましたが、一度、Docker image のLayerが作成されている場合は、cacheが使われるため、以下のように時間が短縮できます。

docker build .

f:id:kanriyou_h004:20200712202352p:plain

図5.2回目のbuildはcacheが利用される

5.CMDについて理解を深める

 CMDは、コンテナが実行するデフォルトのコマンドを指定するINSTRUCTION(命令)になります。原則、Dockerfileの最後に一つだけ記載します。

記載方法は、CMD["実行するコマンド","引数1","引数2"]となります。

では、先ほどのDockerfileに、デフォルトのコマンドに「ls」コマンドを指定してみます。

FROM ubuntu:latest

RUN apt-get update && apt-get install -y curl nginx

CMD ["ls"]

上記のDockerfileからDokcer imageをbuildします。

docker build .

f:id:kanriyou_h004:20200712204102p:plain

図6.CMDでデフォルトのコマンドを指定したDockerfileでbuildする

この状態で、Docker imageから、コンテナを立ち上げます。

docker run b5597893e556

f:id:kanriyou_h004:20200712204744p:plain

図7.コンテナ起動時にLSが実行される

コンテナ起動時にlsが実行されて、ホームディレクトリのファイルが表示されることが確認できました。

なお、RUNとCMDは、どちらもコマンドを実行するINSTRUCTION(命令)になります。この2つのINSTRUCTIONの大きな違いは、RUNは実行後のDokcer imageのLayerが作成されますが、CMDはLayerが作成されないという点になります。

 

今回の振り返りは以上になります。

前回、基本を理解したDockerfileの記載し方について、掘り下げて理解することができました。

FROM、RUN、CMDを利用して、基にするDokcer imageに、パッケージをインストールして、コンテナを起動時にデフォルトで実行するコマンドを指定することができました。また、Dokcer imageのサイズをなるべく小さくするために、Layer数を少なくする記述方法についても学びました。

Dokcerを知れば知るほど、早く環境構築をしたくなってきました。自分の環境構築にも活用していきたいと思います。

 

今回受講している「米国AI開発者がゼロから教えるDocker講座」では、もっと詳しくわかりやすくご説明いただけているので、ほんとうに良い勉強になります。

今後も、継続して受講して、もっと、Dockerを使いこなせるようになりたいと思います! 

www.udemy.com

 

 【過去記事】

2019年8月31日(土)にE資格を受験して、合格しました!

E資格対策として勉強の進め方や、参考書などをまとめました。

これから受験される方がいらっしゃいましたらご参考まで。

oregin-ai.hatenablog.com 

 

 2019年3月9日(土)にG検定を受験し、見事合格できました!

受験の体験記や勉強法などを別のブログにまとめました。

これから受験される方がいらっしゃいましたらご参考まで。

g-kentei.hatenablog.com

 【E資格対策に使った参考書】

 

f:id:kanriyou_h004:20200712210639p:plain

Dockerfileについて理解を深める(米国AI開発者がゼロから教えるDocker講座)

今回は、Dockerfileについて、理解を深めました。

これまでは、DockerHubからPullしたDocker imageからコンテナを起動したり、起動したコンテナでの更新を反映したDocker imageとして保存したりしてきましたが、今度は、Dockerfileを使ってDocker image自体を作成できるようになりました。

今回もかめ@usdatascientistさんの「米国AI開発者がゼロから教えるDocker講座」をUdemyで受講しながら進めています。

とても分かりやすく解説いただけますし、ハンズオン形式で講座が進むので、まさに「手で覚える」ことができるので、おすすめです!

www.udemy.com

では、振り返っていきたいと思います。

Dockerfileについて理解を深める

1.Dockerfileとは何か

Dockerfileは、Docker imageを作成するための設定ファイルになります。設定内容は、テキストにて記述します。

DockerfileからDocker imageを作成する場合と、コンテナを起動して必要な更新を実施後にDocker imageとして保存する場合の大きな違いは、更新内容が把握できるという点になります。

コンテナから更新して保存されたDocker imageは、更新した人以外(場合によっては更新した人も)は、更新内容を把握することが困難ですが、Dockerfileから作成されたDocker imageは、Dockerfileの内容を確認することで、把握することができます。

2.Dockerfileの中身を見てみる

まずは、DockerHubからubuntuのDockerfileをダウンロードして中身を見てみます。

DockerHubのサイト(Docker Hub)にアクセスして、一番上のテキストボックスに「ubuntu」と入力してubuntuリポジトリを検索します。

検索したubuntuリポジトリをクリックします。

f:id:kanriyou_h004:20200707215204p:plain

図1.ubuntuリポジトリを検索する

ubuntuリポジトリには、「Supported tags and respective Dockerfile links」と記載されたセクションがあるので、今回は一番上の「18.04」を選択します。

f:id:kanriyou_h004:20200707215738p:plain

図2.Dockerfileを選択する

Dockerfileを選択すると、Dockerfileが保存されているGitHubのページに移動します。

f:id:kanriyou_h004:20200707220226p:plain

図3.Dockerfileが保存されたGitHubのページ

この画面の下の方に、実際のDockerfileの内容が記載されています。

赤字で記載されたINSTRUCTION(命令)と、arguments(引数)で構成され、命令に応じた引数を渡すことで、Docker imageが作成されます。

また、このファイルの中身を確認することで、どんなDocker imageが作成されるかを把握できるようになります。

f:id:kanriyou_h004:20200707221327p:plain

図4.Dockerfileの中身

3.Dockerfileを作ってみる

実際に、Dockerfileを作っています。

Dockerfileは、「Dockerfile」という名前でファイルを作成する必要があります。

テキストファイルで作成することができます。

任意のディレクトリに以下の内容を記載した「Dockerfile」というファイルを作成します。

FROM ubuntu:latest

RUN touch test

1行目は、FROMというINSTRUCTION(命令)に、ubuntu:latestというarguments(引数)を渡します。これは、「ubuntu:latest」というDoceker imageをもとにDocker imageを作ることを意味します。

2行目は、RUNというINSTRUCTION(命令)に、touch testというarguments(引数)を渡します。これは、「touch test」(testというファイルを作成する)というコマンドを実行することを意味します。

4.DockerfileをからDocker imageを作る

 先ほど作ったDockerfileを使ってDocker imageを作成します。

Dockerfileが保存されたディレクトリに移動して、docker buildコマンドを実行します。

引数にはDockerfileが保存されたディレクトリを指定します。

「.」は、今いるディレクトリを表しています。Dockerfileの保存されたディレクトリに移動しているので、今回は「.」でディレクトリを指定しています。

docker build .

f:id:kanriyou_h004:20200711100613p:plain

図5.docker buildを実行する

無事、「af093da89a5e」というDocker imageが作成されました。

docker imagesコマンドで確認します。

docker images

f:id:kanriyou_h004:20200711100927p:plain

図6.作成されたDocker imageを確認する

「af093da89a5e」というDocker imageが作成できていることが確認できました。

まだ、リポジトリ名やタグ名を指定していないので、<none>となっています。

 

名前を指定してDocker imageを作成するためには、「-t」オプションで指定します。

以下のコマンドでは、「new-ubuntu」というリポジトリ名で、「latest」というタグ名を指定しています。

docker build -t new-ubuntu:latest .

f:id:kanriyou_h004:20200711101641p:plain

図7.名前を付けてdocker buildを実行する

 こんどは、「new-ubuntu:latest」というDocker imageが作成できました。

docker imagesコマンドで確認します。

docker images

f:id:kanriyou_h004:20200711101925p:plain

図8.作成されたDocker imageに名前が設定されたことを確認する

リポジトリ名に「new-ubuntu」、タグ名に「latest」が設定されたことが確認できました。

4.コンテナを起動してDocker imageの中身を確認する

 先ほど作成したDocker imageからコンテナを起動して、testファイルが作成されていることを確認します。

まずはコンテナを起動します。

docker run -it new-ubuntu bash

f:id:kanriyou_h004:20200711102616p:plain

図9.コンテナを起動する

コンテナが起動出来たらtestファイルが作成されていることを確認します。

ls

f:id:kanriyou_h004:20200711102759p:plain

図10.「test」ファイルが作成されていることを確認する

ちゃんと「test」ファイルが作成されていることが確認できました。

 

今回の振り返りは以上になります。

Dockerfileの使い方の基本を理解して、DockerfileからDocker imageを作成し、コンテナを立ち上げることができるようになりました。

前回までに実施してきた、コンテナを編集してcommitする方法でも、Docker imageは、作成できるのですが、どういった変更を加えたかを、別途記録しておかないと、どのようなDocker imageなのかがわかりませんでした。

今回学習した、DockerfileからDocker imageを作成する方法の場合、元のDocker imageにどのような変更を加えたかは、Dockerfileを確認することで知ることができます。

それぞれ、一長一短があると思いますので、使い分けていきたいと思います。

(実際は、併用していく感じでしょうか?)

 

今回受講している「米国AI開発者がゼロから教えるDocker講座」では、もっと詳しくわかりやすくご説明いただけているので、ほんとうに良い勉強になります。

今後も、継続して受講して、もっと、Dockerを使いこなせるようになりたいと思います! 

www.udemy.com

 【過去記事】

2019年8月31日(土)にE資格を受験して、合格しました!

E資格対策として勉強の進め方や、参考書などをまとめました。

これから受験される方がいらっしゃいましたらご参考まで。

oregin-ai.hatenablog.com 

 

 2019年3月9日(土)にG検定を受験し、見事合格できました!

受験の体験記や勉強法などを別のブログにまとめました。

これから受験される方がいらっしゃいましたらご参考まで。

g-kentei.hatenablog.com

 【E資格対策に使った参考書】

 

f:id:kanriyou_h004:20200711103812p:plain

Dockerのコンテナについて理解を深める(米国AI開発者がゼロから教えるDocker講座)

今回は、Dockerのコンテナについて、理解を深めました。

Dockerのコンテナの起動の仕組みを確認し、起動に合わせてコマンドを実行したり、コンテナを停止したり削除したりできるようになりました。

今回もかめ@usdatascientistさんの「米国AI開発者がゼロから教えるDocker講座」をUdemyで受講しながら進めています。

とても分かりやすく解説いただけますし、ハンズオン形式で講座が進むので、まさに「手で覚える」ことができるので、おすすめです!

www.udemy.com

では、振り返っていきたいと思います。

Dockerのコンテナについて理解を深める

1.docker runコマンドについて知る

まずは、docker runを詳しく学びました。

docker runは大きく分けて、create(作成する)とstart(起動する)の2ステップの処理が行われます。

この2ステップの処理を別々に実行します。

docker create hello-world

f:id:kanriyou_h004:20200705132014p:plain

図1.docker create実行

createされた状態を確認します。

docker ps -a

f:id:kanriyou_h004:20200705132603p:plain

図2.createされた状態を確認する

hello-worldのコンテナが作成され「STATUS」が「Created」になっていることが確認できました。

次に、docker startで、コンテナを起動します。

docker start e03e9b972652 

f:id:kanriyou_h004:20200705133017p:plain

図3.コンテナを起動する

コンテナIDだけが返ってきます。

再度、状態を確認します。

docker ps -a

f:id:kanriyou_h004:20200705133142p:plain

図4.起動したコンテナを確認する

「STATUS」が「Exited」になっています。

hellow-worldコンテナは、起動後すぐに処理を実行した後Exitしてしまうので、なにも出力されず、「Exited」状態になってしまいます。

出力する結果を知りたい場合は、以下を使います。

docker start -a e03e9b972652

f:id:kanriyou_h004:20200705133754p:plain

図5.[-a]オプションを付けてコンテナを起動する

出力結果が確認できました。

2.コンテナ起動時にデフォルトコマンド以外を実行する

hello-worldでは、コンテナ起動時に自動的に(デフォルトコマンドで)「Hello from Docker!」という文字列を出力してExitすることを確認しました。

今度は、ubuntuのコンテナ起動時に、デフォルトコマンド以外のコマンドを実行してみます。

まず、ubuntuのコンテナをデフォルトコマンドで起動した場合にどうなるか確認します。

docker run ubuntu

f:id:kanriyou_h004:20200705134809p:plain

図6.ubuntuコンテナを起動する

何も出力されず終了します。

コンテナの状態を確認します。

docker ps -a

f:id:kanriyou_h004:20200705135000p:plain

図7.ubuntuコンテナの状態を確認する

「STATUS」が「Exited」になっており、hello-world同様に、コンテナが作成され、起動され、デフォルトコマンド実行後、Exitしています。

次に、デフォルトのコマンドではなく、「ls」を実行してみます。

docker runコマンドの2つ目の引数に実行したいコマンド、今回の場合は「ls」を指定します。

docker run ubuntu ls

f:id:kanriyou_h004:20200705135716p:plain

図8.コンテナ起動時に実行するコマンドを指定する

コンテナが起動後、「ls」コマンドを実行して、出力できました。

ただ、デフォルトコマンド同様、実行後は、コンテナからExitします。

3.コンテナ起動後にExitせずに入力可能な状態にする

先ほどは、デフォルトコマンドを実行後、Exitしてしまいましたが、コンテナ上でもろもろ処理できるように入力可能な状態にします。

[-i]オプションを付けることで、入力可能な状況になります。

また、[-t]オプションも追加した[-it]とすることで、図8.のような出力ではなく、見やすい出力になります。

docker run -it ubuntu bash

f:id:kanriyou_h004:20200705140915p:plain

図9.[-it]オプションを付けてコンテナを起動

これで、コンテナを起動後、bashを実行し、入力可能な状態となり、表示もきれいになりました。

4.コンテナを削除・停止・全削除する

まず、コンテナの状態を確認します。

docker ps -a

f:id:kanriyou_h004:20200705141552p:plain

図10.コンテナの状態を確認

「STATUS」が「Exited」になっている2つ目のコンテナを削除します。

削除するには、docker rmコマンドを使って、引数にコンテナIDを指定します。

docker rm 73abf556080e

f:id:kanriyou_h004:20200705141841p:plain

図11.コンテナを削除する

再度コンテナの状態を確認します。

docker ps -a

f:id:kanriyou_h004:20200705142125p:plain

図12.コンテナが削除されたことを確認する

2つ目のコンテナ「73abf556080e」が削除されました。

同様に、1つ目のコンテナも削除したいところですが、このコンテナは、「STATUS」が「Up」の状態なので、削除することができません。

このため、まずは、このコンテナを停止させます。

停止するには、docker stopコマンドを使って、引数にコンテナIDを指定します。

docker stop afba2b1baf15

f:id:kanriyou_h004:20200705142531p:plain

図13.コンテナを停止する

再度コンテナの状態を確認します。

f:id:kanriyou_h004:20200705142635p:plain

図14.コンテナが停止されたことの確認

1つ目のコンテナも「STATUS」が「Exited」になっていることが確認できました。

これで、先ほどと同様にdocker rmコマンドでコンテナが削除できます。

最後に、停止されているコンテナを全て削除します。

コンテナを全て削除するにはdocker system pruneコマンドを実行します。

docker system prune

f:id:kanriyou_h004:20200705143200p:plain

図15.コンテナ全削除の実行

コマンドを実行すると、本当に削除してよいか確認されるので、削除して良ければ「y」を入力すると削除が実行されます。

コンテナの状況を確認します。

docker ps -a

f:id:kanriyou_h004:20200705143427p:plain

図16.全コンテナが削除されたことの確認

全てのコンテナが削除されたことが確認できました。

5.コンテナのファイルシステムの独立性の確認

コンテナのファイルシステムと、ホストのファイルシステムや別のコンテナのファイルシステムとは独立していて、何もしなければ、相互にファイルのやり取りはできません。

2つのコンテナを作って確認していきます。

まずは、コンテナを1つ作成して、そのファイルシステムの中に、「test1」というファイルを作成します。

docker run -it ubuntu bash

f:id:kanriyou_h004:20200705144233p:plain

図17.1つめのコンテナの起動

touch test1

ls

f:id:kanriyou_h004:20200705144502p:plain

図18.touchコマンドで「test1」ファイルを作成

次に同様に、もう1つコンテナを起動して、「test2」ファイルを作成します。

docker run -it ubuntu bash

touch test2

f:id:kanriyou_h004:20200705145015p:plain

図19.もう1つコンテナを起動して「test2」ファイルを作成する

コンテナが2つ起動していることを確認します。

f:id:kanriyou_h004:20200705145249p:plain

図20.コンテナが2つ起動していることを確認

次に、それぞれのコンテナのルートディレクトリのファイルを確認します。

f:id:kanriyou_h004:20200705145548p:plain

図21.1つ目のコンテナのファイル

f:id:kanriyou_h004:20200705145647p:plain

図22.2つ目のコンテナのファイル

1つ目のコンテナは「test1」のみ、2つ目のコンテナは「test2」のみが作成されていて、ファイルシステムが別々であることが確認できました。

6.コンテナに名前を付ける

これまで、コンテナを起動するときに、特にコンテナの名称は指定しませんでしたが、コンテナの名称を指定しない場合は、ランダムな名前が付けられます。

ずっと起動させ続けたり、共有サーバとして使うときや、他のプログラムで使用するときのように、決まった名前が必要となる場合には、名前を指定してコンテナを起動することができます。

docker run コマンドで、[--name]オプションを指定して、引数の1つ目にコンテナの名前、2つ目にDocker imageを指定します。

docker run --name sample_container ubuntu

f:id:kanriyou_h004:20200705150830p:plain

図23.コンテナに名前を付けて起動

コンテナの状態を確認します。

docker ps -a

f:id:kanriyou_h004:20200705150956p:plain

図24.コンテナの名前を確認

「NAMES」に先ほど指定した「sample_container」が付けられていることが確認できました。

すでに作成されているコンテナに同じ名前があった場合はエラーとなるので、注意が必要です。

7.detachedモードとforegroundモード

ずっと起動させたままにしたい場合などに、バックグラウンドでコンテナを起動させておきたい場合などは、detached モードを利用します。

また、逆に一回一回、コンテナを終了させる毎に、コンテナを削除する場合は、foregroundモードを利用します。

では、まずdetachedモードでコンテナを起動します。

detachedモードでコンテナを起動するには、[-d]オプションを使います。

docker run -it -d ubuntu bash

f:id:kanriyou_h004:20200705152316p:plain

図25.detachedモードでコンテナを起動

detachedモードで起動すると、[-it]オプションを指定しても、何も表示されずにホストのプロンプト戻ってきます。

コンテナの状態を確認します。

docker ps -a

f:id:kanriyou_h004:20200705152842p:plain

図26.detachedモードのコンテナの状態を確認

コンテナの状態を確認すると「STATUS」が「Up」になっていて、バックグラウンドで実行状態で、Exitしていないことが分かります。

 

次にforegroundモードでコンテナを起動します。

foregroundモードでコンテナを起動するには、[--rm]オプションを使います。

docker run --rm hello-world

f:id:kanriyou_h004:20200705153400p:plain

図27.foregroundモードでhello-worldコンテナを起動する

foregroundモードでhello-worldコンテナを起動すると、これまで通り、「Hello from Docker!」が出力されて、ホストのコマンドに戻ってきました。

では、コンテナの状態を確認します。

docker ps -a

f:id:kanriyou_h004:20200705153650p:plain

図28.コンテナの状態を確認

これまでは、hello-worldを起動した後は、Exitしたコンテナが残っていましたが、コンテナが残っていません。

これは、[--rm]オプションをつけることで、コンテナ起動後、Exitして、そのあとコンテナの削除も実行してくれるからです。

一度きり起動のコンテナは、こうすることで、残骸が残っていくことが防げます。

 

今回の振り返りは以上になります。

Dockerのコンテナについて、より深く理解することができ、コンテナを起動、停止、削除、コンテナ上でのコマンドの実行などができるようになりました。

これまで、Dockerを利用するといっても、インターネット上の記事に記載されていたDockerのコマンドを丸写しして実行していただけだったのですが、今回の講座で、内容を理解して実行できるようになりました。

少しずつですが、手を動かして進歩を感じることができるのは、すごく励みになります。

 

今回受講している「米国AI開発者がゼロから教えるDocker講座」では、もっと詳しくわかりやすくご説明いただけているので、ほんとうに良い勉強になります。

今後も、継続して受講して、もっと、Dockerを使いこなせるようになりたいと思います! 

www.udemy.com

 【過去記事】

2019年8月31日(土)にE資格を受験して、合格しました!

E資格対策として勉強の進め方や、参考書などをまとめました。

これから受験される方がいらっしゃいましたらご参考まで。

oregin-ai.hatenablog.com 

 

 2019年3月9日(土)にG検定を受験し、見事合格できました!

受験の体験記や勉強法などを別のブログにまとめました。

これから受験される方がいらっしゃいましたらご参考まで。

g-kentei.hatenablog.com

 【E資格対策に使った参考書】

 

f:id:kanriyou_h004:20200705161439p:plain



TensorFlowで機械学習に挑戦(Pythonによるスクレイピング&機械学習テクニック)

今回は、Dockerで構築したTensorFlowの環境で、機械学習(深層学習)に挑戦しました。 

今回も Pythonによるスクレイピング&機械学習開発テクニック増補改訂 Scrapy、BeautifulSoup、scik [ クジラ飛行机 ]の第4章を参考にさせていただきながら、取り組んでいます。 

 TensorFlowの環境構築は、前回の記事をご参照ください。

oregin-ai.hatenablog.com

また、Dockerの詳細を勉強したい方は、かめ@usdatascientistさんの「米国AI開発者がゼロから教えるDocker講座」が非常にわかりやすいので、おすすめです。

px.a8.net

 

では、振り返っていきたいと思います。

TensorFlowで機械学習に挑戦

1.全体像

コードは以下の通りで、「mnist-train.py」というファイルに保存しました。

import tensorflow as tf

# MNIST データセットを準備する
mnist = tf.keras.datasets.mnist
(x_train, y_train), (x_test, y_test) = mnist.load_data()

# データを正規化する
x_train, x_test = x_train / 255.0, x_test / 255.0

#層を積み重ねてモデルを構築する
model = tf.keras.models.Sequential([
  tf.keras.layers.Flatten(input_shape=(28, 28)),
  tf.keras.layers.Dense(128, activation='relu'),
  tf.keras.layers.Dropout(0.2),
  tf.keras.layers.Dense(10, activation='softmax')
])

#訓練のためにオプティマイザと損失関数を設定する
model.compile(optimizer='adam',
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])

#モデルを訓練してから検証する
model.fit(x_train, y_train, epochs=5)
model.evaluate(x_test,  y_test, verbose=2)

では、コードを順に振り返っていきます。

2.MNIST データセットを準備する

以前、SVM機械学習時にも利用した、MNISTのデータセットをkeras.datasetsから読み込みます。

mnist = tf.keras.datasets.mnist 

load_data()メソッドを使って、訓練データと、検証データに分割します。

(x_train, y_train), (x_test, y_test) = mnist.load_data()

3.データを正規化する

MNISTのデータは、0~255の輝度データなので、255.0で割ることで、0~1の不動点小数値に変換(正規化)します。

x_train, x_test = x_train / 255.0, x_test / 255.0 

 4.層を積み重ねてモデルを構築する

keras.modelsのSequentialメソッドを使って、モデルを構築します。

引数に、積み重ねる層(layers)をリスト型で受け渡すことで、深層学習のモデルが構築できます。

model = tf.keras.models.Sequential([

1層目のFlattenは、縦横28x28の2次元データを784個の1次元データに変換します。

  tf.keras.layers.Flatten(input_shape=(28, 28)),

2層目のDenseは、入力データに重みをかけて、128個の出力に変換します。出力は「relu」という関数で変換して出力します。

  tf.keras.layers.Dense(128, activation='relu'),

3層目のDoropoutは、学習時に出力をランダムに削ります。これは学習時に訓練データに特化した「過学習」にならないように、する対策になります。

  tf.keras.layers.Dropout(0.2),

4層目のDenseは、入力データに重みをかけて、10個の出力に変換します。この層は最後の出力となるので、0~9のどの数字だったかを判定するために「softmax」という関数で変換して出力します。0~9のどの手書き文字であったかを確率を表しています。

  tf.keras.layers.Dense(10, activation='softmax')
])

5.訓練のためにオプティマイザと損失関数を設定する

訓練を実施するにあたり、compileメソッドを使って、各種設定を実施します。

optimizerでモデルを学習する際に重みの更新をする手法(最適化手法)を指定します、今回は「adam」を指定します。

model.compile(optimizer='adam',

 optimizerについては、以下もご参照ください。

oregin-ai.hatenablog.com

 損失関数(loss)には、'sparse_categorical_crossentropy'を設定して、'accuracy'(精度)で評価します。

loss='sparse_categorical_crossentropy', metrics=['accuracy'])

6.モデルを訓練して、評価する

fitメソッドでモデルを訓練します。引数は、1つ目が説明変数、2つ目が目的変数、三つ目にエポック数(訓練データ全体を訓練する回数)を指定します。

model.fit(x_train, y_train, epochs=5) 

評価は、evaluateメソッドで行います。引数は、1つ目、2つ目は、fitと同様に検証データの説明変数と目的変数を渡します。三つ目のverboseは、進捗表示をOnにします。

model.evaluate(x_test, y_test, verbose=2)

6.コマンドラインから実行する。

先ほど作成したファイルを実行してみます。

python3 mnist-train.py

f:id:kanriyou_h004:20200704215407p:plain

図1.mnist-train.py実行結果

実行した結果、accuracy(精度、正解率)が、0.9782とかなり高い精度で分類するモデルとすることができました。

以前SVMにて分類した際には、accuracy(精度、正解率)が、0.88程度でしたので、結構精度があがったようです。

SVMでの画像分類については、以下をご参照ください。

oregin-ai.hatenablog.com

今回は、TensorFlowで実際に、機械学習(深層学習)を実施してきました。

深層学習って難しそうだなぁと思っていましたが、TensorFlowを使うことで、意外と簡単に構築できたのは、うれしかったです。

(実際の業務やコンペとかで使いこなせるようになるには、まだまだ修行が必要ですが・・・。)

 

 今後も、Pythonによるスクレイピング&機械学習開発テクニック増補改訂 Scrapy、BeautifulSoup、scik [ クジラ飛行机 ]で、スクレイピング機械学習開発に取り組んでいきたいと思います。

 

 

 【過去記事】

2019年8月31日(土)にE資格を受験して、合格しました!

E資格対策として勉強の進め方や、参考書などをまとめました。

これから受験される方がいらっしゃいましたらご参考まで。

oregin-ai.hatenablog.com 

 

 2019年3月9日(土)にG検定を受験し、見事合格できました!

受験の体験記や勉強法などを別のブログにまとめました。

これから受験される方がいらっしゃいましたらご参考まで。

g-kentei.hatenablog.com

 【E資格対策に使った参考書】