Kerasによる事前テスト | python3Xのブログ

python3Xのブログ

ここでは40代、50代の方が日々の生活で役に立つ情報や私の趣味であるプログラム、Excelや科学に関する内容で投稿する予定です。

from keras import backend as K
from keras.engine.topology import Layer
from keras.layers.core import Dropout, Reshape
from keras.layers.convolutional import ZeroPadding2D
from keras.models import Sequential
import numpy as np

def test_layer(layer, x):
    # Adjust layer input_shape to x.shape
    layer_config = layer.get_config()
    layer_config["input_shape"] = x.shape
    layer = layer.__class__.from_config(layer_config)
    model = Sequential()
    model.add(layer)
    # 1. Test building the computation graph process
    model.compile("rmsprop", "mse")  # rmsprop:最適化アルゴリズム
    _x = np.expand_dims(x, axis=0)  # Add dimension for batch size
    # 2. Test run the graph process
    # predictを行うことでグラフ内にデータを通したときに上手く動くかをチェックする

    return model.predict(_x)[0]
# 正規化式 LRN(x_i) = x_i/(k + α/n * Σ_j x^2)^β
class LocalResponseNormalization(Layer):
    def __init__(self, n=5, alpha=0.0005, beta=0.75, k=2, **kwargs):
        self.n = n
        self.alpha = alpha
        self.beta = beta
        self.k = k
        super(LocalResponseNormalization, self).__init__(**kwargs)
    def build(self, input_shape):
        # In this layer, no trainable weight is used.
        super(LocalResponseNormalization, self).build(input_shape)
       
    """
    ACROSS_CHANNEL:チャンネル(RGBなど)方向で(1 x 1 x local_sizeの範囲を扱う)   
    WITHIN_CANNEL:同じチャンネルの平面上で処理が行われる(local_size x local_size x 1の範囲を扱う)
   
    主な関数4つ
    ①__init__:通常のクラスと同様、ハイパーパラメータの設定処理などをおこなう
   
    ②build:層が学習可能な重みをもつ場合、ここで宣言して初期化処理を行う
    今回は、正規化のみで、重みを持たない(処理内なし)
   
    ③call:伝播処理で行われる処理を実装。バッチサイズは入力されるまで分からないため
    バッチサイズに依存しない処理にしておく必要がある
   
    ④compute_output:この層を通過した後の形状を出力する。今回は処理前後で行列のサイズの変更はないので
    input_shapeをそのまま返却する
    """

    def call(self, x):
        squared = K.square(x)   x_i^2
        # WITHIN_CHANNEL Normalization
        average = K.pool2d(squared, (self.n, self.n), strides=(1, 1), # 1/n *  Σ_j x_j^2
                           padding="same", pool_mode="avg")
        denom = K.pow(self.k + self.alpha * average, self.beta)  # (k + α/n * Σ_j x_j^2)^β
        return x / denom
    def compute_output_shape(self, input_shape):
        return input_shape

# test the test harness
x = np.random.randn(10, 10) # 標準正規分布による10 x 10の行列
layer = Dropout(0.5)
y = test_layer(layer, x)
assert(x.shape == y.shape)
x = np.random.randn(10, 10, 3) # 10 x 10 x 3のテンソル
layer = ZeroPadding2D(padding=(1, 1))
y = test_layer(layer, x)
assert(x.shape[0] + 2 == y.shape[0]) # padding分端々で1 + 1 = 2追加
assert(x.shape[1] + 2 == y.shape[1])
x = np.random.randn(10, 10)
layer = Reshape((5, 20))
y = test_layer(layer, x)
assert(y.shape == (5, 20))
# test custom layer
x = np.random.randn(225, 225, 3)
layer = LocalResponseNormalization()
y = test_layer(layer, x)
assert(x.shape == y.shape)
 
 
Using TensorFlow backend.
2018-11-11 20:23:56.228891: I tensorflow/core/platform/cpu_feature_guard.cc:141]
Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX AVX2