おひとりさま現役パラレルワーカーフクコろぐ

これからの会社員は、複数の収入源をもとう! 会社に翻弄されずアナタらしく仕事ができる。 そんなパラレルワーカーを広めるフクコのブログです。

【文系プログラミング初心者deE資格】ゼロつくディープラーニング #38

f:id:fukuko-parallel-work:20211207120518j:plain

こんにちは!

現役パラレルワーカー フクコです。

f:id:fukuko-parallel-work:20210212204833p:plain



前回の記事↓に続き
www.fukuko-parallel-work.com



来年の2月の試験に向けてE資格試験勉強中のため


E資格とは?の記事はコチラ↓

www.fukuko-parallel-work.com




ゼロつくシリーズでおなじみ

オーライリーから出版されている

ディープラーニングの本格的な入門書でよくおススメされる

「ゼロからつくる Deep Learning」本


f:id:fukuko-parallel-work:20211029220008j:plain





この本↑を毎日5ページずつコツコツこなす

約2か月間で今年中に終了するので

来年のE資格試験までにこれで基礎力をつけることにしました。(^^)


ついつい私は何もないとだらけてしまうので(笑)

毎日5ページ終わった後の記録とまとめを書いていこうと思います。


と、まとめに入る前に…

やる気を出すためのコトバをシェアします!!(主に私のやる気を出すために 笑)

人に与えない者は、いずれ人から何も貰えなくなる。


欲しがるばかりの奴は結局何も持ってないのと同じ。


自分で何も生み出せないから、独りで死ぬのは惨めだな。


by 兪史郎(ゆしろう)


私の大好きな鬼滅の刃から

兪史郎(ゆしろう)の名言です。


兪史郎(ゆしろう)は、

瀕死の状態から、珠世様に鬼とされることで救われた青年

珠世様と同じく、彼も鬼でも少量の血液を飲むだけで、ヒトを喰べません。

もう珠世様命で珠世様を中心に世界はまわっていると思っているヒトです。(笑) 

ちなみに少年の姿でも、実は実年齢35歳だそう!(笑) 


ウーム、兪史郎(ゆしろう)のこの発言。

ホントそのとおり!!

欲しがってばかりの承認欲求が強いヒト達

大体は上手くいかないコトが多いんです。(>ー<)


え?なぜって?

それは

常に自分より先にまず相手から見返りを求めてしまうからです。


そのスタンスでいるうちは


基本的にはどんなことでもうまくいかないコトが多いんですよね。

相手の立場に立てるようになって

どうすればうまくいくのか自分でまずは考えて行動するようになって

そうなって、はじめて

物事が良い方向にむかっていくようになります。(^^)


もうこれは世の中そういうモノ!と思っちゃうのがイイと思います。


兪史郎(ゆしろう)、どうもありがとう! (^0^)

今日もやる気が出てきました! 

よし!! 今日も頑張るぞ~! お~!! 

というコトで、

何も生み出さずに独りさびしく死ぬのはイヤなので、今日も私はノルマはゼッタイこなしますよ! 笑


ではでは、いい加減まとめに入ります。笑



その前に本の目次の紹介です。

ゼロつくディープラーニングは、下記↓の合計8章で構成されています。

本の目次

  • 5章 誤差伝播法
  • 6章 学習に関するテクニック



ちなみに…

ゼロつくディープラーニング第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次元の行列に変換すると

↓の図の例のとおり


f:id:fukuko-parallel-work:20211207220857j:plain


↑の図の例のとおり、

展開後の要素の数は元のブロックの要素数よりも多くなる


そのため、

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を使って、出力サイズを適切な形状に整形している


今日のまとめ


ハイ、今日はここまで!!

第7章まだまだ続きます!

引き続き頑張りまっす。


最後まで読んでくださり、ありがとうございます!

フクコ


ディープラーニング入門書おススメ本


E資格とは?

www.fukuko-parallel-work.com