satopoooonのブログ

自分向けの備忘録

MNIST,CNNとかのお勉強

MNIST for expertで機械学習のお勉強中、

わからない単語を以下にメモします。

下の二つが参考文献です。

enakai00.hatenablog.com

ujjwalkarn.me

 

  • 畳み込み(Convolution)

画像から、特徴量を抽出すること、

(画像をシャープにしたり、ぼかしたり色々、フィルタリングとも呼ぶ)

MNIST for expert のチュートリアルでは、

1枚の画像に対して、複数のフィルターをかませて、複数の特徴量を抽出している。

 

  • プーリング

素数を削減すること。

元画像は28×28ピクセル

この画像に例えば2つのフィルターをかませると、

それぞれのフィルターに対応した画像が作成されるので、

2×28×28のデータ容量となる。

データ容量削減したいので、2×14×14と圧縮する。

また、
フィルタリング後の画像データ28×28は、14×14に圧縮されると、

特徴量がより際立つデータとなる。

(圧縮時、ノイズ成分がより圧縮されるイメージ?こっちの方がプーリングの主目的?)

 

MNIST for expert では、畳み込み、プーリングを2段構成にしています。

 

1段目の32枚のフィルターそれぞれに対して、

2段目のフィルターを1つかけ、足し合わせます。

続いて

1段目の32枚のフィルターそれぞれに対して、

2段目のフィルターを1つ(上のとは別のフィルター)をかけ、足し合わせます。

以下繰り返しです。

 

 

 

f:id:satopoooon:20180708093928p:plain

 

 バックプロパゲーションにより、

このフィルタ、プーリングの仕方を最適にし、正解率を向上させます

 

 

 

 

 

 

 

 

pythonサブクラスのコンストラクタ定義時の注意点(親クラスのコンストラクタが上書きしないように)

  • サブクラスのコンストラクタ定義時の注意点 サブクラスでコンストラクタを定義する際、
    親クラスのコンストラクタをオーバーライドしないように注意しましょう。
class B:
    """
    親クラス
    """
    def __init__(self) -> None:
        self.x = 10

class D(B):
    """
    サブクラス2

    自分の __init__ を定義しているが
    super().__init__() を呼んでいないバージョン
    """

    # noinspection PyMissingConstructor
    def __init__(self):
        self.y = 20

これで、コンストラを呼び出してみます。

obj2 = D()
print(obj2.x)
print(obj2.y)

出力は

AttributeError("'D' object has no attribute 'x'",)

となります。 →親クラスのコンストラクタがオーバーライドされてしまったせいです。
これを防ぐためには、サブクラス定義時に、

class E(B):
    """
    サブクラス3

    自分の __init__ を定義していて
    super().__init__() も呼んでいるバージョン
    """

    def __init__(self):
        super().__init__()
        self.y = 20

とする必要があります。
以下参考

Pythonメモ-57 (サブクラスで __init__ を定義する場合の注意点) (class, super, __init__, Never code a method that just delegates to the superclass) - いろいろ備忘録日記

書評(オブジェクト指向でなぜつくるのか)

簡単にまとめていく

著作権的なやつにひっかかると嫌なので、かなり殴り書きです。

オブジェクト指向って何?

ソフトウェア開発、保守を楽にするための技術、

オブジェクト指向より前の言語で、ダメな部分

・コードの再利用が、共通サブルーチンの再利用のみ、
・ローカル変数の使用範囲がサブルーチン内のため、
 それ以上、範囲を広くする必要がある変数は、グローバル変数を使う必要がある。
 グローバル変数は、バグを生みやすいため、なるべく使いたくない。

オブジェクト指向でできること、

ポリモーフィズム
 →共通メインルーチンの仕組み
・サブルーチンより外の範囲で使用可能な変数(インスタンス変数)、
 使用範囲はクラス内で、複数のサブルーチンからアクセス可能、
 インスタンス変数とメソッドが結びついている、他のメソッドから(通常は)参照できない(しないようにする)。

あとは、コードの書く量を減らせる技術
・一つのクラスから、たくさんのインスタンスを作成できる。
・継承
 →重複した内容(メソッド)をまとめる、

何がそれを可能にしている?

・メモリの使い方

クラスの簡単な説明は以下
Pythonでクラスを継承する | UX MILK

書評(readable code)

*readable codeを読みました

 

コードレビュー等を受けたことがない方は、

一度読んで見たら良いかと思います。

 

日本語訳を出てるみたいですけど、

原著の方を読みました。

(理由は詳しくは書けませんが、そういうことです)

 

中身を書くと、

色々とひっかかりそうなので書きませんが。。。

 

以下は別の方の感想です。 

【読書感想文】リーダブルコード メモその1 - 16bit!

リーダブルコードに共感出来ない人とは一緒にコーディングしたくない - ぼっち勉強会

 

時間が空いたらもう一度読もうと思います。