添加 2 个模型作为另一个模型的输入(图表已断开连接)

问题描述 投票:0回答:1

我有两个型号,

model_A
model_B

我想对这两个模型进行元素明智加法,并将结果用作

model_C
的输入。

所以,我有这个代码:

from tensorflow.keras.layers import Conv2D, BatchNormalization, \
    Activation, Input, Add
from tensorflow.keras.models import Model
import numpy as np
import tensorflow as tf

def model_A(inputs):
    x1 = Conv2D(32, 3, padding='same')(inputs)
    x1 = BatchNormalization()(x1)
    x1 = Activation('relu')(x1)
    
    x2 = Conv2D(32, 3, padding='same')(x1)
    model = Model(inputs=inputs, outputs=x2, name='model_A')
    return model
    

def model_B(inputs):
    f1 = Conv2D(32, 3, padding='same')(inputs)
    f1 = BatchNormalization()(f1)
    f1 = Activation('relu')(f1)
    
    f2 = Conv2D(32, 3, padding='same')(f1)

    model = Model(inputs=inputs, outputs=f2, name='model_B')
    return model

def model_C(inputs):
    f1 = Conv2D(32, 3, padding='same')(inputs)
    f1 = BatchNormalization()(f1)
    f1 = Activation('relu')(f1)
    
    f2 = Conv2D(16, 3, padding='same')(f1)
    f2 = BatchNormalization()(f2)
    f2 = Activation('relu')(f2)

    f3 = Conv2D(1, 3,  padding='same')(f2)

    model = Model(inputs=inputs, outputs=f3, name='model_C')
    return model
    
def model_final(height, width, channels):
    inputs = Input((height, width, channels))
    
    modelA = model_A(inputs)
    modelB = model_B(inputs)
    
    addition = Add()([modelA.output, modelB.output])
    
    modelC = model_C(addition)
    
    return Model(inputs, modelC.output)
    
a = np.random.uniform(0, 1, (100, 32, 32, 3))
b = np.random.uniform(0, 1, (100, 32, 32, 3))
c = np.random.uniform(0, 1, (100, 32, 32, 3))
    
model = model_final(32, 32, 3)

optimizer = tf.keras.optimizers.Adam(learning_rate=0.0001)
model.compile(optimizer=optimizer,
              loss='mae',
              metrics=['mae'])
    

如果我运行代码,我会在

Graph disconnected
处收到
Model(inputs=inputs, outputs=f3, name='model_C')

所以,为了解决这个问题,我正在做:

def model_final(height, width, channels):
    inputs = Input((height, width, channels))
    
    modelA = model_A(inputs)
    modelB = model_B(inputs)
    
    addition = Add()([modelA.output, modelB.output])
    
    inputs_C = Input((height, width, 32))
    modelC = model_C(inputs_C)
    modelC = modelC(addition)
    
    model = Model(inputs, modelC)
    return model

编译得很好。

但是,我不确定这是否正确。如果这样做的逻辑是正确的!

tensorflow machine-learning deep-learning tensorflow2.0
1个回答
0
投票

除了函数

model_C
不返回任何内容之外,这应该没有问题。

但是在保存/加载这样的复合模型时可能会遇到一些困难。

如果您不打算分别训练模型 A 和模型 B,您可以(不一定)使函数

model_A
model_B
仅返回输出张量
x2
f2
,而不是创建子模型。这应该会让事情变得更容易。

如果您选择此选项,那么:

def model_final(height, width, channels):
    inputs = Input((height, width, channels))
    
    x2 = model_A(inputs)
    f2 = model_B(inputs)
    
    addition = Add()([x2, f2])
    
    outputs = model_C(addition)
    
    model = Model(inputs, outputs)
    return model

所以,简而言之:

  • 如果你想要子模型(主要用于单独训练它们,交替训练选项等),你可以让你的函数返回模型,你的解决方案应该没问题
  • 如果您不打算拥有单独的模型,请使函数返回张量而不是模型,并创建一个整体模型
© www.soinside.com 2019 - 2024. All rights reserved.