一些小总结
/icons/airplane_brown.svg

一些小总结

Property
notion image
写总结是一个不错的习惯,不仅可以帮助我们回顾自己的成长历程,更可以激励我们前进。希望从今以后,能够定期写下自己的总结,记录下自己的收获和成长,同时也给自己加油鼓励,不断前行。希望我可以定期写下我在工作中的一些收获。

0. 在M1的Mac上解析tensorflow v1的pb模型

首先,导入tensorflow库的时候,需要屏蔽tf2的操作:
import tensorflow.compat.v1 as tf
from tensorflow.python.platform import gfile
tf.disable_v2_behavior()
随后便可以读取pb模型了,具体读取模型的代码如下:
def input_feed_dict(df, graph, features):
		feed_dict = {}
		feed_dict.update({k: graph.get_tensor_by_name(k + ":0") for k in features})
		return feed_dict

def predict(pb_file_path):
		with tf.Session() as sess:
				with gfile.FastGFile(pb_file_path, 'rb') as f:
						graph_def = tf.GraphDef()
						graph_def.ParseFromString(f.read())
之后是类似的根据 name 从 graph 中获取 op,进行:
sess.run([op1, op2], feed_dict=feed_dict)

1. 如何评价深度模型中特征的重要性?

对于最终的输出,特征起的作用有多大,如何衡量?有一种思路是,使用一些可以输出重要性的模型去根据特征拟合一版,比如树模型,比如线性网络,比如GAM。
以上这些都比较好想,那么什么是简单有用且贴合自己的实际模型呢?
类似于树模型,树模型使用叶子结点的分裂收益来衡量特征的重要性,我们也可以使用输入对最终输出的影响程度来衡量重要性。有些人可能想到,如果固定输入样本,改变其中一个特征大小,去看输出的变化。且不说每个特征都有自己的大小范围,无法统一输入的变化程度。就光是非线性模型中的这个基准输入就难以确定,非线性模型通常是分段,非单调的。
那么,只考虑输入和输出,不调整样本的值。只考虑在某个样本而非客观情况下,特征的重要性相对大小。此时便有了一种方式,先正常训练得到一个模型。随后,逐一对输入的特征进行shuffle,然后计算预测值与损失值。根据每一个特征shuffle后输入模型计算得到的损失,得到排名,即可快速筛选掉无用特征,以及确定特征的相互重要程度。

2. 如何将部分特征单调化,并保留模型的预测能力?

最简单的方式是,将部分特征独立出来,使用一个简单的线性网络得到最终的输出。在这个过程中,保证其权重为正。
第二种方式是,复制一个原网络,然后将所有权重都设置为正的,所有特征都经过这个网络。最终与另一个网络加权。
第三种方式是,在第二种方式的基础上,只让单调的特征经过这个网络。最终仍然与另一个网络加权。