Tensorflow 使用if-else组合两个网络
我有两个网络Tensorflow 使用if-else组合两个网络,tensorflow,keras,Tensorflow,Keras,我有两个网络ModelUp和modelown,它们采用相同的输入x1,x2,其中x1是10个特征,x2是每个样本的单个数字。我想要一个combinedModel网络,它可以: if x2>=1: return ModelUp([x1,x2]) else: return ModelDown([x1,x2]) 一旦对ModelUp和modelown进行了单独培训,则不需要对combinedModel进行培训 如何在tensorflow.keras(tensorflow版本为1
ModelUp
和modelown
,它们采用相同的输入x1,x2
,其中x1
是10个特征,x2
是每个样本的单个数字。我想要一个combinedModel
网络,它可以:
if x2>=1:
return ModelUp([x1,x2])
else:
return ModelDown([x1,x2])
一旦对ModelUp
和modelown
进行了单独培训,则不需要对combinedModel
进行培训
如何在
tensorflow.keras
(tensorflow版本为1.12.0
)中进行此组合?以下代码将是一个选项。您需要检查它是否适用于您的用例
from tensorflow.keras.layers import Input
from tensorflow.keras.models import Model
import tensorflow.keras.backend as K
def combineModels(ModelUp, ModelDown):
input1 = Input(shape=(10,))
input2 = Input(shape=(1,))
#
selectModel1 = K.cast(K.greater_equal(input2, 1), dtype='float32')
selectModel2 = K.cast(K.less(input2, 1), dtype='float32')
#
out = ModelUp([input1,input2]) * selectModel1 + ModelDown([input1,input2]) * selectModel2
model = Model(inputs=[input1,input2], outputs=out)
return model
combinedModel = combineModels(ModelUp, ModelDown)
对于Tensorflow 1:
from tensorflow.keras.layers import Input, Lambda, Multiply, Add
from tensorflow.keras.models import Model
import tensorflow.keras.backend as K
def combineModels(ModelUp, ModelDown):
input1 = Input(shape=(10,))
input2 = Input(shape=(1,))
#
selectModel1 = Lambda(lambda x: K.greater_equal(x, K.constant(1.))) (input2)
selectModel2 = Lambda(lambda x: K.less(x, K.constant(1.)))(input2)
#
selectModel1 = Lambda(lambda x: K.cast(x, dtype='float32'))(selectModel1)
selectModel2 = Lambda(lambda x: K.cast(x, dtype='float32'))(selectModel2)
#
out1 = Multiply()([ModelUp([input1,input2]), selectModel1])
out2 = Multiply()([ModelDown([input1,input2]), selectModel2])
out = Add()([out1, out2])
model = Model(inputs=[input1,input2], outputs=out)
return model
combinedModel = combineModels(ModelUp, ModelDown)
嗨,Max,我不得不将其更改为
Input(shape=(10,),)
,但我仍然得到错误:ValueError:模型的输出张量必须是TensorFlow`Layer`的输出(因此保存过去的层元数据)。在创建Model.Hi的最后一步中找到:Tensor(“add:0”,shape=(?,1),dtype=float32)
。好的,很抱歉,这可能是与Tensorflow 1相关的问题(我没有您的确切版本,因此无法复制。您可以尝试使用我上面添加的第二个解决方案,它在整个过程中使用层。通常,我建议切换到Tensorflow 2。嘿,感谢Lambda
层,它不会在TF1上崩溃(由于遗留原因,我一直在使用它)。一旦我确认它正在执行我希望它执行的操作,我会将其标记为已解决。