问题复制 AutoKeras StructuredDataClassifier

Issue replicating AutoKeras StructuredDataClassifier

我有一个使用 AutoKeras 生成的模型,我想复制该模型,以便我可以使用 keras 调谐器构建它以进行进一步的超参数调优。但我 运行 陷入复制模型的问题。 autokeras模型的模型总结为:

Model: "model"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
input_1 (InputLayer)         [(None, 11)]              0         
_________________________________________________________________
multi_category_encoding (Mul (None, 11)                0         
_________________________________________________________________
normalization (Normalization (None, 11)                23        
_________________________________________________________________
dense (Dense)                (None, 16)                192       
_________________________________________________________________
re_lu (ReLU)                 (None, 16)                0         
_________________________________________________________________
dense_1 (Dense)              (None, 32)                544       
_________________________________________________________________
re_lu_1 (ReLU)               (None, 32)                0         
_________________________________________________________________
dense_2 (Dense)              (None, 3)                 99        
_________________________________________________________________
classification_head_1 (Softm (None, 3)                 0         
=================================================================
Total params: 858
Trainable params: 835
Non-trainable params: 23

图层配置

{'batch_input_shape': (None, 11), 'dtype': 'string', 'sparse': False, 'ragged': False, 'name': 'input_1'}
{'name': 'multi_category_encoding', 'trainable': True, 'dtype': 'float32', 'encoding': ListWrapper(['int', 'int', 'int', 'int', 'int', 'int', 'int', 'int', 'int', 'int', 'int'])}
{'name': 'normalization', 'trainable': True, 'dtype': 'float32', 'axis': (-1,)}
{'name': 'dense', 'trainable': True, 'dtype': 'float32', 'units': 16, 'activation': 'linear', 'use_bias': True, 'kernel_initializer': {'class_name': 'GlorotUniform', 'config': {'seed': None}}, 'bias_initializer': {'class_name': 'Zeros', 'config': {}}, 'kernel_regularizer': None, 'bias_regularizer': None, 'activity_regularizer': None, 'kernel_constraint': None, 'bias_constraint': None}
{'name': 're_lu', 'trainable': True, 'dtype': 'float32', 'max_value': None, 'negative_slope': array(0., dtype=float32), 'threshold': array(0., dtype=float32)}
{'name': 'dense_1', 'trainable': True, 'dtype': 'float32', 'units': 32, 'activation': 'linear', 'use_bias': True, 'kernel_initializer': {'class_name': 'GlorotUniform', 'config': {'seed': None}}, 'bias_initializer': {'class_name': 'Zeros', 'config': {}}, 'kernel_regularizer': None, 'bias_regularizer': None, 'activity_regularizer': None, 'kernel_constraint': None, 'bias_constraint': None}
{'name': 're_lu_1', 'trainable': True, 'dtype': 'float32', 'max_value': None, 'negative_slope': array(0., dtype=float32), 'threshold': array(0., dtype=float32)}
{'name': 'dense_2', 'trainable': True, 'dtype': 'float32', 'units': 3, 'activation': 'linear', 'use_bias': True, 'kernel_initializer': {'class_name': 'GlorotUniform', 'config': {'seed': None}}, 'bias_initializer': {'class_name': 'Zeros', 'config': {}}, 'kernel_regularizer': None, 'bias_regularizer': None, 'activity_regularizer': None, 'kernel_constraint': None, 'bias_constraint': None}
{'name': 'classification_head_1', 'trainable': True, 'dtype': 'float32', 'axis': -1}

我的训练数据是一个数据框,它被转换为包含数字和分类数据的字符串类型。由于输出是 softmax 我使用 LabelBinarizer 转换目标 类.

为了确保模型被正确复制,我使用 keras.clone_model 创建了模型的副本并尝试自己训练它。但是当我尝试自己训练它时,尽管达到了 500 个纪元,但准确性并没有提高。

从头开始训练模型时,我是否遗漏了什么?

AutoKeras 不支持任何直接转换 - 它的依赖项过于内建,无法与包本身隔离。上面的答案表明缺少 softmax 激活是错误的,因为确实存在:

classification_head_1 (Softm --> 可能文本得到了 t运行cated

接下来 - 您注意到缺少参数了吗? 858 是一个非常小的数字 - 这是因为大多数层都有 0 参数 - Autokeras 使用自定义层来构成他们的自定义块(更多关于他们的块来自 their docs

您可以看到,要重新创建这些自定义层,您需要它们的确切代码——在撰写本文时无法将其隔离(尽管@haifeng-jin 正在讨论),因为有特定的他们用来处理输入数据的软件包以及他们的 NAS (Neural Architecture search) 的动力和他们执行的优化例程。

除非你能研究他们的代码和自定义层的实现并重新创建它(这本身会是相当多的工作,但因为代码已经可用所以工作量不大),否则这将是徒劳的尝试,如果你使用 keras.clone_model 与预定义的 keras 层一起使用。这显然会导致模型损坏(就像您目前拥有的模型)。

更重要的是,AutoKeras 会自行调整超参数 - 如果您想进一步调整模型,只需 运行 AutoKeras 更长时间以获得更好的结果。

tl;dr you can't clone custom layers and blocks with in-package dependencies directly. But if you want to do Hyperparameter tuning, you can run the search for much longer to get a better model.

我终于能够解决我的问题了。这很奇怪,但即使自定义多类别层没有参数,它也包含自己的数据映射。为了扩展模型并检查层深度的影响,我通过添加现有模型的多类别层创建了一个新模型。一旦我做了这个训练精度匹配 AutoKeras。

编辑:添加以下代码:

from tensorflow import keras
inputs = keras.layers.Input(shape=(11,), dtype='string')
x = base_model.layers[1](inputs)
x = base_model.layers[2](x)

x = keras.layers.Dense(176)(x)
x = keras.layers.ReLU()(x)
x = keras.layers.Dense(400)(x)
x = keras.layers.ReLU()(x)
x = keras.layers.Dense(464)(x)
x = keras.layers.ReLU()(x)
x = keras.layers.Dense(3)(x)
x = keras.layers.Softmax()(x)

layer_3 = keras.Model(inputs, x)

where the index is for the multicategorical layer.