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に固定できる