大ヒットを続ける人気シリーズの第3弾。今回は「DeZero」というディープラーニングのフレームワークをゼロから作ります。DeZeroは本書オリジナルのフレームワークです。最小限のコードで、フレームワークのモダンな機能を実現します。本書では、この小さな――それでいて十分にパワフルな――フレームワークを、全部で60のステップで完成させます。それによって、PyTorch、TensorFlow、Chainerなどの現代のフレームワークに通じる知識を深めます。キャッチフレーズは――作るからこそ、見えるモノ。
ゼロから作るDeep Learning ❸
―フレームワーク編
斎藤 康毅 著
- TOPICS
- Data Science , Database , Python
- 発行年月日
- 2020年04月
- PRINT LENGTH
- 552
- ISBN
- 978-4-87311-906-9
- FORMAT
- Print PDF EPUB
関連ファイル
正誤表
ここで紹介する正誤表には、書籍発行後に気づいた誤植や更新された情報を掲載しています。以下のリストに記載の年月は、正誤表を作成し、増刷書籍を印刷した月です。お手持ちの書籍では、すでに修正が施されている場合がありますので、書籍最終ページの奥付でお手持ちの書籍の刷版、刷り年月日をご確認の上、ご利用ください。
正誤表
目次
まえがき 第1ステージ 微分を自動で求める ステップ1 箱としての変数 1.1 変数とは 1.2 Variableクラスの実装 1.3 【補足】NumPyの多次元配列 ステップ2 変数を生み出す関数 2.1 関数とは 2.2 Functionクラスの実装 2.3 Functionクラスを使う ステップ3 関数の連結 3.1 Exp関数の実装 3.2 関数を連結する ステップ4 数値微分 4.1 微分とは 4.2 数値微分の実装 4.3 合成関数の微分 4.4 数値微分の問題点 ステップ5 バックプロパゲーションの理論 5.1 チェインルール 5.2 バックプロパゲーションの導出 5.3 計算グラフで表す ステップ6 手作業によるバックプロパゲーション 6.1 Variableクラスの追加実装 6.2 Functionクラスの追加実装 6.3 SquareとExpクラスの追加実装 6.4 バックプロパゲーションの実装 ステップ7 バックプロパゲーションの自動化 7.1 逆伝播の自動化のために 7.2 逆伝播を試す 7.3 backwardメソッドの追加 ステップ8 再帰からループへ 8.1 現時点のVariableクラス 8.2 ループを使った実装 8.3 動作確認 ステップ9 関数をより便利に 9.1 Pythonの関数として利用 9.2 backwardメソッドの簡略化 9.3 ndarrayだけを扱う ステップ10 テストを行う 10.1 Pythonのユニットテスト 10.2 square関数の逆伝播のテスト 10.3 勾配確認による自動テスト 10.4 テストについてのまとめ コラム :自動微分 第2ステージ 自然なコードで表現する ステップ11 可変長の引数(順伝播編) 11.1 Functionクラスの修正 11.2 Addクラスの実装 ステップ12 可変長の引数(改善編) 12.1 1つ目の改善:関数を使いやすく 12.2 2つ目の改善:関数を実装しやすく 12.3 add関数の実装 ステップ13 可変長の引数(逆伝播編) 13.1 可変長引数に対応したAddクラスの逆伝播 13.2 Variableクラスの修正 13.3 Squareクラスの実装 ステップ14 同じ変数を繰り返し使う 14.1 問題の原因 14.2 解決策 14.3 微分をリセットする ステップ15 複雑な計算グラフ(理論編) 15.1 逆伝播の正しい順番 15.2 現状のDeZero 15.3 関数の優先度 ステップ16 複雑な計算グラフ(実装編) 16.1 世代の追加 16.2 世代順に取り出す 16.3 Variableクラスのbackward 16.4 動作確認 ステップ17 メモリ管理と循環参照 17.1 メモリ管理 17.2 参照カウント方式のメモリ管理 17.3 循環参照 17.4 weakrefモジュール 17.5 動作確認 ステップ18 メモリ使用量を減らすモード 18.1 不要な微分は保持しない 18.2 Functionクラスの復習 18.3 Configクラスによる切り替え 18.4 モードを切り替える 18.5 with文による切り替え ステップ19 変数を使いやすく 19.1 変数に名前を付ける 19.2 ndarrayのインスタンス変数 19.3 len関数とprint関数 ステップ20 演算子のオーバーロード(1) 20.1 Mulクラスの実装 20.2 演算子のオーバーロード ステップ21 演算子のオーバーロード(2) 21.1 ndarrayと一緒に使う 21.2 floatやintと一緒に使う 21.3 問題点1:左項がfloatやintの場合 21.4 問題点2:左項がndarrayインスタンスの場合 ステップ22 演算子のオーバーロード(3) 22.1 負数 22.2 引き算 22.3 割り算 22.4 累乗 ステップ23 パッケージとしてまとめる 23.1 ファイル構成 23.2 コアクラスへの移し替え 23.3 演算子のオーバーロード 23.4 実際の__init__.pyファイル 23.5 dezeroのインポート ステップ24 複雑な関数の微分 24.1 Sphere関数 24.2 matyas関数 24.3 Goldstein-Price関数 コラム :Define-by-Run 第3ステージ 高階微分を実現する ステップ25 計算グラフの可視化(1) 25.1 Graphvizのインストール 25.2 DOT言語でグラフを書く 25.3 ノードの属性を指定する 25.4 ノードを結ぶ ステップ26 計算グラフの可視化(2) 26.1 可視化コードの使用例 26.2 計算グラフからDOT言語への変換 26.3 画像化までを含めた変換 26.4 動作確認 ステップ27 テイラー展開の微分 27.1 sin関数の実装 27.2 テイラー展開の理論 27.3 テイラー展開の実装 27.4 計算グラフの可視化 ステップ28 関数の最適化 28.1 ローゼンブロック関数 28.2 微分を求める 28.3 勾配降下法の実装 ステップ29 ニュートン法を用いた最適化(手計算) 29.1 ニュートン法による最適化の理論 29.2 ニュートン法による最適化の実装 ステップ30 高階微分(準備編) 30.1 確認作業①:Variableのインスタンス変数 30.2 確認作業②:Functionクラス 30.3 確認作業③:Variableクラスの逆伝播 ステップ31 高階微分(理論編) 31.1 逆伝播で行う計算 31.2 逆伝播で計算グラフを作る方法 ステップ32 高階微分(実装編) 32.1 新しいDeZeroへ 32.2 関数クラスの逆伝播 32.3 より効率的な逆伝播へ(モードの追加) 32.4 __init__.pyの変更 ステップ33 ニュートン法を使った最適化(自動計算) 33.1 2階微分を求める 33.2 ニュートン法による最適化 ステップ34 sin関数の高階微分 34.1 sin関数の実装 34.2 cos関数の実装 34.3 sin関数の高階微分 ステップ35 高階微分の計算グラフ 35.1 tanh関数の微分 35.2 tanh関数の実装 35.3 高階微分の計算グラフの可視化 ステップ36 高階微分以外の用途 36.1 doublebackpropの用途 36.2 ディープラーニングの研究での使用例 コラム :ニュートン法とdoublebackpropの補足 第4ステージ ニューラルネットワークを作る ステップ37 テンソルを扱う 37.1 要素ごとの計算 37.2 テンソルを使用したときのバックプロパゲーション 37.3 【補足】テンソルを使用したときのバックプロパゲーション ステップ38 形状を変える関数 38.1 reshape関数の実装 38.2 Variableからreshapeを使う 38.3 行列の転置 38.4 【補足】実際のtranspose関数 ステップ39 和を求める関数 39.1 sum関数の逆伝播 39.2 sum関数の実装 39.3 axisとkeepdims ステップ40 ブロードキャストを行う関数 40.1 broadcast_to関数とsum_to関数 40.2 DeZeroのbroadcast_toとsum_to関数 40.3 ブロードキャストへの対応 ステップ41 行列の積 41.1 ベクトルの内積と行列の積 41.2 行列の形状チェック ステップ42 線形回帰 42.1 トイ・データセット 42.2 線形回帰の理論 42.3 線形回帰の実装 42.4 【補足】DeZeroのmean_squared_error関数 ステップ43 ニューラルネットワーク 43.1 DeZeroのlinear関数 43.2 非線形なデータセット 43.3 活性化関数とニューラルネットワーク 43.4 ニューラルネットワークの実装 ステップ44 パラメータをまとめるレイヤ 44.1 Parameterクラスの実装 44.2 Layerクラスの実装 44.3 Linearクラスの実装 44.4 Layerを使ったニューラルネットワークの実装 ステップ45 レイヤをまとめるレイヤ 45.1 Layerクラスの拡張 45.2 Modelクラス 45.3 Modelを使って問題を解く 45.4 MLPクラス ステップ46 Optimizerによるパラメータ更新 46.1 Optimizerクラス 46.2 SGDクラスの実装 46.3 SGDクラスを使って問題を解く 46.4 SGD以外の最適化手法 ステップ47 ソフトマックス関数と交差エントロピー誤差 47.1 スライス操作のための関数 47.2 ソフトマックス関数 47.3 交差エントロピー誤差 ステップ48 多値分類 48.1 スパイラル・データセット 48.2 学習用のコード ステップ49 Datasetクラスと前処理 49.1 Datasetクラスの実装 49.2 大きいデータセットの場合 49.3 データの連結 49.4 学習用のコード 49.5 データセットの前処理 ステップ50 ミニバッチを取り出すDataLoader 50.1 イテレータとは 50.2 DataLoaderを使う 50.3 accuracy関数の実装 50.4 スパイラル・データセットの学習コード ステップ51 MNISTの学習 51.1 MNISTデータセット 51.2 MNISTの学習 51.3 モデルの改良 コラム :ディープラーニングのフレームワーク 第5ステージ DeZeroで挑む ステップ52 GPU対応 52.1 CuPyのインストールと使用方法 52.2 cudaモジュール 52.3 Variable/Layer/DataLoaderクラスの追加実装 52.4 関数の追加実装 52.5 GPUでMNISTを学習 ステップ53 モデルの保存と読み込み 53.1 NumPyのsave関数とload関数 53.2 Layerクラスのパラメータをフラットに 53.3 Layerクラスのsave関数とload関数 ステップ54 Dropoutとテストモード 54.1 Dropoutとは 54.2 InvertedDropout 54.3 テストモードの追加 54.4 Dropoutの実装 ステップ55 CNNのメカニズム(1) 55.1 CNNのネットワーク構造 55.2 畳み込み演算 55.3 パディング 55.4 ストライド 55.5 出力サイズの計算方法 ステップ56 CNNのメカニズム(2) 56.1 3階テンソル 56.2 ブロックで考える 56.3 ミニバッチ処理 56.4 プーリング層 ステップ57 conv2d関数とpooling関数 57.1 im2colによる展開 57.2 conv2d関数の実装 57.3 Conv2dレイヤの実装 57.4 pooling関数の実装 ステップ58 代表的なCNN(VGG16) 58.1 VGG16の実装 58.2 学習済み重みデータ 58.3 学習済みのVGG16を使う ステップ59 RNNによる時系列データ処理 59.1 RNNレイヤの実装 59.2 RNNモデルの実装 59.3 「つながり」を切るためのメソッド 59.4 サイン波の予測 ステップ60 LSTMとデータローダ 60.1 時系列データのためのデータローダ 60.2 LSTMレイヤの実装 コラム :これから先へ 付録A インプレース演算(ステップ14の補足) A.1 問題の確認 A.2 コピーと上書きについて A.3 DeZeroの逆伝播では 付録B get_item関数の実装(ステップ47の補足) 付録C GoogleColaboratoryで動かす おわりに 参考文献 索引