代码之家  ›  专栏  ›  技术社区  ›  George

应在至少包含2个输入的列表上调用“Concatenate”层`

  •  0
  • George  · 技术社区  · 4 年前

    我创建了一个模型,它接受一个输入层,并生成两个输出层。

     model = Model(inputs=efficient_net.input, outputs=[reg_pred, class_pred])
    

    我正在训练模型,接收结果并将模型的2个实例保存为两个实例。h5档案。

    model_weights = []
    for item in os.listdir(packages_root):
        if ".h5" in item:
            model_weights.append(item)
    

    所以,我有 ['model_2.h5', 'model_1.h5']

    def ensemble(models, model_input):
        
        Models_output = [model(model_input) for model in models]
        Avg = Average()(Models_output)
        
        ensemble = Model(inputs=model_input, outputs=Avg, name='ensemble')
        ensemble.summary()
        ensemble.compile(Adam(lr=.0001), loss=loss, metrics=metrics)
        
        return ensemble
    

    那么我会:

    model_input = Input(shape=models[0].input_shape[1:])
    

    其中: <KerasTensor: shape=(None, 32, 32, 3) dtype=float32 (created by layer 'input_12')>

    ensemble_model = ensemble(models, model_input)
    

    这给了我:

    ValueError: A merge layer should be called on a list of inputs.

    Avg = Average()(Models_output) .

    因此,我试图做到:

    def ensemble(models, model_input):
        
        Models_output = []
        for model in models:
            Models_output.append(model(model_input))
            
        # Concatenate the 2 output layers
        Conc = Concatenate()([Models_output[0], Models_output[1])
        Avg = Average()(Conc)
        
        ensemble = Model(inputs=model_input, outputs=Avg, name='ensemble')
        ensemble.summary()
        ensemble.compile(Adam(lr=.0001), loss=loss, metrics=metrics)
        
        return ensemble
    

    现在我知道了:

    ValueError: A 连接 layer should be called on a list of at least 2 inputs

    print(Models_output) ,提供:

    [[<KerasTensor: shape=(None, 4) dtype=float32 (created by layer 'model_1')>, <KerasTensor: shape=(None, 2) dtype=float32 (created by layer 'model_1')>],
    
     [<KerasTensor: shape=(None, 4) dtype=float32 (created by layer 'model_2')>, <KerasTensor: shape=(None, 2) dtype=float32 (created by layer 'model_2')>]]
    
    0 回复  |  直到 4 年前
        1
  •  1
  •   Marco Cerliani    4 年前

    错误是因为您调用了 Average reg_pred , class_pred ).

    平均的

    这里是一个虚拟示例,其中我们拟合2个模型以产生2个输出:

    X = np.random.uniform(0,1, (64,28,28,1))
    y = np.random.randint(0,2, 64)
    
    def get_model():
        inp = Input((28,28,1))
        reg_pred = Dense(1)(inp)
        class_pred = Dense(2, activation='softmax')(Flatten()(inp))
        model = Model(inp, [reg_pred, class_pred])
        model.compile('adam', ['mse', 'sparse_categorical_crossentropy'])
        return model
    
    model1 = get_model()
    model1.fit(X,[X,y])
    model2 = get_model()
    model2.fit(X,[X,y])
    

    您的集成函数会产生错误:

    def ensemble(models, model_input):
        
        Models_output = [model(model_input) for model in models]
        Avg = Average()(Models_output)
        
        ensemble = Model(inputs=model_input, outputs=Avg, name='ensemble')
        ensemble.compile('adam', ['mse', 'sparse_categorical_crossentropy'])
        
        return ensemble
    
    model_input = Input((28,28,1))
    models = [model1, model2]
    model_ensemble = ensemble(models, model_input)
    

    def ensemble(models, model_input):
        
        output_reg = []
        output_class = []
        for model in models:
            out_reg, out_class = model(model_input)
            output_reg.append(out_reg)
            output_class.append(out_class)
        avg_reg = Average()(output_reg)
        avg_class = Average()(output_class)
        
        ensemble = Model(inputs=model_input, outputs=[avg_reg, avg_class], name='ensemble')
        ensemble.compile('adam', ['mse', 'sparse_categorical_crossentropy'])
        
        return ensemble
    
    model_input = Input((28,28,1))
    models = [model1, model2]
    model_ensemble = ensemble(models, model_input)
    
    推荐文章