Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Tensorflow 使用if-else组合两个网络_Tensorflow_Keras - Fatal编程技术网

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上崩溃(由于遗留原因,我一直在使用它)。一旦我确认它正在执行我希望它执行的操作,我会将其标记为已解决。