评估两个输入和一个输出模型张量流

时间:2021-05-20 11:16:07

标签: tensorflow keras deep-learning pre-trained-model ensemble-learning

我正在尝试评估具有 2 个输入和 1 个输出的模型,每个输入进入单独的预训练模型,然后两个模型的输出得到平均。我对两个输入使用相同的数据。

test_dir = 'D:\Graduation_project\Damage type not collected'



test_datagen = tf.keras.preprocessing.image.ImageDataGenerator(rescale=1./255,)




test_set = test_datagen.flow_from_directory(test_dir,
                                            class_mode = 'categorical',
                                            batch_size = 16, 
                                            target_size=(150,150))

test_set1 = test_datagen.flow_from_directory(test_dir,
                                            class_mode = 'categorical',
                                            batch_size = 16, 
                                            target_size=(150,150))

加载第一个模型并重命名层

def load_dense_model():
    densenet = tf.keras.models.load_model('D:\Graduation_project\saved models\damage_type_model.h5', compile=False)
    
    for i, layer in enumerate(densenet.layers):
        layer._name = 'Densenet_layer' + str(i)
    return densenet
 

加载第二个模型

def load_vgg19_model():
    vgg19 = tf.keras.models.load_model('D:\Graduation_project\saved models\damage_type_VGG19.h5', compile=False)
     
    return vgg19

创建集成模型

def ensamble_model(first_model, second_model):
    densenet = first_model()
    vgg19 = second_model()

    output_1 = densenet.get_layer('Densenet_layer613')
    output_2 = vgg19.get_layer('dense_4')
    
    avg = tf.keras.layers.Average()([output_1.output, output_2.output])
    
    
    model = Model(inputs=[densenet.input, vgg19.input], outputs=avg)
    
    return model

METRICS = [ 
     'accuracy',
      tf.metrics.TruePositives(name='tp'),
      tf.metrics.FalsePositives(name='fp'),
      tf.metrics.TrueNegatives(name='tn'),
      tf.metrics.FalseNegatives(name='fn'), 
      tf.metrics.Precision(name='precision'),
      tf.metrics.Recall(name='recall'),
      tfa.metrics.F1Score(name='F1_Score', num_classes=5),
      tfa.metrics.MultiLabelConfusionMatrix(num_classes=5)
 
]

model = ensamble_model(load_dense_model, load_vgg19_model)

编译和评估模型

model.compile(optimizer = 'adam' , loss ='binary_crossentropy', 
                  metrics = 'accuracy')

model.evaluate({'Densenet_layer0':test_set1, 'input_2':test_set})

evaluate() 无法运行

ValueError: Failed to find data adapter that can handle input: (<class 'dict'> containing {"<class 'str'>"} keys and {"<class 'tensorflow.python.keras.preprocessing.image.DirectoryIterator'>"} values), <class 'NoneType'> 

1 个答案:

答案 0 :(得分:0)

尝试像这样调用评估():

result = model.evaluate(x=[test_set1, test_set])

然后您可以通过执行以下操作获得指标的名称:

dict(zip(model.metrics_names, result))