我有两个型号,
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
编译得很好。
但是,我不确定这是否正确。如果这样做的逻辑是正确的!
除了函数
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
所以,简而言之: