簡體   English   中英

計算/可視化Tensorflow Keras Dense模型層相對連接權重wrt輸出類

[英]Calculate/Visualize Tensorflow Keras Dense model layer relative connection weights w.r.t output classes

這是我的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)

執行model.predict(X_test)我得到[0.23, 0.63, 0.14] model.predict(X_test) [0.23, 0.63, 0.14] ,這是3個輸出類的預測概率。

在此模型中,使用3個輸出softmax,我如何可視化我最初的20個功能中每個功能的重要性/重要性?

例如,我的第二列對最終結果的影響可以忽略不計,而第五列對輸出預測的影響可能是第二十列的三倍。 不管第5列的絕對影響是什么,只要弄清楚相對重要性就足夠了,例如對於20 x 3 matrix 5th column = 0.3, 20th column = 0.1等等。

有關直覺或Tensorflow游樂場請參見此 動畫 可視化不必顯示訓練過程中權重的變化,而可以顯示訓練結束時權重的快照圖像。

實際上,該解決方案甚至不必是可視化的,它甚至可以是20個元素x 3個輸出的數組,這些數組具有每個功能的相對重要性以及3個輸出softmax和相對於其他功能的重要性。

獲得中間層的重要性只是一個額外的好處。

我之所以要可視化這20個功能,是出於透明目的(當前該模型感覺像一個黑匣子)。 我對matplotlib,pyplot和seaborn感到滿意。 我也知道Tensorboard,但是找不到帶有Softmax的簡單Dense Relu網絡的任何示例。

我覺得一個耗時的方式來獲得20×3點的權重是做一個域搜索的20 features0 - 1與增量0.5通過發送各種輸入,並試圖推斷的基礎斷的是功能的重要性(這將具有3 to the power of 20 20〜= 3.4 billion可能的樣本空間的冪,並且隨着我添加的更多功能而呈指數級變差),然后應用條件概率對相對權重進行逆向工程,但是我不確定是否有更簡單/優化的方法通過TensorBoard或一些自定義邏輯。

有人可以幫助可視化模型/計算帶有代碼段的3個輸出的20個功能的20 x 3 = 60的相對權重,或者提供有關如何實現此目的的參考嗎?

我遇到了一個類似的問題,但是我更關心模型參數(權重和偏差)的可視化,而不是模型特征( 因為我也想探索和查看黑匣子 )。

例如,以下是具有2個隱藏層的淺層神經網絡的代碼段。

model = Sequential()
model.add(Dense(128, input_dim=13, kernel_initializer='uniform', activation='relu'))
model.add(Dropout(0.1))
model.add(Dense(64, kernel_initializer='uniform', activation='relu'))
model.add(Dropout(0.1))
model.add(Dense(64, kernel_initializer='uniform', activation='relu'))
model.add(Dropout(0.1))
model.add(Dense(8, kernel_initializer='uniform', activation='softmax'))

# Compile model
model.compile(loss='sparse_categorical_crossentropy', optimizer='adam', metrics=['accuracy'])

# Using TensorBoard to visualise the Model
ks=TensorBoard(log_dir="/your_full_path/logs/{}".format(time()), histogram_freq=1, write_graph=True, write_grads=True, batch_size=10)

# Fit the model   
model.fit(X, Y, epochs = 64, shuffle = True, batch_size=10, verbose = 2, validation_split=0.2, callbacks=[ks])

為了使參數可視化,需要牢記一些重要的事情:

  1. 始終確保在model.fit()函數中有一個validation_split [無法直觀顯示其他直方圖]。

  2. 確保histogram_freq的值始終> 0 !! [否則將不會計算直方圖]。

  3. TensorBoard的回調必須在model.fit()中指定為列表。

一旦完成, goto cmd並輸入以下命令:

張量板--logdir = logs /

這為您提供了一個本地地址,您可以使用該地址在Web瀏覽器上訪問TensorBoard。 所有直方圖,分布,損失和准確性功能都將以圖表形式提供,並且可以從頂部的菜單欄中進行選擇。

希望這個答案能給可視化模型參數的過程一個提示(由於以上幾點無法同時使用,我本人也有些掙扎)。

讓我知道是否有幫助。

以下是keras文檔鏈接供您參考:

https://keras.io/callbacks/#tensorboard

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM