keras: layerの初期化で値代入をする

Kerasでlayerにこちらから指定した初期値を入れて、固定する方法について書いてます。 一度学習したネットワークのconv層のfilterの一部だけを使用したいことがあったのでその時の記録です。

  • 初期値の代入はkeras.initializers.Constant()を利用する。
  • trainable=Falseにすればそれで固定できる

conv層を使うのを例としてあげる。Function APIを使用する。

from tensorflow.keras.layers import Input, Dense, Conv1D, Flatten, Reshape
from tensorflow.keras.models import Model

inputs = Input(shape=(100,))
hidden = Reshape((100, 1))(inputs)
hidden = Conv1D(3, 5,
                strides=1, padding='same',
                activation="relu", name="conv")(hidden)
hidden = AveragePooling1D(pool_size=kernel_size, strides=1, padding="same")(hidden)
hidden = Flatten()(hidden)
outputs = Dense(10, activation="relu")(hidden)
model = Model(inputs=inputs, outputs=outputs)

このモデルで1度計算したconv1Dのkernelを使いたいとする。 学習した後に、

kenels = sess.run(model.get_layer("conv").weights[0])
bias = sess.run(model.get_layer("conv").weights[1])

で固定したい値を得る。shapeさえあっていれば別の値でもいいですが、多分、numpyの方がいい。

from tensorlfow.keras.initilizers import Constant

inputs = Input(shape=(100,))
hidden = Reshape((100, 1))(inputs)
hidden = Conv1D(3, 5,
                strides=1, padding='same',
                activation="relu", name="conv",
                kernel_initializer=Constant(kernels),
                bias_intializer=Constant(bias),
                trainable=False)(hidden)
hidden = AveragePooling1D(pool_size=kernel_size, strides=1, padding="same")(hidden)
hidden = Flatten()(hidden)
outputs = Dense(10, activation="relu")(hidden)
model = Model(inputs=inputs, outputs=outputs)

とすれば学習済みのkernel, biasに固定できる