我有一个使用AutoKeras生成的模型,我想复制这个模型,这样我就可以用keras tuner构建它来做进一步的超参数调优。但我在复制模型时遇到了问题。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}
型
我的训练数据是一个 Dataframe ,它被转换为字符串类型,同时包含数值和分类数据。因为输出是softmax,所以我使用LabelBinarizer
来转换目标类。
为了确保模型被正确复制,我使用keras.clone_model
创建了模型的副本,并尝试自己训练它。但是当我尝试自己训练它时,尽管达到了500个纪元,准确性并没有提高。
在从头开始训练模型时,我是否遗漏了什么?
2条答案
按热度按时间x33g5p2x1#
AutoKeras不支持任何直接转换-它的依赖关系太内置,无法与包本身隔离。上述答案表明缺少
softmax
激活是错误的,因为确实存在:classification_head_1 (Softm
-->可能文本被截断下一篇:你注意到缺少参数了吗?
858
是一个非常小的数字-这是因为大多数层都有0
参数- Autokeras使用自定义层来构成其自定义块(更多关于their docs的块)您可以看到,要重新创建这些自定义层,您需要它们的确切代码-在撰写本文时无法隔离(尽管@haifeng-jin正在讨论它),因为它们使用特定的包来处理输入数据以及它们的NAS(Neural Architecture search)和它们执行的优化例程。
除非你能研究他们的代码和自定义层的实现并重新创建它(这本身就需要做很多工作,但并不多,因为代码已经可用了),否则如果你使用与预定义的keras层一起工作的
keras.clone_model
,这将是徒劳的尝试。这显然会导致破碎的模型(就像你现在拥有的模型)。更重要的是,
AutoKeras
可以自己进行HyperParameter调优--如果你想进一步调优你的模型,只需长时间运行AutoKeras就可以获得更好的结果。tl;dr您不能直接克隆具有包内依赖项的自定义层和块。但是如果你想做超参数调整,你可以运行更长的搜索时间来获得更好的模型。
h4cxqtbf2#
我终于解决了我的问题。奇怪的是,尽管自定义的多类别层没有参数,但它包含了自己的数据Map。为了扩展模型并检查层深度的影响,我通过从现有模型中添加多类别层来创建一个新模型。一旦我完成了这个训练,准确性就与AutoKeras相匹配。
编辑:添加以下代码:
字符串