【发布时间】:2022-06-13 01:15:39
【问题描述】:
我正在尝试汇总以下教程:
- Creating decision tree by hand
- Custom layers via subclassing
- Composing Decision Forest and Neural Network models
目标是 1. 创建自定义树,2. 将其嵌入自定义层,3. 将其与其他层结合到模型中。
问题在于,在第 1 步中,通过使用 RandomForestBuilder,模型被序列化和反序列化,导致对象类型为 keras.saving.saved_model.load.CoreModel
但是,第 3 步中的教程通过 tfdf.keras.RandomForestModel 嵌入树层
理想情况下,自定义层将通过在其构造函数中调用 RandomForestBuilder 来创建自定义树,但是,考虑到模型的导出和加载,这并不简单。
下面给出了输入层结构的错误,如果省略了前者,则会给出从 SavedModel 加载的没有匹配的具体函数调用的错误:
第 1 步:
builder = tfdf.builder.RandomForestBuilder(
path="/tmp/manual_model",
objective = tfdf.py_tree.objective.RegressionObjective(label='tree_result')
)
Tree = tfdf.py_tree.tree.Tree
SimpleColumnSpec = tfdf.py_tree.dataspec.SimpleColumnSpec
ColumnType = tfdf.py_tree.dataspec.ColumnType
RegressionValue = tfdf.py_tree.value.RegressionValue
NonLeafNode = tfdf.py_tree.node.NonLeafNode
LeafNode = tfdf.py_tree.node.LeafNode
NumericalHigherThanCondition = tfdf.py_tree.condition.NumericalHigherThanCondition
CategoricalIsInCondition = tfdf.py_tree.condition.CategoricalIsInCondition
tree = Tree(
NonLeafNode(
condition=CategoricalIsInCondition(
feature=SimpleColumnSpec(name='feature_name', type=ColumnType.CATEGORICAL),
mask=['class_1'],
missing_evaluation=False
),
pos_child = LeafNode(value=RegressionValue(value=0.5)),
neg_child = LeafNode(value=RegressionValue(value=0.6))
)
)
builder.add_tree(tree)
builder.close()
custom_tree = tf.keras.models.load_model("/tmp/manual_model")
第 2 步:
class CustomTree(tf.keras.layers.Layer):
def __init__(self, custom_tree):
super(CustomTree, self).__init__()
self.custom_tree = custom_tree
def call(self, inputs):
return self.custom_tree(inputs)
input_layer = tf.keras.layers.Input(shape=(None,), name='feature_name', dtype=tf.string)
output_layer = CustomTree(custom_tree)(input_layer)
model = tf.keras.models.Model(input_layer, output_layer, name='SomeModel')
model.predict(tf.data.Dataset.from_tensor_slices(
{'feature_name': ['class_1','class_2']}
).batch(1))
【问题讨论】:
标签: python tensorflow keras decision-tree