Tensorflow入門 カスタムレイヤー
tf.keras.layers.Denseについて
Denseの挙動
import tensorflow as tf test_layer = tf.keras.layers.Dense(10) test_layer(tf.zeros([3, 5]))
このコードだと、test_layerの挙動は
input:
<tf.Tensor: shape=(2, 5), dtype=float32, numpy=
array([[0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0.]], dtype=float32)>
output:
<tf.Tensor: shape=(3, 10), dtype=float32, numpy=
array([[0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0., 0., 0., 0., 0.]], dtype=float32)>
[3,5]->[3,10]となる。各スライスに対して全結合層Denseによって指定された出力が用意される。
Denseのweights
上のコードで
layer.weights
とすると
[<tf.Variable 'dense_2/kernel:0' shape=(5, 10) dtype=float32, numpy=
array([[ 0.486067 , 0.20546919, -0.09258938, -0.40606958, -0.30191094,
0.02308851, -0.2675512 , 0.3563395 , 0.09555674, 0.43114156],
[-0.28984267, -0.245305 , -0.6075053 , -0.15812173, 0.58918387,
-0.12043589, 0.36755067, 0.07295161, -0.20922762, -0.37684318],
[ 0.03084815, -0.6029185 , -0.0387184 , -0.56773895, 0.5532685 ,
-0.5056865 , 0.26384133, 0.2853508 , -0.4719783 , 0.20132434],
[-0.26045492, -0.48186827, -0.39097998, 0.14996946, -0.35538018,
0.30390632, -0.18356588, -0.00843632, 0.2485987 , 0.508508 ],
[ 0.34722006, 0.25591213, 0.091214 , -0.30455926, -0.06593645,
0.21503013, -0.51900524, 0.47164565, 0.3456446 , 0.20257044]],
dtype=float32)>,
と出力される。[3,5]->[3,10]であるから、5->10と変換するために[5,10]の重み行列が定義される。
自作layerの挙動
以下のコードではと計算するlayerを定義する。
from tensorflow.keras.layers import Layer # Linearレイヤー class Linear(Layer): # 初期化 def __init__(self, units=32, input_dim=32): super(Linear, self).__init__() w_init = tf.random_normal_initializer() self.w = tf.Variable( initial_value=w_init(shape=(input_dim, units), dtype='float32'), trainable=True) b_init = tf.zeros_initializer() self.b = tf.Variable( initial_value=b_init(shape=(units,), dtype='float32'), trainable=True) # 計算 def call(self, inputs): # y = x * w + b return tf.matmul(inputs, self.w) + self.b
Linearの挙動
linear_layer = Linear(4, 2) y = linear_layer(tf.ones((2, 2)))
output:
<tf.Tensor: shape=(2, 4), dtype=float32, numpy=
array([[ 0.08781138, -0.11293805, 0.11843207, 0.03726201],
[ 0.08781138, -0.11293805, 0.11843207, 0.03726201]],
dtype=float32)>
このlayerはinput_dim=2、unit=4であるから[2,2]->[2,4]となる。