この実装の最初の部分､ パート1では､ 3つのセクションで構成され､
どのようにこれを構築するかを明確に示しています｡
まずはニューラルネットワークに他ならない脳を作ろうと思っています｡
次に､ アクションがどのように再生されるかを定義するボディを作成します｡
そして､ 脳と体ができたら､ それを組み立ててAIを作るのですが､ それがこの第1部の最後の部分になります｡
これでもう､ この実装の構造がよく見えてきたのではないでしょうか｡
まず脳を作り､ 次に体を作り､ それを組み立ててAIを作る｡
そして､ このチュートリアルでは､ 最初のセクションである脳の作り方から始めて､ チュートリアルのために連れて行くつもりです｡
脳を作るのは､ ケーキを作るのとは違うということは想像がつくでしょう｡
ですから､ これには複数のチュートリアルが必要です｡
もちろん､ いつものように､ その脳をクラスで表現するつもりです｡
なぜなら､ いくつかの機能が必要で､ いくつかの機能を何らかの命令で整理した構造を持つためには､
もちろんクラスが必要だからです｡
Pythonやオブジェクト指向プログラミング言語におけるクラスは､
非常に実用的なものです｡
そして､ 私たちの脳にとって､ その機能はもちろんのことです｡
まず､ ニューラルネットワークのアーキテクチャですが､ これはCNNになると思いますが､ もちろん､
例えば､ 入力ニューロンから出力ニューロンへの信号の受け渡しのようなさまざまな機能があります｡
もちろん､ それが私たちが作る4つ目の機能というわけです｡
では､ こうしましょう､ 脳を作ることから始めましょう｡
これはかなりエキサイティングなことになりそうです｡
私の大好きな部分でもあるので､ さっそくご紹介しましょう｡
そこで､ まずはもちろんクラスを導入し､ これをクラスと呼ぶことにします｡
脳と呼ぶのはためらわれましたが､ もっと率直にCNNと呼ぶことにしましょう｡
だから､ あなたが望むように､ あなたはそれを脳と呼ぶことができます｡
しかし､ 少なくとも､ 今､ 私たちは何を作っているのかを知っています｡
そして､ 自動運転車のネットワークは､ GNモジュールからCNNが継承していくことになります｡
ここでインポートしたのはDNモジュールで､ このエンジンモジュールのすべてのツールを使えるようにしたいので､
オブジェクト指向プログラミングのテクニックである継承を使って､ 親クラスのすべてのツールを使えるようにしたいのです｡
そしてこの親クラスは､ RN DOTモジュールになる予定です｡
これでよしとしよう｡
そして､ ノートモジュールのすべてのツールやオブジェクトが使えるようになりました｡
わかりました｡
さて､ 継承ができたので､ クラス内に入り､ 最初の関数を作ることができます｡
そして､ おそらくご推察の通り､ 最初の関数は､ 将来作成されるCNNオブジェクトであるブレイン・オブジェクトのすべての変数を定義するinit関数です｡
それでは､ このdefを実行し､ このコースに再びアンダースコアを入れて､ 今度はいくつかの変数を入力する必要があります｡
では､ まず､ 最初の変数はselfにします｡
それはもちろん､ オブジェクトを参照するためです｡
これで､ かなり快適になったのではないでしょうか｡
次に､ 別の変数を追加します｡ これは､ ダム環境でのアクションの数になります｡
だから､ ナンバーアクションと呼ぶことにしています｡
また､ 実はこの変数はinit関数に必須なものではありません｡
ただ､ これから作るAPIを他の環境でテストしたい場合､ このアクション数変数をDhoom環境ラッパーから2つバラバラにインポートするので､
まあ実用性は高いでしょう｡
その際､ 環境の名前をゼロで入力するんです｡
で､ このIを他のdoom環境で実験して､ 他のゲームで遊びたい場合､ このアクション数がそのまま､
あなたが遊ぶdoom環境のアクション数になるので､ 何もすることはありません｡
さて､ このinit関数の2つの引数はこれで終わりです｡
これで中に入って､ 今度はやるべきことを思い出せばいいわけです｡
まず､ super関数で継承を有効にする必要があります｡
それはまさに自動運転車と同じなんですね｡
超関数をとります｡
そして､ 内部ではまず､ ニューラルネットワークを定義するクラス､ それがCNNであることを入力します｡
そして､ オブジェクトを参照するためにselfを入力する必要があります｡
しかし､ それだけでなく､ ここにドットを追加し､ さらにinit関数といくつかの括弧を追加する必要があることを覚えておいてください｡
そうすることで､ 継承が有効になり､ エンドモジュールからすべてのツールを使えるようになるのです｡
さて､ それではいよいよニューラルネットワークのアーキテクチャを構築していこうと思います｡
そして､ 覚えているように､ CNN､ 畳み込みニューラルネットワークを構築します｡ 単純に､
今回はAIが目を持ち､ AIの目は､ この畳み込みニューラルネットワークの畳み込み層になるからです｡
そして､ AIが畳み込み層で画像を可視化した後､ その信号を古典的な人工ニューラルネットワークに受け渡すのです｡
これは､ 以前からある完全な接続レイヤーのもので､ そこで､ 私たちが演じることができる可能性のある各アクションのキュー値を予測しようとします｡
アーキテクチャが決まっているんですね｡
まず､ 畳み込み層と完全連結層があり､ これがAIの頭脳となります｡
では､ 自分たちが作っているものを一歩引いて見られるようにするためには､ どうしたらいいのでしょうか｡
さて､ このアーキテクチャを作りたい変数で作ってみましょう｡
このアーキテクチャについて言えば､ 我々は3つの畳み込み層でCNNを構築し､ その1つの隠れ層の後に､
3つの畳み込み接続と2つの完全接続が必要になるということだ｡
そして､ コネクションといえば､ まさにこれから定義するものです｡
これがCNNクラスの変数になります｡
そこで､ 今回は5つの変数を定義します｡ 3つは畳み込み接続用､
2つは完全接続用です｡
では､ こうしてみましょう｡
まずは畳み込み接続から｡
だから､ 自己のドットコンボリューション1ということにしているんです｡
それをコピーして
下にペースを合わせて､ そこへ｡
自己完結型2､ 自己完結型3｡
これが私たちのコンボリューション（畳み込み）接続です｡
つまり､ この最初の畳み込みは､ 入力画像に何らかの畳み込みを適用して最初の畳み込み層を生成し､ 次に2回目の畳み込みを行うものです｡
2は､ 最初の畳み込み層を入力とし､ 再度畳み込みをかけることで､ 2番目の畳み込み層を作成します｡
そして､ この畳み込み層では､ それぞれが1つの特定の特徴を検出する､ いくつかの新しい画像を得ることになります｡
そこで､ これらの新しい画像を畳み込み層に取り込みます｡
次に､ この畳み込みを適用して､ この第一畳み込み層からの新しい画像を､ 第二畳み込み層のいくつかの新しい画像に接続することになります｡
そして､ これらの新しい画像は､ やはり､ 最初の畳み込み層の画像から何らかの特徴を検出することになる｡
つまり､ 特徴検出を強化して､ 2つ目の畳み込み層の画像につなげるだけなんです｡
ここで3回目のコンボリューションを適用し､ 入力画像内のさらに多くの特徴を検出する画像をそれぞれ取得する｡
そして､ このようにすればするほど､ 異なるレイヤーの画像にいくつかのコンボリューションを適用することになります｡
まあ､ いくつかの特徴を検出できるようになったということです｡
そして､ その特徴を検知することで､ AIはどこにモンスターがいるのか､ どこに撃てば倒せるのか､ どこに行けばいいのかを理解するようになるわけです｡
また､ 壁や障害物など､ まあ､ 文字通り行くべきところを検知してくれます｡
そしてそれは､ これらの畳み込み層が､ 元の入力画像から何を検出したかのおかげです｡
わかりました｡
つまり､ CNNのコンボリューション（畳み込み）部分に対するものだ｡
しかし､ 畳み込み層の後に､ 適用された異なる一連の畳み込みによって得られたすべてのピクセルを平坦化する必要があることを忘れないでください｡
そして､ すべてのピクセルの配列を平らにすることで､ 古典的な人工ニューラルネットワークの入力となる巨大なベクトルを得ることができるのです｡
そこで､ 完全に接続されたレイヤーを得ることができ､ その結果､ 完全な接続が可能になるのです｡
次に来る古典的な人工ニューラルネットワークでは隠れ層が1つなので､ 新たに2つの変数を作成する必要があるわけです｡
したがって､ この巨大な平坦化ベクトルからこの1つの隠れ層への1つの完全な接続と､
この1つの隠れ層とキュー値である出力ニューロンからなる出力層との間の第2の完全な接続が必要です｡
そこで､ これらの2/1の接続を行い､ その接続をすべて定義することにしましょう｡
そこで､ 自動運転車については､ セルフドットFC1､ そしてセルフドットFC2と呼ぶことにします｡
さて､ これですべての変数が揃いましたので､ 次はもちろんRNモジュールのクラスで定義する必要があります｡
つまり､ 基本的にはニューラルネットワークのアーキテクチャを作成することになりますが､ これは次のチュートリアルで行うことになります｡
それまではお楽しみに｡
I.