えんじにあのじゆうちょうスマートフォン用の表示で見るえんじにあのじゆうちょう勉強したことを中心にアウトプットしていきます。E資格対策はじめに超個人的な話題ですが、もう少しでE資格の受験日です。そこで一通りのアルゴリズムの実装を見直していこうと思います。ディープ系はあまり自信がないので、コアになりそうなところを中心にしっかりやっていこうと思います。今回は畳み込みの実装を整理していこうと思います。畳み込みニューラルネットワークは画像だけのものではありませんが、一旦記載が楽になるように画像的なデータを扱っている前提で書きます。convolutionconvolutionは単純にフィルタ(カーネルと言ったりもする)と入力値との要素積です。講座とか受けると、だいたい全結合の次が畳み込みなので、勘違いしがちですが、dot積ではありません。入力からあるフィルターサイズと同じ大きさの領域(例えば3x3)を取った時、以下のようだったとして実際に計算してみます。計算順序は、まずフィルタと画像の要素積をとって、バイアスを足します。(バイアスはチャンネルごとに1つです)その後、それらの要素を全て足し合わせます。-16.023551823779634最後の-16....という値がこの畳込みで得られた値です。これを次々と繰り返して画像全体を畳み込みます。PoolingPoolingはある範囲の画素から最大値だったり、平均値だったりを取り出していくことです。フィルタサイズを3x3としたときに、以下の様なデータが有ったとします。9]])今回は最大値でPoolingする例です。以下のように書きます。np.max(X)9ただ最大値を取っているだけですね。これを畳み込み同様繰り返していき、出力を得ます。paddingpaddingはnp.padを用いて簡単に実装できます。以下のような1次元のnumpy配列があったとします。9])これの前後をpaddingするには次のようにします。下の例では前に1つ、後ろに2個、0をpaddingしています。0])第2引数で前後にどれだけpaddingするかの数を書いてます。2次元の場合はどうやるのでしょうか。次のような配列が合ったとします。9]])これも先程と同様にpaddingしてみましょう。列方向の頭に1つ、お尻に2つ、行方向の頭に3つお尻に4ついれてみます。後ろにpaddingする数)を指定してあげるのです。'constant')になります。(pがpadding数です)stridestrideはフィルタを適用するときに適用する範囲をどれだけ動かすかです。当たり前ですが1以上の整数になります。ストライドとpaddingを実際に適用してみてみることにします。データは一旦、5x5の配列を用意しました。Xsは画像のサイズ(1辺)、fsはフィルタサイズ(1辺)です。2として出力される画像の大きさを見てみます。3x3が出力サイズです。これは以下のように式で表せます。そのとおりになってますね。まとめて畳み込んでみるまずはデータを用意します。今回は画像Xは10枚あることとし、サイズは32x32、チャンネル数は3とします。出力チャネル数は32とします。bは出力チャネル数に合わせれば良いので、32個あればいいのですが、計算が楽になるように以下の様に定義します。Xsは画像のサイズ(1辺)、fsはフィルタサイズ(1辺)、outchsは出力チャネル数です。strideを変えながら出力サイズを出力していきます。32chまぁ当たり前なんですが、同じstrideならpaddingが大きくなると出力は大きくなって、同じpaddingならstrideが大きくなると出力は小さくなります。チャンネル数は今回出力数を32と決めたので、ちゃんと全て32です。poolingも動きは同じなため、ここでは特に実装しません。まとめ今回は畳み込みに必要な要素と数式と実装をまとめてみました。本にしても講座にしても、読んだり受けたりしたあとはわかった気になるのですが、やっぱり自分で実装し直さないと危ないですね。他の項目についても、特に自分がふわっとしているところを中心に、色々と試していこうと思います。(1)認定はてなブログをはじめよう!marufeuillexさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。