Keras: CNNのフィルターをみる時

CNNのフィルターの中身をみる方法

一次元データの時

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

n_filter = 10

inputs = Input(shape=(64,))
hidden = Reshape((64, 1))(inputs)
hidden = Conv1D(n_filter, kernel_size, strides=strides, padding='valid', activation="relu", name="cnn")(hidden)
hidden = Flatten()(hidden)
outputs = Dense(1, activation="sigmoid")(hidden)
model = Model(inputs=inputs, outputs=outputs)
# model compile
model.compile(optimizer='adam',
          loss='binary_crossentropy',
          metrics="accuracy")
# training
history = model.fit(X_train, y_train,
                    epochs=20, batch_size=32,
                    validation_data=(X_val, y_val),
                   verbose=1)

でモデルを作ったらcnnと名前をつけているlayerについて見れば良い。

filters = model.get_layer("cnn")

でlayer着目して filters.weightsにweightが格納されている. filters.weights[0]はfilterでfilters.weights[1]はbias。 1次元の時には filters.weights[0][:, :, i]でi番目のfilterが見れる。 まとめると、

# filter show
for i in range(n_filter):
    tmp = sess.run(filters.weights[0][:, :, i])
    print(i, "filter is", tmp)

2次元の時

2次元のfilterの時も、weights[0]の最後の次元がfilterの番号になっていることに注意すれば良い。