评估两个输入和一个输出模型 tensorflow

evaluating two inputs and one output model tensorflow

我正在尝试评估具有 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'> 

尝试像这样调用 evaluate():

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

然后你可以像这样得到指标的名称:

dict(zip(model.metrics_names, result))

我的猜测是你的模型抱怨是因为你正在提供一个 dict/list 的迭代器,每个迭代器产生一个图像,而不是提供一个产生图像两次的迭代器(每个一次模型)。

如果将 DirectoryIterator 包装在可以正确提供数据的生成器上会发生什么?

def gen_itertest(test_dir):
    test_set = test_datagen.flow_from_directory(test_dir,
                                            class_mode = 'categorical',
                                            batch_size = 16, 
                                            target_size=(150,150))
    for i in range(len(test_set)):
         x = test_set.next()
         yield [x[0], x[0]], x[1] # Twice the input, only once the label

然后你可以将其提供给评估

testset = gen_itertest('D:\Graduation_project\Damage type not collected')
result = model.evaluate(testset)

我不确定这是否有效,但因为您没有向我们提供 minimal, reproducible example,我不会做一个来测试它。