WEBVTT

00:00.300 --> 00:02.280
こんにちは､ このチュートリアルにようこそ｡ 

00:02.310 --> 00:05.730
さて､ 今日はモデルを保存する関数を作ってみましょう｡ 

00:05.760 --> 00:10.980
それは､ アプリケーションを終了するときにいつでも再利用できるように､ 車の頭脳を保存しておくことです｡ 

00:11.190 --> 00:15.720
この保存機能により､ モデルを保存した後､ アプリケーションを終了することができます｡ 

00:15.720 --> 00:20.340
そして､ アプリケーションに戻ると､ 別の関数のおかげで､ この関数の後に作られるload関数で､

00:20.340 --> 00:25.550
学習されたモデルの最後のバージョンをロードすることになります｡

00:25.560 --> 00:31.710
そこで､ この2つの関数をsave関数とload関数とすることにします｡

00:32.040 --> 00:35.200
では､ このチュートリアルでは､ まず保存機能について説明します｡ 

00:35.220 --> 00:38.250
ここに新たな死が訪れ､ そして救われるわけです｡ 

00:38.490 --> 00:42.800
そして､ 自ずと一つの主張が出てくるのです｡ 

00:42.810 --> 00:50.010
その理由は､ 保存しようとしているのは､ ここでいうモデル全体ではなく､ ニューラルネットワークの自分､

00:50.040 --> 00:58.140
そのモデル､ オプティマイザの自分オプティマイザだからです｡ 保存したいのは､ 最後の反復で更新した重みだけです｡

00:58.140 --> 01:08.790
保存したモデルを後で再利用したいときはいつでも､ すでに学習した重みで再生する行動を予測させたいからです｡

01:08.880 --> 01:13.140
ですから､ この最後のバージョンの重みを取る必要があります｡ また､ オプティマイザーの最後のバージョンも､

01:13.140 --> 01:16.020
この重みとつながっているので､ 取る必要があります｡

01:16.590 --> 01:17.790
では､ こうしてみましょう｡ 

01:17.790 --> 01:23.220
自己があるのだから､ 自己､ そのモデル､ 自己､ そのオプティマイザーを

01:23.340 --> 01:26.970
そして､ この2つのオブジェクトとPythonの辞書を保存することになります｡ 

01:26.970 --> 01:32.180
そして､ この2つのオブジェクトを保存するために､ torchモジュールのsave関数を使用することにします｡ 

01:32.190 --> 01:42.630
ここではtorch that saveから始めて､ 括弧の中に辞書の括弧を入力します｡ Pythonの辞書はこのように動作します｡

01:42.630 --> 01:45.480
あなたの識別子となるキーを持ちます｡ 

01:45.480 --> 01:46.530
だから､ ユニークなんです｡ 

01:46.530 --> 01:49.650
そして､ それぞれのキーには､ そのキーに与えたい値があります｡ 

01:49.650 --> 01:56.730
つまり､ 一意な識別子と､ その識別子に与えたい値とのマッピング機能みたいなものです｡ 

01:56.730 --> 02:04.620
単純な辞書の本を例にとると､ まあ､ キーが単語で､ 値が単語の定義になるわけです｡

02:04.620 --> 02:06.000
まあ､ ここでもそれは同じなんですけどね｡ 

02:06.000 --> 02:12.330
2つのキーを作り､ 1つは最初に保存したいオブジェクト､ つまりself modelのキーにします｡ 

02:12.330 --> 02:17.640
そして､ 2つ目の保存したいものの1/2キーは､ セルフドットオプティマイザーです｡ 

02:17.640 --> 02:20.220
というわけで､ まずは1つ目のキーから見ていきましょう｡ 

02:20.220 --> 02:26.310
そのキーに名前をつけて､ state underscore dictと呼ぶことにします｡ なぜなら､

02:26.310 --> 02:31.470
state dict関数を使ってモデルを辞書に保存するからです｡

02:31.470 --> 02:37.980
これが最初のキーで､ 次にそのキーに対応する属性値を指定します｡ 

02:37.980 --> 02:41.760
まあ､ 見ての通り､ こことここにちょっとしたコンを追加しました｡ 

02:41.760 --> 02:44.700
保存したいオブジェクトを追加します｡ 

02:44.700 --> 02:48.330
そこで､ 最初に保存したいオブジェクトはセルフモデルです｡ 

02:48.450 --> 02:56.580
つまり､ このselfモデルをコピーして､ 最初のキーであるselfの値として､ そのモデルを貼り付ければいいわけです｡ 

02:56.610 --> 03:03.690
そして､ ドット状態アンダースコア日付を追加し､ 最初の1つを追加し､

03:03.990 --> 03:09.390
いくつかの括弧を追加します｡

03:09.720 --> 03:12.090
そして､ オプティマイザーを保存してみましょう｡ 

03:12.090 --> 03:15.240
そこで､ 辞書に2つ目のキーを追加することにします｡ 

03:15.240 --> 03:20.970
コンマを追加して､ Enterキーを押せば､ 2つ目のキーができます｡ 

03:20.970 --> 03:25.290
そこで､ 2つ目のキーは､ まあ､ オプティマイザーとでも呼んでおきましょうか｡ 

03:26.060 --> 03:34.540
次にColin､ そして保存したいオブジェクトの名前を追加するだけで､ これがself､ これがオプティマイザです｡

03:34.550 --> 03:38.420
そこで､ ここにセルフドットオプティマイザーを追加します｡ 

03:38.990 --> 03:45.500
そして､ このオプティマイザのパラメータを保存するために､ ここでもドットステートディクショナリーを使用します｡

03:45.500 --> 03:51.650
そして､ すべての重みが保存され､ オプティマイザが保存されたモデルができあがります｡

03:51.860 --> 03:52.790
完璧です｡ 

03:52.940 --> 03:56.300
そして､ これをすべてファイルに保存します｡ 

03:56.300 --> 04:07.380
そのために､ save関数に2つ目の引数を追加します｡ この引数は､ モデルとオプティマイザを保存するファイルの名前になります｡

04:07.400 --> 04:12.860
この最初のモジュールの最初のセクションで､ 自動運転車の簡単なデモをお見せしたことを思い出してください｡ 

04:12.900 --> 04:16.400
あれは､ 適当にアクションをさせただけのデモだったんですね｡ 

04:16.400 --> 04:18.520
あれはまだ自動運転車ではないのですね｡ 

04:18.530 --> 04:24.850
しかし､ その後､ モデルを保存するために保存ボタンをクリックしたことを思い出してください｡ これにより､ 最後の脳内ドットPTAファイルが作成され､

04:24.890 --> 04:29.250
これが保存されたバージョンのモデルを含むファイルです｡

04:29.270 --> 04:39.260
そこで､ ここに最後のアンダースコア brain dot PTA を追加して､ モデルとオプティマイザがこの作成されたファイル less

04:39.260 --> 04:42.260
brain に保存されるようにします｡

04:43.220 --> 04:44.660
まだ持っていないんですね｡ 

04:44.660 --> 04:51.230
しかし､ アプリケーションでモデルを保存すると同時に､ 先ほど追加したコードのおかげで､ このファイルが作成されます｡

04:51.500 --> 04:52.070
わかりました｡ 

04:52.070 --> 04:53.660
そうして今､ 完璧に｡ 

04:53.660 --> 05:01.400
モデルを保存する機能､ ニューラルネットワークの重みとオプティマイザを保存することで車の頭脳を保存する機能があるんです｡

05:01.400 --> 05:03.410
それが実は､ クルマの頭脳なのです｡ 

05:03.710 --> 05:04.600
とても完璧です｡ 

05:04.610 --> 05:08.000
これで､ 残すところ作成する関数は1つだけとなりました｡ 

05:08.000 --> 05:09.620
それがロード機能です｡ 

05:09.620 --> 05:13.100
そしてそれは､ セーブ機能がロード機能なしにはありえないからです｡ 

05:13.100 --> 05:17.590
保存したものを後から読み込めないのでは､ モデルを保存する意味がありませんよね｡ 

05:17.600 --> 05:22.940
というわけで､ エキサイティングなデモの前の最後のステップです｡ このセクションの最後のチュートリアルで､

05:22.940 --> 05:24.920
このロード関数を作っていきます｡

05:24.920 --> 05:26.750
では､ この次のチュートリアルでお会いしましょう｡ 

05:26.750 --> 05:28.520
そしてそれまで､ iを楽しんでください｡ 
