WEBVTT

00:00.180 --> 00:06.570
この実装の最初の部分､ パート1では､ 3つのセクションで構成され､

00:06.570 --> 00:15.900
どのようにこれを構築するかを明確に示しています｡

00:15.900 --> 00:20.760
まずはニューラルネットワークに他ならない脳を作ろうと思っています｡ 

00:20.760 --> 00:25.320
次に､ アクションがどのように再生されるかを定義するボディを作成します｡ 

00:25.320 --> 00:33.420
そして､ 脳と体ができたら､ それを組み立ててAIを作るのですが､ それがこの第1部の最後の部分になります｡

00:33.630 --> 00:37.680
これでもう､ この実装の構造がよく見えてきたのではないでしょうか｡ 

00:37.680 --> 00:42.660
まず脳を作り､ 次に体を作り､ それを組み立ててAIを作る｡ 

00:42.750 --> 00:51.210
そして､ このチュートリアルでは､ 最初のセクションである脳の作り方から始めて､ チュートリアルのために連れて行くつもりです｡

00:51.210 --> 00:54.720
脳を作るのは､ ケーキを作るのとは違うということは想像がつくでしょう｡ 

00:54.720 --> 00:57.000
ですから､ これには複数のチュートリアルが必要です｡ 

00:57.000 --> 01:03.630
もちろん､ いつものように､ その脳をクラスで表現するつもりです｡

01:03.630 --> 01:15.300
なぜなら､ いくつかの機能が必要で､ いくつかの機能を何らかの命令で整理した構造を持つためには､

01:15.300 --> 01:21.780
もちろんクラスが必要だからです｡

01:21.780 --> 01:33.420
Pythonやオブジェクト指向プログラミング言語におけるクラスは､

01:33.420 --> 01:37.710
非常に実用的なものです｡

01:37.710 --> 01:40.380
そして､ 私たちの脳にとって､ その機能はもちろんのことです｡ 

01:40.380 --> 01:45.870
まず､ ニューラルネットワークのアーキテクチャですが､ これはCNNになると思いますが､ もちろん､

01:45.870 --> 01:52.230
例えば､ 入力ニューロンから出力ニューロンへの信号の受け渡しのようなさまざまな機能があります｡

01:52.230 --> 01:55.290
もちろん､ それが私たちが作る4つ目の機能というわけです｡ 

01:55.680 --> 01:58.770
では､ こうしましょう､ 脳を作ることから始めましょう｡ 

01:58.770 --> 02:00.510
これはかなりエキサイティングなことになりそうです｡ 

02:00.510 --> 02:04.650
私の大好きな部分でもあるので､ さっそくご紹介しましょう｡ 

02:04.650 --> 02:10.740
そこで､ まずはもちろんクラスを導入し､ これをクラスと呼ぶことにします｡ 

02:10.740 --> 02:22.290
脳と呼ぶのはためらわれましたが､ もっと率直にCNNと呼ぶことにしましょう｡

02:22.290 --> 02:24.360
だから､ あなたが望むように､ あなたはそれを脳と呼ぶことができます｡ 

02:24.360 --> 02:27.450
しかし､ 少なくとも､ 今､ 私たちは何を作っているのかを知っています｡ 

02:28.490 --> 02:34.960
そして､ 自動運転車のネットワークは､ GNモジュールからCNNが継承していくことになります｡ 

02:34.970 --> 02:43.040
ここでインポートしたのはDNモジュールで､ このエンジンモジュールのすべてのツールを使えるようにしたいので､

02:43.040 --> 02:55.100
オブジェクト指向プログラミングのテクニックである継承を使って､ 親クラスのすべてのツールを使えるようにしたいのです｡

02:55.100 --> 02:59.240
そしてこの親クラスは､ RN DOTモジュールになる予定です｡ 

02:59.810 --> 03:00.710
これでよしとしよう｡ 

03:00.710 --> 03:05.060
そして､ ノートモジュールのすべてのツールやオブジェクトが使えるようになりました｡ 

03:05.360 --> 03:06.020
わかりました｡ 

03:06.020 --> 03:11.990
さて､ 継承ができたので､ クラス内に入り､ 最初の関数を作ることができます｡ 

03:11.990 --> 03:23.390
そして､ おそらくご推察の通り､ 最初の関数は､ 将来作成されるCNNオブジェクトであるブレイン・オブジェクトのすべての変数を定義するinit関数です｡

03:23.480 --> 03:31.850
それでは､ このdefを実行し､ このコースに再びアンダースコアを入れて､ 今度はいくつかの変数を入力する必要があります｡

03:31.850 --> 03:34.640
では､ まず､ 最初の変数はselfにします｡ 

03:35.150 --> 03:37.250
それはもちろん､ オブジェクトを参照するためです｡ 

03:37.280 --> 03:39.620
これで､ かなり快適になったのではないでしょうか｡ 

03:39.620 --> 03:45.260
次に､ 別の変数を追加します｡ これは､ ダム環境でのアクションの数になります｡ 

03:45.260 --> 03:50.000
だから､ ナンバーアクションと呼ぶことにしています｡ 

03:50.300 --> 03:54.230
また､ 実はこの変数はinit関数に必須なものではありません｡ 

03:54.230 --> 03:59.690
ただ､ これから作るAPIを他の環境でテストしたい場合､ このアクション数変数をDhoom環境ラッパーから2つバラバラにインポートするので､

03:59.690 --> 04:08.270
まあ実用性は高いでしょう｡

04:08.270 --> 04:13.880
その際､ 環境の名前をゼロで入力するんです｡ 

04:13.880 --> 04:20.990
で､ このIを他のdoom環境で実験して､ 他のゲームで遊びたい場合､ このアクション数がそのまま､

04:20.990 --> 04:28.460
あなたが遊ぶdoom環境のアクション数になるので､ 何もすることはありません｡

04:28.940 --> 04:32.600
さて､ このinit関数の2つの引数はこれで終わりです｡ 

04:32.600 --> 04:36.290
これで中に入って､ 今度はやるべきことを思い出せばいいわけです｡ 

04:36.320 --> 04:41.330
まず､ super関数で継承を有効にする必要があります｡ 

04:41.480 --> 04:43.730
それはまさに自動運転車と同じなんですね｡ 

04:43.730 --> 04:45.800
超関数をとります｡ 

04:45.890 --> 04:53.000
そして､ 内部ではまず､ ニューラルネットワークを定義するクラス､ それがCNNであることを入力します｡ 

04:53.450 --> 04:56.930
そして､ オブジェクトを参照するためにselfを入力する必要があります｡ 

04:56.930 --> 05:04.970
しかし､ それだけでなく､ ここにドットを追加し､ さらにinit関数といくつかの括弧を追加する必要があることを覚えておいてください｡ 

05:04.970 --> 05:10.970
そうすることで､ 継承が有効になり､ エンドモジュールからすべてのツールを使えるようになるのです｡ 

05:11.330 --> 05:17.000
さて､ それではいよいよニューラルネットワークのアーキテクチャを構築していこうと思います｡ 

05:17.000 --> 05:23.120
そして､ 覚えているように､ CNN､ 畳み込みニューラルネットワークを構築します｡ 単純に､

05:23.120 --> 05:31.130
今回はAIが目を持ち､ AIの目は､ この畳み込みニューラルネットワークの畳み込み層になるからです｡

05:31.220 --> 05:41.000
そして､ AIが畳み込み層で画像を可視化した後､ その信号を古典的な人工ニューラルネットワークに受け渡すのです｡

05:41.000 --> 05:50.300
これは､ 以前からある完全な接続レイヤーのもので､ そこで､ 私たちが演じることができる可能性のある各アクションのキュー値を予測しようとします｡

05:51.020 --> 05:53.540
アーキテクチャが決まっているんですね｡ 

05:53.540 --> 06:01.100
まず､ 畳み込み層と完全連結層があり､ これがAIの頭脳となります｡

06:01.280 --> 06:07.460
では､ 自分たちが作っているものを一歩引いて見られるようにするためには､ どうしたらいいのでしょうか｡ 

06:07.460 --> 06:11.450
さて､ このアーキテクチャを作りたい変数で作ってみましょう｡ 

06:11.600 --> 06:18.740
このアーキテクチャについて言えば､ 我々は3つの畳み込み層でCNNを構築し､ その1つの隠れ層の後に､

06:18.740 --> 06:25.940
3つの畳み込み接続と2つの完全接続が必要になるということだ｡

06:25.940 --> 06:29.480
そして､ コネクションといえば､ まさにこれから定義するものです｡ 

06:29.480 --> 06:32.330
これがCNNクラスの変数になります｡ 

06:32.330 --> 06:37.250
そこで､ 今回は5つの変数を定義します｡ 3つは畳み込み接続用､

06:37.250 --> 06:39.080
2つは完全接続用です｡

06:39.080 --> 06:40.010
では､ こうしてみましょう｡ 

06:40.010 --> 06:42.530
まずは畳み込み接続から｡ 

06:42.530 --> 06:48.080
だから､ 自己のドットコンボリューション1ということにしているんです｡ 

06:48.440 --> 06:50.780
それをコピーして

06:52.360 --> 06:54.890
下にペースを合わせて､ そこへ｡ 

06:54.910 --> 06:58.570
自己完結型2､ 自己完結型3｡ 

06:58.810 --> 07:01.150
これが私たちのコンボリューション（畳み込み）接続です｡ 

07:01.150 --> 07:11.020
つまり､ この最初の畳み込みは､ 入力画像に何らかの畳み込みを適用して最初の畳み込み層を生成し､ 次に2回目の畳み込みを行うものです｡

07:11.020 --> 07:19.540
2は､ 最初の畳み込み層を入力とし､ 再度畳み込みをかけることで､ 2番目の畳み込み層を作成します｡

07:19.540 --> 07:25.810
そして､ この畳み込み層では､ それぞれが1つの特定の特徴を検出する､ いくつかの新しい画像を得ることになります｡ 

07:25.810 --> 07:28.870
そこで､ これらの新しい画像を畳み込み層に取り込みます｡ 

07:28.870 --> 07:40.210
次に､ この畳み込みを適用して､ この第一畳み込み層からの新しい画像を､ 第二畳み込み層のいくつかの新しい画像に接続することになります｡

07:40.210 --> 07:46.030
そして､ これらの新しい画像は､ やはり､ 最初の畳み込み層の画像から何らかの特徴を検出することになる｡ 

07:46.030 --> 07:52.570
つまり､ 特徴検出を強化して､ 2つ目の畳み込み層の画像につなげるだけなんです｡ 

07:52.570 --> 08:01.780
ここで3回目のコンボリューションを適用し､ 入力画像内のさらに多くの特徴を検出する画像をそれぞれ取得する｡

08:01.780 --> 08:07.240
そして､ このようにすればするほど､ 異なるレイヤーの画像にいくつかのコンボリューションを適用することになります｡ 

08:07.270 --> 08:10.210
まあ､ いくつかの特徴を検出できるようになったということです｡ 

08:10.210 --> 08:18.280
そして､ その特徴を検知することで､ AIはどこにモンスターがいるのか､ どこに撃てば倒せるのか､ どこに行けばいいのかを理解するようになるわけです｡

08:18.310 --> 08:23.110
また､ 壁や障害物など､ まあ､ 文字通り行くべきところを検知してくれます｡ 

08:23.110 --> 08:29.620
そしてそれは､ これらの畳み込み層が､ 元の入力画像から何を検出したかのおかげです｡ 

08:30.290 --> 08:30.650
わかりました｡ 

08:30.650 --> 08:34.910
つまり､ CNNのコンボリューション（畳み込み）部分に対するものだ｡ 

08:34.910 --> 08:44.660
しかし､ 畳み込み層の後に､ 適用された異なる一連の畳み込みによって得られたすべてのピクセルを平坦化する必要があることを忘れないでください｡

08:44.660 --> 08:53.270
そして､ すべてのピクセルの配列を平らにすることで､ 古典的な人工ニューラルネットワークの入力となる巨大なベクトルを得ることができるのです｡

08:53.270 --> 08:58.250
そこで､ 完全に接続されたレイヤーを得ることができ､ その結果､ 完全な接続が可能になるのです｡ 

08:58.430 --> 09:07.400
次に来る古典的な人工ニューラルネットワークでは隠れ層が1つなので､ 新たに2つの変数を作成する必要があるわけです｡

09:07.400 --> 09:13.340
したがって､ この巨大な平坦化ベクトルからこの1つの隠れ層への1つの完全な接続と､

09:13.340 --> 09:21.440
この1つの隠れ層とキュー値である出力ニューロンからなる出力層との間の第2の完全な接続が必要です｡

09:21.680 --> 09:26.870
そこで､ これらの2/1の接続を行い､ その接続をすべて定義することにしましょう｡ 

09:26.990 --> 09:35.510
そこで､ 自動運転車については､ セルフドットFC1､ そしてセルフドットFC2と呼ぶことにします｡ 

09:36.080 --> 09:43.820
さて､ これですべての変数が揃いましたので､ 次はもちろんRNモジュールのクラスで定義する必要があります｡

09:44.060 --> 09:50.260
つまり､ 基本的にはニューラルネットワークのアーキテクチャを作成することになりますが､ これは次のチュートリアルで行うことになります｡

09:50.270 --> 09:51.470
それまではお楽しみに｡ 

09:51.470 --> 09:51.890
I.
