こんにちは､ このPythonチュートリアルへようこそ｡
そこで次は､ そのカウントニューロンを機能させることで､ 私たちが望むものを得られるようにします｡
つまり､ コンボリューションを適用した後のこの巨大なベクトルにおけるニューロンの数である｡
それが今必要な唯一の欠落した情報であり､ 関数でそれを得ようとしているのです｡
では､ この関数を作ってみましょう｡
ここでは､ 非常にシンプルにカウント､ アンダースコア・ニューロンと呼ぶことにします｡
そして､ このカウントは何でしょうか？
ニューロン機能は､ 引数として取るつもりですか？
まあ､ 物体そのものを取ることになるのですが､ その後､ 他のものを取ることになります｡ なぜなら､
この平坦化層の出力ニューロンの数は､ 実際には1つのものにしか依存しないからです｡
これは､ ニューラルネットワークの一番最初に入る､ オリジナルの入力画像の寸法に依存します｡
つまり､ 今必要なのは､ 入力画像の寸法だけなのです｡
そこで､ この入力画像の寸法を表す引数に名前をつけて､ image
dimと呼ぶことにしよう｡
わかりました｡
そして､ 今言えることは､ doomから送られてくる入力画像の実際の寸法は､ 80×80になるということです｡
元画像のサイズを80×80に縮小し､ これがニューラルネットワークに入る画像のフォーマットになります｡
画像STEMは188になり､ 1は白黒画像､ つまり1チャンネルしかない画像を扱うことに対応します｡
つまり､ イメージのそれらは､ 後でタプルの1､ 80､ 80と等しくなるわけです｡
わかりました｡
だから､ それだけが必要な議論なのです｡
そして､ 今度はニューロンを数えてみましょう｡
では､ どうすればいいのか？
さて､ まず､ 実は今､ 入力ダメージがないんです｡
取り込めるドゥーム画像がないんです｡
それは後でやることにしています｡
そこで､ まず最初に偽の画像を作成するのですが､ その画像は寸法が80です｡
80では､ 偽のピクセルで偽の画像を作成することになりますが､ それでも最終的には欲しい数値が得られます｡
この数値は寸法にのみ依存し､ 画像内のピクセルには依存しないからです｡
そこで､ 手始めに偽の画像を作って､ 必要なニューロン数を計算してみましょう｡
偽の画像を作るトリックは､ そう､ まずXと呼ぶことにします｡ そして､ torchのランダム関数であるrun関数を使っているので､
この画像にランダムなピクセルを置くことになりますから rendを使います｡
そして､ 内部には､ ご覧のように､ 188の画像の寸法を入力します｡
しかし､ この画像をニューラルネットワークに入力するわけですが､ 覚えているように､ ニューラルネットワークは入力状態のバッチ､
つまりここにある入力画像のバッチしか受け付けないのです｡
このrun関数で直接できるように､ 偽の次元を作成するつもりです｡
実際にはバッチに対応するものから始めて､ 入力画像の寸法に対応するApple
188につければいいだけなんですけどね｡
そして､ あなたが理解したように､ これらの寸法は､ そのテーブルを表すこのimage dim引数に含まれています
188 だから､ 今､ 私たちはimage dimを追加する必要がありますが､ 寺院の要素を渡すために､ 今はimage themは関数の引数のリストとしてタプルであるので､
ここに追加する必要があります image themの前に､ つまりテーブルの前に｡
ストアは､ image dim タプルの要素を関数の引数のリストとして渡すことができるようにします｡
そして､ ご覧のように､ まさにここに星と寸法が指定されているのです｡
わかりました｡
そうすると､ 偽のピクセルの画像が出来上がるわけです｡
だから､ それはドゥーム画像とは関係ないでしょう｡
しかし､ やはり最終的なニューロン数は確保できるだろう｡
そして最後に､ この入力バッチベクトルをトーチ変数に変換することを忘れないでください｡
わかりました｡
つまり､ これは今､ トーチ変数に変換されたランダムピクセルの入力画像を表しているのです｡
そして､ それが今度はニューラルネットワークに､ より具体的にはニューラルネットワークの畳み込み層に入ることになるのです｡
なぜなら､ コンボリューションをかけた後のニューロン数だけが必要なので､ コンボリューション3までで済ませるからです｡
3つ目の畳み込み層の直後で､ ここでは完全な接続には踏み込まないことにします｡
そして､ 欲しいニューロン数は､ コンボリューション3とFC1の間だからです｡
わかりました｡
さて､ これで正しい寸法の入力画像が1枚できたので､ いよいよこの画像をニューラルネットワークに伝搬させて､
平坦化層に到達させることにします｡
そして､ 平坦化層のニューロンを取得し､ 欲しい情報を得るだけです｡
それが､ この平坦化層のニューロン数である｡
つまり､ 今やらなければならないことは､ フォワード関数でやっていることと全く同じなのです｡
信号をニューラルネットワークに伝搬させる必要があるが､ 平坦化層に到達するまでは畳み込み層にしか伝搬しない｡
では､ こうしてみましょう｡
xを更新する予定です｡
ここで､ xは入力画像であり､ 2番目のxでxはよく第1畳み込み層になります｡
そして今､ 私たちがやらなければならないことは､ 3つのステップを踏むことです｡
まず最初に､ 入力画像に畳み込みをかける｡
次に第2段階として､ 得られた畳み込み画像に対して最大刈り込みを行う｡
そして第3段階として､ このプールされた畳み込み画像のニューロンを活性化させるのです｡
そして､ Xは､ これらのプールされた複雑な画像で構成される最初の畳み込み層になります｡
それでは､ 最初のステップとして､ 最初のコンボリューション､ コンボリューション1を入力画像に適用してみましょう｡
そこで､ 畳み込み1自己のドット畳み込み1を取るのである｡
これでよしとしよう｡
これを入力画像に適用すると､ これまでのところXで表現されている｡
それが最初の一歩なんですね｡
第一段階完了｡
さて､ 2番目のステップですが､ コンボリューション1 Xで返されたコンボリューション画像にマックスプーリングを適用し､ マックスプーリングを適用することにします｡
では､ 関数モジュールから関数を取り出します｡ Fをショートカットしてドットとし､
関数max pool to Dを使って､ max pool to defineのカッコの中にself convolution
one Xを入れます｡
畳み込み画像に最大プーリングを適用しているからです｡
しかし､ この最大プーリング関数は､ 最初にカーネルサイズという追加の引数を取ります｡
つまり､ 繰り返しになりますが､ これは画像をスライドさせるウィンドウのサイズで､ 各スライドのピクセルの最大値を取ることになります｡
直感の講義で見たように､ 特徴は配列のピクセルの高い値に関連付けられているので､ それでも特徴を検出することができます｡
この最初の引数はカーネルサイズで､ 3つ取ることになります｡
カーネルサイズとしては一般的な選択ですね｡
そして､ 画像の中で何ピクセル滑るかというストライドを入力する必要があるのですが､ ここではストライドを2としています｡
繰り返しになりますが､ これはよくある選択です｡
そうそう､ そうなんです｡
これで第2段階は終了です｡
そして､ 3番目のステップに進みましょう｡ この最初の畳み込み層で､ このプールされ畳み込まれた画像のすべてのニューロンを活性化するのです｡
そして､ これを再び行うために､ これらすべてに関数を適用することになります｡
ここでまたFをとっていますが､ これは別の関数をとるためです｡ ご想像のとおり､
活性化関数になりますが､ いつものように整流器の活性化関数になります｡
そして､ もしかしたらその名前が「Réélu」だと覚えているかもしれませんね｡
これでよしとしよう｡
それです｡
そして､ プールされた複雑な画像に価値を適用するわけです｡
それがこれだけです｡
わかりました｡
そして､ それだけです｡
3ステップ完了｡
とても早かったですね｡
つまり､ まず入力画像にコンボリューションを適用し､ 次にコンボリューションで得られたコンボリューション画像にマックスプーリングを適用する､
という方法を覚えておいてください｡
そして､ このプールされた畳み込み層すべてのニューロンを整流器活性化関数で活性化するのです｡
とても完璧です｡
最初の畳み込み層は､ 最大プーリングが適用され､ ニューロンが活性化されたものである｡
そして､ 基本的には､ 最初の畳み込み層から次の畳み込み層へと信号を伝播させるということです｡
そして､ 次といえば､ それこそ今､ 気をつけなければならないことがあります｡
先ほど第1畳み込み層で行ったのと同じことを第2畳み込み層にも行い､ 第2畳み込み層のニューロンを活性化することで､
再び信号をニューラルネットワークにさらに伝播させるのです｡
しかし､ その前にこの畳み込みレイヤーを取得する必要があります｡
そして､ xに対してコンボリューションを適用することになる｡
これが最初の畳み込み層で､ これからXに畳み込みをかけ､ 2番目の畳み込み層を得る｡
その後､ 最大限の引き込みを行い､ 最後にそのニューロンを活性化する｡
では､ こうしてみましょう｡
実はとても簡単なことなんです｡
それをコピーして下に貼り付ければいいのです｡
そして､ 当然ながら､ 畳み込み1を畳み込み2に置き換える必要がある｡
そして､ そこに行く｡
それが実はできているんです｡
C とても簡単です｡
この線で､ 2番目の畳み込み層から次の3番目の畳み込み層へと信号を伝播させます｡
そして､ この3つ目の畳み込み層を作るには､ またそれを適用する必要があります｡
そこで､ これをコピーして下に貼り付け､ コンボリューション2をコンボリューション3に置き換えているのです｡
そして､ これで完成です｡
とても実用的だと思いませんか？
この素晴らしい構造のおかげで､ 3つの畳み込み層の信号と懐中電灯を伝搬させることができます｡
わかりました｡
とても完璧です｡
さて､ 私たちの信号は第3畳み込み層まで伝搬し､ その後といえば､ 私たちが探しているもの､ 私たちが興味を持っているものにつながっています｡
それが平坦化層です｡
わかりました｡
3つ目の畳み込みレイヤーができたので､ 最後のXは､ 平坦化レイヤーを作る時です｡
そして､ それこそが､ これからやろうとしていることなのです｡
この3番目の畳み込み層のすべてのピクセルを平らにするつもりです｡
つまり､ 3番目の畳み込み層の全チャンネルの全ピクセルを取り出します｡
巨大なベクターに次々と入れていくのです｡
そしてもちろん､ この巨大なベクトルは平坦化レイヤー以外の何物でもないだろう｡
そして同時に､ この平坦化層のニューロン数を求めるトリックを使うことになる｡
それこそが､ 私たちが求めているものなのです｡
それは､ 私たちが失っているニューロンの数です｡
それゆえ､ 欲しいものを直接返そう｡
そして今回のリターンでは､ 第3畳み込み層をフラット化すると同時に､ このフラット化した層のニューロン数を増やしています｡
そこで､ 3番目の畳み込み層であるXを取り上げることにします｡
この第3畳み込み層のすべてのチャンネルを取り出し､ サイズ関数を使ってすべてのチャンネルのピクセルを1つの巨大なベクトルに平坦化するのです｡
というわけで､ PyTorchのチュートリアルに載っているトリックを紹介します｡
さて､ まずXのデータを取ります｡ Xは特殊な構造で､ トーチ変数だからです｡
かなり複雑な構造になっているんですね｡
しかし､ まずはここにあるデータでアクセスし､ その中身を見る必要があるのです｡
そこで､ このビュー機能を使って､ 探しているものにアクセスする必要があるのですが､
これは引数として1とマイナス1が与えられます｡
構造の中身を理解しなくても､ 「こうやってこの数の神経細胞ができるんだ」と理解すればいいんです｡
そして､ 最後にサイズ､ そして括弧を追加し､ その中に1つを入力する必要があります｡
つまり､ ここでやっていることは､ 全チャンネルの全ピクセルを取り出して､
この巨大なベクトルに次々と並べていくことです｡
サイズ1は基本的にそうなっていますね｡
そして､ これによって､ 求めているニューロン数を得ることができるのです｡
わかりました｡
だから今､ 私たちは欲しいものを手に入れることができるのです｡
そして最後に､ この関数をドゥーム画像のフォーマットに適用したときに返される値､ つまり1×80×80でニューロン番号を置き換えることができます｡
そこで､ 今度は､ 数ニューロンをカウントニューロンに置き換える必要があります｡
ズーム画像のフォーマットに適用する関数で, タプルのものとなる｡
80と80です｡
そして､ そこに行く｡
そしてもちろん､ count neuronは実際にはCNNクラスのメソッドであるから､ selfを忘れてはならない｡
そこで､ selfを追加することで､ 警告が消えるはずです｡
そして､ そこに行く｡
今はすべてが順調です｡
何も欠けることなく､ ニューラルネットワークのアーキテクチャを得ることができるのです｡
そして､ このカウントがあります｡
ニューロンは､ 他のアーキテクチャを試したいときに､ 手動でこの数のニューロンを数えたくないという場合に役立つ機能です｡
この機能を使い､ 画像のフォーマットに適用するだけで､ 欲しいものが直接手に入るのです｡
それは､ 何もしなくても､ どんなアーキテクチャであっても､ フラッディング層のニューロンの数である｡
だから､ とてもクールなんです｡
そして今､ 私たちが作っているこの脳の最初の大きな重要なステップを終えました｡
そして､ 最後にもう一つ､ メインの前進関数となる関数を作ることになります｡
そこで､ 脳の始まり､ つまりAIの目から出力層まで信号を伝播させることにします｡
それは､ 2回目のフル接続の後です｡
そこで､ 次のチュートリアルでそれを行うことにします｡
そしてそれまで､ iを楽しんでください｡