在keras.applications.EfficientNetB0之前添加增强层并保留层名称

odopli94  于 2022-11-13  发布在  其他
关注(0)|答案(1)|浏览(99)

我有一个经过训练的基于EfficientNetB0的模型,其中保存了H5格式的权重。
我想在模型之前添加一些预处理层,加载权重,并重新训练它。
如果我创建一个这样的模型:

inp = tf.keras.layers.Input(shape=[224,224,3])
noise = tf.keras.layers.GaussianNoise(stddev=10.)(inp)

feature_extractor = tf.keras.applications.EfficientNetB0(include_top=False, pooling="max")
features = feature_extractor(noise)
output1 = tf.keras.layers.Dense(100, activation="sigmoid")(features)
output2 = tf.keras.layers.Dense(10, activation="softmax")(output1)

model = tf.keras.models.Model(inp, [output1, output2])

我得到这样的总结:

Layer (type)                 Output Shape              Param #   
=================================================================
input_27 (InputLayer)        [(None, 224, 224, 3)]     0         
_________________________________________________________________
gaussian_noise_13 (GaussianN (None, 224, 224, 3)       0         
_________________________________________________________________
efficientnetb0 (Functional)  (None, 1280)              4049571   
_________________________________________________________________
dense (Dense)                (None, 100)               128100    
_________________________________________________________________
dense_1 (Dense)              (None, 10)                1010

并且无法访问中间层。我不能使用tf.keras.Sequential方法,因为我的模型有两个输出。
我想保留EfficientNetB0中的图层名称,以便重新加载权重。该如何操作?

pcww981p

pcww981p1#

因此,对于我在上面创建的玩具示例,答案似乎是:

inp = tf.keras.layers.Input(shape=[224,224,3])
noise = tf.keras.layers.GaussianNoise(stddev=10.)(inp)

feature_extractor = tf.keras.applications.EfficientNetB0(input_tensor=noise, include_top=False, pooling="max")
output1 = tf.keras.layers.Dense(100, activation="sigmoid")(feature_extractor.output)
output2 = tf.keras.layers.Dense(10, activation="softmax")(output1)

model = tf.keras.models.Model(inp, [output1, output2])

然而,我实际上使用的是一个自定义模型类,它在构造函数中没有那个参数...
如果没有input_tensor参数,是否有其他方法可以实现此目的?

相关问题