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
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]
# predictを行うことでグラフ内にデータを通したときに上手く動くかをチェックする
return model.predict(_x)[0]
# 正規化式 LRN(x_i) = x_i/(k + α/n * Σ_j x^2)^β
class LocalResponseNormalization(Layer):
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)
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
# 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
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])
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))
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)
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
x = np.random.randn(225, 225, 3)
layer = LocalResponseNormalization()
y = test_layer(layer, x)
assert(x.shape == y.shape)
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