+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

暂无数据

计算/可视化Tensorflow Keras Dense模型层相对连接权重wrt输出类

发布于2020-07-02 21:43     阅读(630)     评论(0)     点赞(27)     收藏(4)


这是我的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]这是3个输出类别的预测概率。

在此模型中,我将如何可视化我最初的20个功能在3个输出softmax中有多少权重/重要性?

例如,我的第二列对最终结果的影响可以忽略不计,而第五列对输出预测的影响是第二十列的三倍。第五列的绝对作用是什么无关紧要,仅弄清楚相对重要性就足够了,例如5th column = 0.3, 20th column = 0.1对于a等等20 x 3 matrix

有关直觉或Tensorflow游乐场请参见此动画可视化不必显示训练期间权重的变化,而可以显示训练结束时权重的快照图像。

实际上,该解决方案甚至不必是可视化的,它甚至可以是20个元素x 3个输出的数组,这些数组具有每个功能的相对重要性以及3个输出softmax和相对于其他功能的重要性。

获得中间层的重要性只是一个额外的好处。

我之所以要可视化这20个功能,是出于透明目的(当前该模型感觉像一个黑匣子)。我对matplotlib,pyplot和seaborn感到满意。我也知道Tensorboard,但是找不到带有Softmax的简单Dense Relu网络的任何示例。

我觉得获取20 x 3权重的一个耗时方法通过发送各种输入并尝试20 features从中得出0 - 1具有delta的域进行搜索,0.5并尝试以此推论出特征的重要性(这可能会有3 to the power of 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()中指定为列表。

一旦完成,转到cmd并键入以下命令:

张量板--logdir = logs /

这为您提供了一个本地地址,您可以使用该地址在Web浏览器上访问TensorBoard。所有直方图,分布,损失和准确性功能都将以图表形式提供,并且可以从顶部的菜单栏中进行选择。

希望这个答案能给可视化模型参数的过程带来一些提示(由于以上几点无法同时使用,我本人也有些挣扎)。

让我知道是否有帮助。

以下是keras文档链接供您参考:

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



所属网站分类: 技术文章 > 问答

作者:黑洞官方问答小能手

链接: https://www.pythonheidong.com/blog/article/433201/

来源: python黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

27 0
收藏该文
已收藏

评论内容:(最多支持255个字符)