我的代码(我不能更改)使用Resnet,my_input_tensor
作为input_tensor。
model1 = keras.applications.resnet50.ResNet50(input_tensor=my_input_tensor, weights='imagenet')
研究source code,ResNet50函数用my_input_tensor
创建一个新的keras输入层,然后创建模型的其余部分。这是我想用我自己的模型复制的行为。我从h5文件加载我的模型。
model2 = keras.models.load_model('my_model.h5')
因为这个模型已经有了一个输入层,所以我想用一个新的输入层来替换它,这个新的输入层是用my_input_tensor
定义的。
如何替换输入层?
7条答案
按热度按时间vawmfj5a1#
使用以下命令保存模型时:
它将保存以下内容:
1.模型的体系结构,允许创建模型。
1.模型的权重。
1.模型的训练配置(损失、优化器)。
1.优化器的状态,允许从之前离开的位置继续训练。
然后,当你加载模型时:
你应该得到相同的模型回来,你可以验证相同的使用:
现在,您可以弹出输入层并使用以下命令添加您自己的输入层:
添加新的输入层:
svdrlsy42#
Layers.pop(0)或类似的东西不起作用。
您有两个选项可以尝试:
1.
可以使用所需的图层创建新模型。
一个相对简单的方法是i)提取模型的json配置,ii)适当地更改它,iii)从中创建一个新模型,然后iv)复制权重。我只展示基本的想法。
i)提取配置
ii)更改配置
创建新模型
ii)复制权重
2.
你可以尝试像kerassurgeon这样的库(我正在链接一个与tensorflow keras版本一起工作的fork)。请注意,插入和删除操作仅在某些条件下有效,例如兼容的维度。
ippsafx73#
不幸的是,来自@MilindDeore的解决方案对我不起作用。虽然我可以打印新模型的摘要,但我在预测时收到一个“矩阵大小不兼容”错误。我想这是有道理的,因为密集层的新输入形状与旧密集层权重的形状不匹配。
因此,这里有另一个解决方案。对我来说,关键是使用“_layers”而不是“layers”。后者似乎只返回一个副本。
dsf9zpds4#
不幸的是,kerassurgeon不支持我的模型,因为我冻结了图层。我不得不对@MilindDeore的解决方案做一个小的修改-将model.layers.pop(0)替换为model._layers.pop(0),它对我有效。请注意,我在TF 2.0中使用tf.keras。
ujv3wf0j5#
对于Tensorflow 2中的tf.keras,使用tfsurgeon不起作用,因为我有自定义层。
做了什么工作是改变
layer._batch_input_size
(注意下划线)有点古怪,但还是完成了任务。
laik7k3q6#
使用
kerassurgeon
应该很容易。根据您是通过TensorFlow(tf 2.0及以上版本)使用Keras还是将Keras作为单独的库使用,它需要以不同的方式安装。对于TF中的Keras:
pip install tfkerassurgeon
(https://github.com/Raukk/tf-keras-surgeon)。对于独立Keras:pip install kerassurgeon
(https://github.com/BenWhetton/keras-surgeon)要替换输入(以TF 2.0为例;当前未测试的代码):
m528fe3b7#
对于TensorFlow 2,我们可以修改
batch_input_shape
: