こんにちは!
現役パラレルワーカー フクコです。
前回の記事↓に続き
www.fukuko-parallel-work.com
来年の2月の試験に向けてE資格試験勉強中のため
E資格とは?の記事はコチラ↓
ゼロつくシリーズでおなじみ
オーライリーから出版されている
ディープラーニングの本格的な入門書でよくおススメされる
「ゼロからつくる Deep Learning」本
この本↑を毎日5ページずつコツコツこなすと
約2か月間で今年中に終了するので
来年のE資格試験までにこれで基礎力をつけることにしました。(^^)
ついつい私は何もないとだらけてしまうので(笑)
毎日5ページ終わった後の記録とまとめを書いていこうと思います。
と、まとめに入る前に…
やる気を出すためのコトバをシェアします!!(主に私のやる気を出すために 笑)
人に与えない者は、いずれ人から何も貰えなくなる。
欲しがるばかりの奴は結局何も持ってないのと同じ。
自分で何も生み出せないから、独りで死ぬのは惨めだな。
by 兪史郎(ゆしろう)
私の大好きな「鬼滅の刃」から
兪史郎(ゆしろう)の名言です。
兪史郎(ゆしろう)は、
瀕死の状態から、珠世様に鬼とされることで救われた青年。
珠世様と同じく、彼も鬼でも少量の血液を飲むだけで、ヒトを喰べません。
もう珠世様命で珠世様を中心に世界はまわっていると思っているヒトです。(笑)
ちなみに少年の姿でも、実は実年齢35歳だそう!(笑)
ウーム、兪史郎(ゆしろう)のこの発言。
ホントそのとおり!!
欲しがってばかりの承認欲求が強いヒト達は
大体は上手くいかないコトが多いんです。(>ー<)
え?なぜって?
それは
常に自分より先にまず相手から見返りを求めてしまうからです。
そのスタンスでいるうちは
基本的にはどんなことでもうまくいかないコトが多いんですよね。
相手の立場に立てるようになって
どうすればうまくいくのか自分でまずは考えて行動するようになって
そうなって、はじめて
物事が良い方向にむかっていくようになります。(^^)
もうこれは世の中そういうモノ!と思っちゃうのがイイと思います。
兪史郎(ゆしろう)、どうもありがとう! (^0^)
今日もやる気が出てきました!
よし!! 今日も頑張るぞ~! お~!!
というコトで、
何も生み出さずに独りさびしく死ぬのはイヤなので、今日も私はノルマはゼッタイこなしますよ! 笑
ではでは、いい加減まとめに入ります。笑
その前に本の目次の紹介です。
ゼロつくディープラーニングは、下記↓の合計8章で構成されています。
本の目次
- 1章 Python入門
- 2章 パーセプトロン
- 3章 ニューラルネットワーク
- 4章 ニューラルネットワークの学習
- 5章 誤差伝播法
- 6章 学習に関するテクニック
- 7章 畳み込みニューラルネットワーク
- 8章 ディープラーニング
ちなみに…
ゼロつくディープラーニングの第1章はPython入門のセクション(20ページ分)なので、
とりあえず今回私は飛ばし、第2章からまとめています。
現在は、第7章 畳み込みニューラルネットワークで~す。
第7章 畳み込みニューラルネットワーク つづき
第7章のテーマは、
畳み込みニューラルネットワーク(Convolutional Neural Network: CNN)。
7.4.2 im2colによる展開
NumPyでは、for文を使うと処理が遅くなる。
なので、
for文による実装は行わず、
im2colという便利な関数を使ったシンプルな実装を行う。
im2colとは?
「Image to column」の略であり、
日本語だと「画像から行列へ」という意味。
フィルター(重み)にとって都合のいいように入力データを展開する関数。
たとえば、
3次元の入力データに対してim2colを適用すると、2次元の行列に変換すると
↓の図の例のとおり。
↑の図の例のとおり、
展開後の要素の数は元のブロックの要素数よりも多くなる。
そのため、
im2colを使った実装では通常よりも多くのメモリを消費するという欠点がある。
畳み込み演算フィルター処理の詳細は次の↓のとおり。
1.im2colで展開したデータとフィルタを縦方向に1列に展開したデータを行列の積で計算。
2.その出力結果(2次元のデータ)をreshapeで、3次元のデータにして格納。
7.4.3 Convolutionレイヤの実装
ConvolutionレイヤをPythonで実装してみる。
まず、パラメータは次のとおり。
- input_data : (データ数, チャンネル, 高さ, 幅)の4次元配列からなる入力データ
- filter_h : フィルターの高さ
- filter_w : フィルターの幅
- stride : ストライド
- pad : パディング
im2colを実際に使ってみる。
Pythonで実装すると↓のとおり。
# 7.4.3 Convolutionレイヤの実装 # im2colを実際に使ってみる。 import sys, os sys.path.append(os.pardir) from common.util import im2col import numpy as np #1つめは、バッチサイズが1、チャンネル3、7x7のデータ x1 = np.random.rand(1, 3, 7, 7) col1 = im2col(x1, 5, 5, stride=1, pad=0) print(col1.shape)#答えは、(9, 75) #2つめは、バッチサイズが10、チャンネル3、7x7のデータ x2 = np.random.rand(10, 3, 7, 7)#10個のデータ col2 = im2col(x2, 5, 5,stride=1, pad=0) print(col2.shape)#答えは、(90, 75)
↑の実装を見ると、
1つめは、バッチサイズが1、チャンネル3、7x7のデータ。
2つめは、バッチサイズが10、チャンネル3、7x7のデータ。
次に、
im2colを使って、畳み込み層を実装してみる。
Pythonで実装すると↓のとおり。
# im2colを使って、畳み込み層を実装 class Convolution: def __init__(self, W, b, stride=1, pad=0): self.W = W self.b = b self.stride = stride self.pad = pad def forward(self, x): FN, C, FH, FW = self.W.shape N, C, H, W = x.shape out_h = int(1 + (H + 2*self.pad - FH) / self.stride) out_w = int(1 + (W + 2*self.pad - FW) / self.stride) col = im2col(x, FH, FW, self.stride, self.pad) col_W = self.W.reshape(FN, -1).T#フィルターの展開 out = np.dot(col, col_W) + self.b out = out.reshape(N, out_h, out_w, -1).transpose(0, 3, 1, 2) return out
↑のPython実装の補足
reshapeの際に、ー1を指定すると
多次元配列の要素数のつじつまを合うように、要素数を自動でまとめてくれる。
forwardの実装では、
最後にtransposeを使って、出力サイズを適切な形状に整形している。