- 投稿日:2019-03-23T22:30:31+09:00
 
【保存版・初心者向け】独学でAIエンジニアになりたい人向けのオススメのAI勉強方法 (2019年改定版)
追記
Pythonや機械学習がオンライン上で学べるAI Academyをnoteでも書きましたが、3/17日からほとんどのコンテンツを永続的に無料で利用できるよう致しましたので、是非この記事と合わせて使って頂けますと幸いです!
はじめに
我々は、AI Academyというサービスを通じて、これまで1500名以上の方々に、プログラミング(Python)、統計的機械学習、深層学習(Deep Learning)、機械学習のための数学、確率・統計などを教えてきました。
そんな中、サービスを通じて一人一人に最適な勉強方法を日々出会う初学者の方々に、私達なりの学習アドバイスを行なっていたのですが、1500名以上の初学者に教えていく中で、人工知能を勉強するにあたって、多くの『わからない』には、共通する点があることに気づきました。
この記事では、我々が解決してきた受講生の方々の共通の『わからない』を体系的にまとめることで、
これからAIエンジニアになりたいと考えている多くの初学者にとって、役に立てれるのではないかと思い記事にすることに致しました。
今回の記事を通して、1人でも多くの方に何か参考になることがありましたら幸いです。※この記事は以前書いた【保存版・初心者向け】独学でAIエンジニアになりたい人向けのオススメの勉強方法の改定版記事になります。
前回の内容で紹介していない書籍や、前回紹介していた書籍を今回は紹介していなかったりもします。
学習ロードマップも更新しましたので、最後までお読み頂けますと幸いです。この記事の対象者
この記事の対象者は次のような方達に向けて書いております。
・将来Pythonでデータ分析をしたいと考えているが、何から手をつけたら良いかわからないという方
・将来、人工知能に関連した業務に携わりたいと検討中の初学者の方
・未経験者からAIエンジニアになりたく、そのためにどのような知識が必要か知りたい方
・AIプログラミングスクールや専門学校に進学しようか考えているが、独学で勉強できる方法を知りたいという方
対象ではない方
・既に業務でデータ分析している方
・機械学習やディープラーニングを使ったWebアプリなどを作りたいと考えている方
・ディープラーニングの資格試験の勉強方法
などなどは対象としておりません。
AIエンジニアに最低限必要な知識
AIエンジニアに最低限必要な知識を大きく6つに分けて見ました。
ここでは、将来AIエンジニアとして業務を行うにあたり、大きく分けて6つの内容の基礎知識の全体像を把握してください。①プログラミングスキル
- Python
- numpy、pandas、matplotlib、scikit-learn、TensorFlowやkeras②数学
- 微分、線形代数、ベクトル、行列、確率など③統計の知識
- 標準偏差、分散、確率分布、推定、検定などなど④機械学習の基礎知識
- 教師あり学習と教師なし学習
 - 前処理、特徴量設計、学習と評価
 - 単回帰、重回帰分析、最小二乗法、パーセプトロン、ロジスティック回帰
 - 決定木、ランダムフォレスト、サポートベクトルマシン、K-means、etc..
 - ディープラーニングの実装スキル及び知識
 - scikit-learn
 - TensorFlowやKerasなどのフレームワークの知識
 - scikit-learnで学習済みモデルを作るまでの流れなど。
 
1.データの収集とデータの前処理欠損値の補完や外れ値の削除)
2.特徴量の設計(特徴量の選択)
3.モデル開発(モデルの選択と学習)
4.モデル評価・・・交差検証、混合行列など
⑤SQLを使ってデータベースを操作する知識
- select、insert、update、delete、where、like、limit、sum、avg、max、group by、having、order by、テーブル結合、ビュー、サブクエリ、caseなどなど⓺クラウドの知識
- AWSやGCPやAzureなどのクラウドインフラ回りの知識大きく6つもあり、意外と多いなと思われたかもしれませんが、一度に全てやるのではなく、まずは①と④の2つに絞ることをオススメします。
理由は、実際にプログラムを書き、目に見える形にすることで継続して学びやすくなるからです。
はじめに理論から入ると独学だと挫折してしまうので。
その後、③の統計や②の数学、⑤のSQL、⓺のクラウドを進めていきましょう。
- ①プログラミングスキル
 - ④機械学習の基礎知識
 - ③の統計、②の数学
 - ⑤のSQL、⓺のクラウド
 人工知能を独学で勉強するオススメの方法
必要な知識は前の節で紹介しましたが、どのようにそれらを学べば良いのでしょうか。
①から⑥を学ぶ上で、以下のような順で知識を身につけていくことをオススメしています。フェーズ1 pythonプログラミングと人工知能概論を学ぶ
フェーズ2 機械学習プログラミング
フェーズ3 Kaggleに挑戦
フェーズ4 SQL、スクレイピング、クラウドなどの技術も身につける。
フェーズ5 機械学習を活用したプロダクト制作をする
フェーズ6 教える
フェーズ7 専門分野を確立するこのフェーズごとに学んでいくことがもっとも自分自身に負荷をかけず、楽しく学ぶことができると考えています。
フェーズ1ではプログラミング初学者の方を指しております。
もし、プログラミングを初めてという方は是非フェーズ1から目を通してください。フェーズ2では実際にフェーズ1で学んだ内容をベースに、機械学習プログラミングに関する勉強方法を説明して参ります。
既にscikit-learnを使った機械学習プログラミングを行なっている方は飛ばして頂いても構いません。フェーズ3ではKaggleなどを利用し、実際にコンペに参加し、実践的な機械学習プログラミングを学ぶ方法を記述しています。
フェーズ4 機械学習をやる上で、データベースからデータを取り出すことは頻繁に行われますので、SQLの知識は必須です。ここでは、SQLの他にスクレイピング(データ収集用)、クラウド関連の内容に関して記述しています。
フェーズ5 機械学習スキルを活用してプロダクト制作に取り掛かりましょう。このレベルまで到達した方は、プロダクト制作を通じて学ぶという内容に関して記述しています。
フェーズ6 人に教えることで自分の分かっていなかったことが明確になることがあります。ですので、友人などに機械学習を教えて自分の理解を深めるという内容に関して記述しています。
フェーズ7 人工知能の領域は幅広く、画像認識や自然言語処理、音声認識などがあります。ここでは専門分野を確立する方法に関して記述しています。
以降、7つのフェーズごとに、どのようにこれらに取り組めば良いのか、オススメの書籍などを紹介しながら説明していきます。
フェーズ1 pythonプログラミングと人工知能概論を学ぶ
独学で、書籍を使って、
人工知能開発に最低限必要な知識は「機械学習の知識」と「Pythonの知識」と「機械学習のための数学と確率・統計学」です。このフェーズでは、「機械学習の知識」と「Pythonの知識」に絞り、一旦「機械学習のための数学と確率・統計学」は違うフェーズに回しても大丈夫です。
数学や確率がわからなくても、機械学習用のライブラリを使えば機械学習を体験でき、理論だけの学びよりモチベーションが保ち安いからです。(人によっては理論からの方が継続できる方もいるかと思いますので断言はしません。)
その後、ライブラリに頼った実装をした後に、中で何が行われているのか気になってから、一度立ち戻って数学・統計学などを学ぶことをオススメします。では、オススメ書籍を紹介していきます。
まず、プログラミング初心者または、Pythonの基本文法に自信がない方は下記書籍がオススメです。
2894円
こちらの書籍はpythonの基礎にあたる基本文法だけでなく、機械学習プログラミングに関する基礎も学べます。
この書籍を一通り読み終えることで、pythonプログラミングの基礎力と、機械学習プログラミングの体験が出来ます。また、pythonプログラミングを始める際には、開発環境いらずのブラウザかつ無料で使える、CPU/GPUの機械学習環境が整ったGoogle Colaboratoryを利用してPythonプログラミングをしていきましょう。
次に、人工知能の概要に関してさらっと学びたい方は下記の書籍をお勧めします。
・人工知能は人間を超えるか ディープラーニングの先にあるもの (角川EPUB選書) [単行本]
1512円
上記2冊はPythonの本を読み、出てくるプログラムを手を動かしながら進めてください。
さて、上記2冊で人工知能に関する知識及びPythonプログラミングの基礎が固まった方は、
機械学習の一連の流れと統計的機械学習のプログラミングを始めましょう。フェーズ2 機械学習プログラミング
・Pythonではじめる機械学習
こちらも手を動かしながらコードを書き、またその後コードを読む(写経)をおこなってください。
ただ本を読むだけより、手を動かしながら進める方が理解が深まります。3672円
もしくは
PythonによるAIプログラミング入門 ―ディープラーニングを始める前に身につけておくべき15の基礎技術
3672円
+α
http://amzn.asia/9EPUIpg
4320円もしくは
scikit-learnとTensorFlowによる実践機械学習
4860円
・数学
スバラシク実力がつくと評判の線形代数キャンパス・ゼミ―大学の数学がこんなに分かる!単位なんて楽に取れる!
もしくは、
2786円
機械学習の技術書を読み、数式アレルギーが出た方はキカガクさんの動画をオススメします。
手書きで講義で数学が学べ、何より説明がわかりやすいです。
数学がアレルギーの方は上記のほんと合わせて、2つの動画を利用することをオススメします。【キカガク流】人工知能・機械学習 脱ブラックボックス講座 - 初級編 - | Udemy
【キカガク流】人工知能・機械学習 脱ブラックボックス講座 - 中級編 - | Udemy
・数学+α
機械学習のアルゴリズムを数学を学びながら、Pythonで実装したい方は下記書籍はオススメです。機械学習のエッセンス -実装しながら学ぶPython,数学,アルゴリズム- (Machine Learning)
・統計学
3,024円
確率・統計学編
・データ前処理
前処理大全[データ分析のためのSQL/R/Python実践テクニック]http://amzn.asia/aa5dHB0
3240円次に、ライブラリを用いてDeep Learning(ディープラーニング)に関して勉強してみると良いでしょう。
(最近は、PyTorchも人気が出でおり、色々と試して使いやすいものを選ぶのが良いかと思います。)
初心者にオススメなのはKerasです。・Keras
PythonとKerasによるディープラーニング4190円
書籍以外にも、Udemyなどがオススメです。
次の動画も合わせてご利用してみてください。Pythonで機械学習:scikit-learnで学ぶ識別入門
フェーズ3 Kaggleに挑戦
さて、フェーズ1,2では書店で販売されている機械学習関連の書籍を紹介しました。
上記の書籍を順番に1〜3ヶ月ほど手を動かしながら進めると、機械学習の一連の流れや、自分で機械学習のモデルを読み書きできるレベルになっているはずです。ここでは、次のフェーズとしてKaggleやSIGNATE(旧 DeepAnalytics)を使って、実践します。
Kaggleは、世界中のデータサイエンティストが集まるコンペティションサイトです。
企業などが分析してほしいデータをここに載せて、ユーザーが分析をして、分析の精度を競います。
上位3位にはデータをあげた企業から賞金が出る場合もあります。
Kaggleのオススメの使い方としては、Kernels(カーネル)という機能を使うことです。
カーネルでは、各データセットに対して他のユーザーが構築したモデルのコードの説明などがわかりやすく書いてあります。Kaggleで実際にデータ解析を行うとわかりますが、データの前処理が大変重要です。
ここでのポイントとしては、pandasを上手く使いこなせるかが鍵になっております。pandasのデータ加工でわからないことがあれば、
pandas公式 チュートリアルから再度復習してみてください。書籍としてはPythonによるデータ分析入門がオススメです。
Pythonデータ分析/機械学習のための基本コーディング! pandasライブラリ活用入門
機械学習のための特徴量エンジニアリング ―その原理とPythonによる実践
フェーズ4 SQL、スクレイピング、クラウドなどの技術も身につける。
実データに関しては、Web上のデータであればデータベースに保存されていることが多いため、SQLの知識も必要になります。
SQLが使えると、自分でDBから必要なデータを抽出できますし、csvなどで書き出してpythonでそのままデータ分析に繋げることが出来ます。ここでは、SQLを使ってデータ分析をするための参考になる書籍を紹介します。
・ProgateのSQL編(SQL初級者向け)
Progate[プロゲート] SQL・AI Academy SQL編 (SQL初心者向け)
・AI Academy SQL編 (SQL中級者向け)・SQLを使って分析をする(SQL中級者向け)
ビッグデータ分析・活用のためのSQLレシピデータ収集はデータベースから行うこともあれば、スクレイピング等で行うこともあります。
スクレイピングはWebサイトに掲載されている情報を収集するための技術です。
ここでは、スクレイピングの技術習得のためにオススメの書籍を二冊紹介いたします。
・1冊目にオススメ
Pythonによるスクレイピング&機械学習 開発テクニック BeautifulSoup,scikit-learn,TensorFlowを使ってみよう・2冊目にオススメ
Pythonスクレイピングの基本と実践 データサイエンティストのためのWebデータ収集術 (impress top gear)
もしくは
Pythonクローリング&スクレイピング -データ収集・解析のための実践開発ガイド・クラウド
ここではGoogle Cloud Platform(GCP)の簡単な説明をします。Google Cloud Platformは、Googleが保有する膨大なインフラストラクチャや機械学習等といったサービスを使った分だけの支払いで利用することができるクラウドサービスの総称であり、GCPを使うことでサービスを開発する上でのインフラ周りや、高性能なデータ分析・機械学習サービスを各種APIを通じて利用が出来ます。
GCPとよく比較されるサービスとしてAmazonのAWS、Micro softのAzureなどがありますがそれらの違いは下記記事を参考にして見てください。Google Cloud Platform とAWS、Azureの違い
また、GCPのAPIをPythonで呼び出すことが出来ますが、下記画像にある通り画像認識・動画解析、音声認識、自然言語処理などのAPIが用意されています。
自分の作りたいものを作るときに、0からscikit-learnやKerasなどを使って自前で作るより、APIを使った方が簡単にかつ、精度の良いものを作ることが出来ます。
自分にあったAPIを探し、ドキュメントや、Googleで検索したり、qiitaで調べたりして出てきた記事を参考にすれば実装が出来たりします。GOOGLE CLOUD PLATFORM での PYTHON
フェーズ5 機械学習スキルを活用してプロダクト制作をする
フェーズ5まで、機械学習スキルやそれ以外の人工知能関連技術を学びました。
ほとんど最後のフェーズですが、次のフェーズとしてはプロダクト制作をすることをオススメします。プロダクトには様々な形があると思いますが、ひとまずWebアプリケーションが学習コストが少なく済むので、オススメです。
次に、モバイルのアプリなどに取り組んで見ても良いでしょう。
Webアプリケーション作成にはPythonの他にも、HTML, CSS, JavaScriptの知識が必要です。
これらの知識はプロゲート, ドットインストールなどを利用して身につけましょう。・HTML, CSS, JavaScript
プロゲート
3分動画のドットインストール(dotinstall)また、PythonでのWebアプリケーション開発はDjango,Flaskなどのフレームワークが有効ですが、一人で学ぶには、Flaskが学びやすいです。
FlaskはUdemyの動画を参考にすると良いでしょう。
Udemy動画やテキストをただ見る、読むのはでなく、実際にプログラムを打ち込みながら手を動かして進めるのがオススメです。
また、学習済みモデルを組み込んだWeb APIをFlaskなどで作れるようになっておくと良いです。さらに、Web開発を身につけた方は、Google CloudのAPIなども合わせ学び、これまで学んだことを合わせてあなたのアイデアを形にしてみてください。
Google Cloudでは、画像・動画分析、音声認識、テキスト分析などを容易に扱うことが可能です。フェーズ6 教える
プログラミングや機械学習を学んだら、友人でも良いので誰かに教えることをオススメします。
教える方法としては、イベントやセミナーを行うのも良いですし、Skypeなどを使い、友人にマンツーマンレッスンを行なったり、カフェで直接教えたりするのが良いです。教える以外にもQiitaやブログに記事を書いたり、本を書くとかも良いかと思います。
AI Academyでは受講生の交流会やLT会もやっており、人前で教える機会も提供しておりますので、是非ご活用して見てください!フェーズ7 専門分野を確立する
人工知能の領域には、画像認識や自然言語処理、音声認識、強化学習などあります。
フェーズ6まで進めた方は、自分の専門分野を身につけていきましょう。・画像認識
・自然言語処理
深層学習による自然言語処理 (機械学習プロフェッショナルシリーズ)
・音声認識
・強化学習
機械学習スタートアップシリーズ Pythonで学ぶ強化学習 入門から実践まで
・深層学習(ディープラーニング)【理論と実装】
深層学習の理論と実装+Kerasを用いて、基礎からしっかり学びたい方は下記の3冊+αで、基礎から実践までカバーできます。
①ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装
もしくは、
はじめてのディープラーニング -Pythonで学ぶニューラルネットワークとバックプロパゲーション- (Machine Learning)
②ゼロから作るDeep Learning ❷ ―自然言語処理編
③深層学習
+α
直感 Deep Learning ―Python×Kerasでアイデアを形にするレシピ
学習ロードマップ
さて、上記で色々と書籍をご紹介しましたが、上記のロードマップの書籍をベース進めることで、機械学習エンジニアに最低限必要なスキルを体系的に身につけることができます。
順番ですが、①の機械学習から始め、必要に応じて数学・統計を進めてください。
①と②が終わったら、次に深層学習を進めるのをお勧めします。
ただし、AIエンジニアになることが目的ではなく、画像認識で〇〇を作りたい。という作りたいものが明確な方は、『直感 Deep Learning ―Python×Kerasでアイデアを形にするレシピ』だけで十分な場合もあります。何度も記述していることですが、ポイントなのが、基本的に書籍に出てくるコードは実際に書いて進めることです。
例えば、英語などを勉強するときも教材を眺めるだけより、書いたり読み上げたり聞いたりすることが有効だったりします。
プログラミング言語も同様で、ただ本を眺めるだけより、実際に写経することでより理解が深まります。
ただし、どの教材も100%理解する必要はありません。
どのタイミングで、次の書籍へ進むかの判断基準ですが、書籍に書いてあること全て理解せずに、7割理解できたかなというレベルで十分です。
そこに到達したら次へ進みましょう。AIエンジニアとして就職・転職希望の方は上記の書籍の内容に加え、
上記でまとめたSQLの基礎的な内容の理解や、Kaggleのコンペもいくつかやったり、統計検定2級あたりを所持したり、普段から英語に慣れておくと良いかもしれません。まとめ
ここまでの流れをまとめます。
フェーズ1 pythonプログラミングと人工知能概論を学ぶ
フェーズ2 機械学習プログラミング
フェーズ3 Kaggleに挑戦
フェーズ4 SQL、スクレイピング、クラウドなどの技術も身につける。
フェーズ5 機械学習スキルを活用してプロダクト制作をする
フェーズ6 教える
フェーズ7 専門分野を確立する英語に自信がある方へ
ここまでは、学習方法やオススメの書籍などを紹介しましたが、英語に自信がある方にはオススメのサービスを紹介します。
※英語苦手だとしてもCoursera (コーセラ)の機械学習は是非受講することをオススメします。①Coursera (コーセラ)
Coursera Machine Learning
コーセラは世界中の人に最高の教育を無料で提供するということを理念にしているオンライン教育サービスです。
特に機械学習のコースの講師はStanford Universityのアンドリュー・ウ(Andrew Ng)氏です。
アンドリュー氏は、人工知能の研究をしており、Google Brainの立ちあげやCouseraのファンダーでもあります。
シリコンバレーにあるBaiduの研究所で勤務しておられる方であり、機械学習を学ぶのに最も適した教材とも言え、機械学習の主要なアルゴリズムを直感的に理解し、実際にプログラミングできるように教えてくれます。
Andrew Ng氏は沢山褒めてくれるので、とても嬉しくなります笑
(※プログラミング言語はPythonではなく、Octave・MATLABです)=== 追記ここから ===
Twitterにて以下のようなリプがありましたので、追記いたします。Octave・MATLABで学ぶのはプログラミング未経験の初学者にはハードルが高すぎ…ではないでしょうか?
プログラミング初心者の場合、Pythonに比らべ、Octave・MATLABは取っつきにくいかもしれません。
もしこの記事を読んでいるあなたが英語大丈夫!という場合、下記のYouTubeチャンネルでもOKです。
https://www.youtube.com/playlist?list=PLQVvvaa0QuDfKTOs3Keq_kaG2P55YRn5v
こちらは言語がPythonです。
また、書籍でしたら、Python 機械学習プログラミングがオススメです。
http://amzn.asia/9EPUIpg
=== 追記ここまで ===②Learn with Google AI (ai.google education)
Learn with Google AIGoogle社内教育プログラムで無料で利用可能です。
コンテンツは、大変わかりやすい動画です。こちらもオススメ
Udacity「Intro to Machine Learning
Machine Learning with Python (YouTube)
本気でAIエンジニアを目指している方へ
上記内容を順に学んでいくことで、一定の基礎スキルが身につき、AIエンジニアとしての入り口に入れるかと思います。
ですが、実務でAIエンジニアとして活躍していくにはまだまだ知識的に足りない可能性があります。
その際には、以下に挙げる勉強法と、その書籍にも目を通していくことをオススメします。
- C++及びJava言語で機械学習のアルゴリズムも書けるようにする。
 - 『データ解析のための統計モデリング入門――一般化線形モデル・階層ベイズモデル・MCMC』以上の統計学の知識 と統計学入門 (基礎統計学Ⅰ)
 - 統計的学習の基礎 ―データマイニング・推論・予測
 ここで紹介した書籍をある程度読み、実際にプログラムを打つところまで終わったら、仕事を探してみましょう。
あなたが学生なら、実際にWantedlyなどで機械学習アルバイト・インターンを募集している会社に応募してみたり、社会人の方なら、社内の上司にデータ分析をしたいとお願いしてみるのも良いかもしれません。終わりに
ここまでお読みいただきありがとうございました!
これまで長々と書いておりましたが、上記した書籍を全て1から学ぶにはそれなりの学習コストがかかります。
僕が会社で運営しているAI Academyという、無料で学べる(一部有料)オンラインAIプログラミング学習サービスやAIスクールも是非ご利用ください!
本気で将来AIエンジニアを目指されている方はAI Academy Gymもご検討頂けると幸いです!
最後にこの記事が良かったら是非シェア頂けると嬉しいです!
この記事読んで頂いた方は、返信が遅れる場合もありますが、TwitterにてDM頂ければ色々とご相談も乗ります。
改めて、ここまでお読みいただきありがとうございました!この記事を書いた人
サイバーブレイン株式会社
代表取締役CEO 谷 一徳フォロー、参加お待ちしております!
人工知能研究コミュニティ
- 投稿日:2019-03-23T14:50:41+09:00
 
Tensorflow 2.0を試してみる
はじめに
正式リリース前ですがTensorflow 2.0少しだけ試してみます。
ソースコードTensorflow 2.0で変わること
2.0で大きく変わることは
- Eager executionがdefaultになる
 - 重複したAPIを統一(
 tf.layersとtf.keras.layersなど)- Contribが一掃される
 で、一番の目玉は「Eager executionがdefaultになる」だと思います。
今回はEager executionとkeras実装での学習を比較してみます。
基本的な実装は公式のチュートリアルを参考にしています。Eager executionとは
Tensorflowはdefine and runという方式で動くライブラリでしたが
Eager executionでは、pytorchやchainerのようにdefine by runで実行されます。
計算グラフを定義しながら実行するdefine by runではモデルを柔軟に定義することができるためRNNなどの実装では好まれていますし、最近のpytorchの勢いからして今後の主流になっていきそうです。やること
- Tensorflow 2.0.0-alpha0 を使ってみる
 - Mnistのサンプルコードを動かす
 - Eager executionとkeras実装で学習を比較する
 実行環境
- tensorflow-datasets==1.0.1
 - tensorflow==2.0.0-alpha0
 モデルの定義
trainer.pyfrom tensorflow.keras.layers import Dense, Flatten, Conv2D from tensorflow.keras import Model class MyModel(Model): def __init__(self): super(MyModel, self).__init__() self.conv1 = Conv2D(32, 3, activation='relu') self.flatten = Flatten() self.d1 = Dense(128, activation='relu') self.d2 = Dense(10, activation='softmax') def call(self, x): x = self.conv1(x) x = self.flatten(x) x = self.d1(x) return self.d2(x)モデルは簡単なCNNです。kerasのModelクラスを継承してモデルを定義することができるようになったみたいです。(kerasの少し前のバージョンからできたみたいですが全然気づかなかった)
pytorchやchainerを使ったことがある人は馴染みのある書き方で、個人的にもわかりやすいと思うのでこの書き方に慣れた方がいいと思います。Trainer
EagerTrainer
trainer.pyclass EagerTrainer(object): def __init__(self): self.model = MyModel() self.loss_object = tf.keras.losses.SparseCategoricalCrossentropy() self.optimizer = tf.keras.optimizers.Adam() self.train_loss = tf.keras.metrics.Mean(name='train_loss') self.train_accuracy = tf.keras.metrics.SparseCategoricalAccuracy(name='train_accuracy') self.test_loss = tf.keras.metrics.Mean(name='test_loss') self.test_accuracy = tf.keras.metrics.SparseCategoricalAccuracy(name='test_accuracy') @tf.function def train_step(self, image, label): with tf.GradientTape() as tape: predictions = self.model(image) # 順伝播の計算 loss = self.loss_object(label, predictions) # lossの計算 gradients = tape.gradient(loss, self.model.trainable_variables) # 勾配の計算 self.optimizer.apply_gradients(zip(gradients, self.model.trainable_variables)) # パラメータの更新 self.train_loss(loss) self.train_accuracy(label, predictions) @tf.function def test_step(self, image, label): predictions = self.model(image) t_loss = self.loss_object(label, predictions) self.test_loss(t_loss) self.test_accuracy(label, predictions) def train(self, epochs, training_data, test_data): template = 'Epoch {}, Loss: {:.5f}, Accuracy: {:.5f}, Test Loss: {:.5f}, Test Accuracy: {:.5f}, elapsed_time {:.5f}' for epoch in range(epochs): start = time.time() for image, label in tqdm(training_data): self.train_step(image, label) elapsed_time = time.time() - start for test_image, test_label in test_data: self.test_step(test_image, test_label) print(template.format(epoch + 1, self.train_loss.result(), self.train_accuracy.result() * 100, self.test_loss.result(), self.test_accuracy.result() * 100, elapsed_time))
EagerTrainerはEager executionのtrainerです。
コードを見るとだいたいどんな操作をしているかわかると思います。KerasTrainer
trainer.pyclass KerasTrainer(object): def __init__(self): self.model = MyModel() self.model.compile(optimizer=tf.keras.optimizers.Adam(), loss=tf.keras.losses.SparseCategoricalCrossentropy(), metrics=['accuracy']) def train(self, epochs, training_data, test_data): self.model.fit(training_data, epochs=epochs, validation_data=test_data)
KerasTrainerはEagerTrainerと全く同じ学習をするように書いています。
シンプルなモデルだと圧倒的にコードの量が少なくできるのでkerasの偉大さがわかります。Training
main.pyimport argparse import tensorflow as tf import tensorflow_datasets as tfds from trainer import EagerTrainer, KerasTrainer def convert_types(image, label): image = tf.cast(image, tf.float32) image /= 255 return image, label def main(): parser = argparse.ArgumentParser(description='Train Example') parser.add_argument('--trainer', type=str, default='eager') args = parser.parse_args() dataset, info = tfds.load('mnist', with_info=True, as_supervised=True) mnist_train, mnist_test = dataset['train'], dataset['test'] mnist_train = mnist_train.map(convert_types).shuffle(10000).batch(32) mnist_test = mnist_test.map(convert_types).batch(32) if args.trainer.lower() == 'eager': trainer = EagerTrainer() else: trainer = KerasTrainer() trainer.train(epochs=5, training_data=mnist_train, test_data=mnist_test) if __name__ == '__main__': main()
--trainerのオプションでどちらのTrainerを使うか選べるようにしています。
実際に実行してみるとCPU上では若干Eager executionの方が速い結果になりました。
Tensorflow 1系ではEager executionだと激おそになるという噂がありましたが、改善されているかもしれません。(GPUでもっと実用的なモデルを動かしてみないとわかりませんが)実行結果(Eager execution)
$ python main.py 2019-03-23 14:27:42.698962: I tensorflow/core/platform/cpu_feature_guard.cc:142] Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX2 FMA 0it [00:00, ?it/s]2019-03-23 14:27:43.063703: W ./tensorflow/core/framework/model.h:202] Encountered a stop event that was not preceded by a start event. 1875it [00:34, 54.75it/s] Epoch 1, Loss: 0.13644, Accuracy: 95.91666, Test Loss: 0.06534, Test Accuracy: 97.75000, elapsed_time 34.25085 0it [00:00, ?it/s]2019-03-23 14:28:19.570435: W ./tensorflow/core/framework/model.h:202] Encountered a stop event that was not preceded by a start event. 1875it [00:32, 56.85it/s] Epoch 2, Loss: 0.08982, Accuracy: 97.28416, Test Loss: 0.06335, Test Accuracy: 97.89000, elapsed_time 32.98253 0it [00:00, ?it/s]2019-03-23 14:28:54.483842: W ./tensorflow/core/framework/model.h:202] Encountered a stop event that was not preceded by a start event. 1875it [00:34, 75.77it/s] Epoch 3, Loss: 0.06759, Accuracy: 97.94389, Test Loss: 0.06064, Test Accuracy: 98.03667, elapsed_time 34.02746 0it [00:00, ?it/s]2019-03-23 14:29:30.609697: W ./tensorflow/core/framework/model.h:202] Encountered a stop event that was not preceded by a start event. 1875it [00:34, 54.66it/s] Epoch 4, Loss: 0.05404, Accuracy: 98.35125, Test Loss: 0.05985, Test Accuracy: 98.14000, elapsed_time 34.30574 0it [00:00, ?it/s]2019-03-23 14:30:06.853807: W ./tensorflow/core/framework/model.h:202] Encountered a stop event that was not preceded by a start event. 1875it [00:32, 70.69it/s] Epoch 5, Loss: 0.04531, Accuracy: 98.61067, Test Loss: 0.05936, Test Accuracy: 98.18999, elapsed_time 32.76600実行結果(keras)
$ python main.py --trainer keras 2019-03-23 14:35:22.782574: I tensorflow/core/platform/cpu_feature_guard.cc:142] Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX2 FMA Epoch 1/5 2019-03-23 14:35:23.047235: W ./tensorflow/core/framework/model.h:202] Encountered a stop event that was not preceded by a start event. 1875/1875 [==============================] - 49s 26ms/step - loss: 0.1304 - accuracy: 0.9271 - val_loss: 0.0000e+00 - val_accuracy: 0.0000e+00 Epoch 2/5 2019-03-23 14:36:12.005254: W ./tensorflow/core/framework/model.h:202] Encountered a stop event that was not preceded by a start event. 1875/1875 [==============================] - 42s 23ms/step - loss: 0.0415 - accuracy: 0.9861 - val_loss: 0.0530 - val_accuracy: 0.9828 Epoch 3/5 2019-03-23 14:36:54.346357: W ./tensorflow/core/framework/model.h:202] Encountered a stop event that was not preceded by a start event. 1875/1875 [==============================] - 42s 22ms/step - loss: 0.0219 - accuracy: 0.9927 - val_loss: 0.0632 - val_accuracy: 0.9811 Epoch 4/5 2019-03-23 14:37:36.479987: W ./tensorflow/core/framework/model.h:202] Encountered a stop event that was not preceded by a start event. 1875/1875 [==============================] - 39s 21ms/step - loss: 0.0124 - accuracy: 0.9959 - val_loss: 0.0633 - val_accuracy: 0.9826 Epoch 5/5 2019-03-23 14:38:15.134248: W ./tensorflow/core/framework/model.h:202] Encountered a stop event that was not preceded by a start event. 1875/1875 [==============================] - 39s 21ms/step - loss: 0.0089 - accuracy: 0.9966 - val_loss: 0.0665 - val_accuracy: 0.9836

































