如何在 Keras 中将顺序模型添加到预训练模型?

Posted

技术标签:

【中文标题】如何在 Keras 中将顺序模型添加到预训练模型?【英文标题】:How do I prepend a sequential model to a pretrained model in Keras? 【发布时间】:2020-01-18 21:10:44 【问题描述】:

我想在 nasnet_mobile 这样的预训练模型前面放置一个 4 层密集网络。我已经尝试了几种不同的方法,但它们都让人头疼(又名错误)。在 keras+tensorflow2 中执行此操作的方法是什么?

想法:

是否有一些“标志”我必须将 Dense 的输出指定为整数或图片? 预训练模型中是否存在一些“标志”,我必须允许它连接?

我是否需要手动克隆预训练的,用预训练的权重加载它,然后尝试上述方法之一;也许预训练的与创建的课程不同? (更新)如果我正在复制,有没有一种简单的方法可以确保我得到相同的结构,以便当我有 set_weights(get_weights(...)) 时它不会出错?

以上都不是……

代码:

#LIBRARIES
import numpy as np
from tensorflow import keras
from tensorflow.keras.models import Sequential, Model
from tensorflow.keras.layers import Dense, Reshape, Conv2D, MaxPool2D , Flatten, Input


my_input_shape = (224,224,3)

#DENSE MODEL
my_inputs = Input(shape=my_input_shape)

hidden_1 = Dense(units=8, activation='relu')(my_inputs)


#make the output layer
hidden_2= Dense(units=np.product(my_input_shape), 
                           activation='sigmoid')(hidden_1)

transformed = keras.layers.Reshape(my_input_shape,)(hidden_2)  

dense_model = Model(inputs=my_inputs, outputs=transformed)

#PRETRAINED MODEL
pretrained_model = keras.applications.nasnet.NASNetMobile(weights = 'imagenet', 
                                                            include_top = False,
                                                            input_shape=my_input_shape)

#Option 1
combined_model_1 = keras.applications.nasnet.NASNetMobile(weights = 'imagenet', 
                                                            include_top = False,
                                                            input_tensor=transformed)

#Option 2
combined_model_2 = Model(inputs=dense_model.input, outputs=pretrained_model.output)

#Option 3a
combined_model_3a = keras.applications.nasnet.NASNetMobile(weights = 'imagenet', 
                                                            include_top = False,
                                                            input_tensor=my_input_shape)(dense_model)
#Option 3b
combined_model_3b = keras.applications.nasnet.NASNetMobile(weights = 'imagenet', 
                                                            include_top = False)(dense_model)

#Option 4
combined_model_4 = keras.applications.nasnet.NASNetMobile(weights = 'imagenet', 
                                                            include_top = False,
                                                            input_tensor=dense_model)

问题: 鉴于上述代码,我想将 Dense 模型菊花链到预训练模型前面。我想将图像输入密集,让它通过密集传播,然后成为预训练的输入,并通过预训练。

【问题讨论】:

如果您提供完整的代码示例,我们可能会提供帮助。到目前为止,我看不出你在哪里做错了,但对我来说很明显你做错了。 如果我有相关但可能“难闻”的演示代码,可以吗? 是的,当然,任何重现问题的代码 已更新。这足够了吗?我有 5 种左右不同的方法,这不起作用。我不想让它不起作用。我想让它工作。 ;) 如果有任何似乎特别有希望“复活”的失败模式,请告诉我,我会尝试适当更新。 它已更新,除了选项 5 中令人筋疲力尽的重新创建代码。 【参考方案1】:

为什么不这样做:

inp = Input(shape=my_input_shape)
x = dense_model(inp)
x = pretrained_model(x)

final_model = Model(inp, x)

【讨论】:

我试了一下,看起来它没有出错。给我大约 10 分钟,如果更大的代码没有失败,那么你就做到了。再次感谢您的帮助和时间。

以上是关于如何在 Keras 中将顺序模型添加到预训练模型?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Keras / Tensorflow 中将(无,)批量维度重新引入张量?

Keras如何改变加载模型的可训练层

keras中的级联模型(自动编码器+分类器)

向 keras 顺序模型添加调整大小层

尝试在 Keras 中加载顺序模型时出现“KeyError:0”

如何在keras tensorflow中将图像作为输入并获取另一个图像作为输出