Tensorflow入門 カスタムレイヤー

tf.keras.layers.Denseについて

Denseの挙動

import tensorflow as tf
test_layer = tf.keras.layers.Dense(10)
test_layer(tf.zeros([35]))

 このコードだと、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の挙動

以下のコードではoutput=input*W+bと計算する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]となる。

参考

note.com