问题描述
例如,如果我加载其他人的模型,这就是我看到的:
model = Sequential()
model.add(Conv2D(32,kernel_size=(3,3),activation='relu',input_shape=input_shape))
model.add(Conv2D(64,(3,activation='relu'))
... etc
并不是说以上说法是正确的,但我想知道是否有办法以物理方式在代码中重建模型,包括所有激活函数?
这怎么办?
解决方法
如果您保存的模型具有完整的架构及其训练状态。即您使用了类似的东西。
model.save('myfirstmodel.h5')
您可以使用
pprint(model.to_json())
pprint(model.to_yaml())
json的输出:
('{"class_name": "Sequential","config": {"name": "sequential","layers": '
'[{"class_name": "InputLayer","config": {"batch_input_shape": [null,13],'
'"dtype": "float32","sparse": false,"ragged": false,"name": "d1_input"}},'
'{"class_name": "Dense","config": {"name": "d1","trainable": true,'
'"batch_input_shape": [null,"dtype": "float32","units": 4,'
'"activation": "relu","use_bias": true,"kernel_initializer": {"class_name": '
'"Ones","config": {}},"bias_initializer": {"class_name": "Zeros","config": '
'{}},"kernel_regularizer": null,"bias_regularizer": null,'
'"activity_regularizer": null,"kernel_constraint": null,"bias_constraint": '
'null}},{"class_name": "Dense","config": {"name": "d2","units": 6,"activation": "relu",'
'"kernel_initializer": {"class_name": "GlorotUniform","config": {"seed": '
'null}},'
'"kernel_regularizer": null,{"class_name": "Dropout","config": {"name": "dropout","trainable": '
'true,"rate": 0.2,"noise_shape": null,"seed": null}},"config": {"name": "out","units": 2,"activation": "sigmoid","bias_constraint": '
'null}}]},"keras_version": "2.4.0","backend": "tensorflow"}')
但是,如果您的冻结模型无法正常使用,则可以使用netron查看模型的结构。 它显示了逐层体系结构以及使用的激活函数,参数及其权重。您可以将这些权重下载为NumPy数组。
您可以使用Netron来找到模型的结构以及权重。使用此结构信息,您可以重建模型。
请参见Link。
,您可以使用model.get_config()
来获取重新实例化同一模型所需的所有信息中的dict
(至少从理论上讲,因为这取决于模型中的每个层是否具有正确的get_config
方法本身,在历史上并非总是如此。
如果您导入的模型行为良好,那么您甚至可以仅通过执行以下操作即可创建克隆模型
new_model = tf.keras.Model.from_config(model.get_config())
这并不总是可行的,因此通常,您可以从model.get_config()
开始检查模型的详细信息。
答案是否。 tf或Keras中无法从模型文件或YAML或JSON获取代码表示形式。但是可以,您可以编写一段代码来完成此工作。应该很容易。如果您按照以下方式保存模型:
model.to_yaml()
它将保存您的模型配置以及激活功能。您要做的所有事情就是一步一步地遍历各层并添加该层的代码表示形式。但是损失功能可能对您来说是个问题。
顺便说一句,如果要重新训练保存的模型,则不需要代码结构。您所能做的就是装载和训练。只是不要冻结任何层。它将重新训练并更新所有路径权重。