これが私のtensorflow kerasモデルです(ドロップアウトレイヤーが難しい場合は無視できます)
import tensorflow as tf
optimizers = tf.keras.optimizers
Sequential = tf.keras.models.Sequential
Dense = tf.keras.layers.Dense
Dropout = tf.keras.layers.Dropout
to_categorical = tf.keras.utils.to_categorical
model = Sequential()
model.add(Dense(256, input_shape=(20,), activation="relu"))
model.add(Dropout(0.1))
model.add(Dense(256, activation="relu"))
model.add(Dropout(0.1))
model.add(Dense(256, activation="relu"))
model.add(Dropout(0.1))
model.add(Dense(3, activation="softmax"))
adam = optimizers.Adam(lr=1e-3) # I don't mind rmsprop either
model.compile(optimizer=adam, loss='categorical_crossentropy', metrics=['accuracy'])
model.summary()
モデル構造と重みを次のように保存しました
model.save("sim_score.h5", overwrite=True)
model.save_weights('sim_score_weights.h5', overwrite=True)
実行すると、3つの出力クラスの予測確率がmodel.predict(X_test)
得られます。[0.23, 0.63, 0.14]
最初の 20 個の機能のそれぞれが、このモデルで 3 つの出力ソフトマックスに対してどのくらいの重み/重要性を持っているかを視覚化するにはどうすればよいですか?
たとえば、2 列目は最終結果にほとんど影響を与えませんが、5 列目は 20 列目よりも出力予測に 3 倍の影響を与える可能性があります。5 番目の列の絶対的な効果が何であるかは関係ありません。相対的な重要性を把握するだけで十分です。たとえば5th column = 0.3, 20th column = 0.1
、20 x 3 matrix
.
直感またはTensorflow プレイグラウンドについては、このアニメーションを参照してください。ビジュアライゼーションは、トレーニング中に重みがどのように変化するかを示す必要はありませんが、トレーニングの最後にどのように見えるかのスナップショット イメージを表示するだけでかまいません。
実際、ソリューションはビジュアライゼーションである必要はありません。20 要素 x 3 出力の配列であり、3 つの出力ソフトマックスに対する各機能の相対的な重要性と、他の機能との相対的な重要性を持っている場合もあります。
中間層の重要性を理解することは、単なるおまけです。
20 個のフィーチャを視覚化する理由は、透明性を確保するためです (現在、モデルはブラック ボックスのように感じられます)。私はmatplotlib、pyplot、seabornに慣れています。Tensorboard も認識していますが、Softmax を使用した単純な Dense Relu ネットワークの例は見つかりませんでした。
20 x 3 の重みを取得するための時間のかかる方法は、さまざまな入力を送信し、それに基づいて機能の重要性を推測しようとすることで、 のデルタを使用20 features
して のドメイン検索を行うことだと思います (これには~=可能なサンプルがあります追加する機能が増えるほど指数関数的に悪化します)、次に条件付き確率を適用して相対的な重みをリバース エンジニアリングしますが、TensorBoard またはいくつかのカスタム ロジックを介したより単純で最適化された方法があるかどうかはわかりません。0 - 1
0.5
3 to the power of 20
3.4 billion
誰かがモデルを視覚化したり、20 個の機能の 20 x 3 = 60 の相対的な重みを計算したり、コード スニペットを使用して 3 つの出力を計算したり、これを達成する方法についての参照を提供したりできますか?