model.evaluate() 和 model.predict() 返回非常不同的结果

问题描述

这是我模型的架构:

def generate_network_2 (lr = 3e-3,drop = 0.4):
  
  
  #filters = 64
  model = keras.models.Sequential()
  model.add(keras.layers.Conv2D(64,kernel_size = 5,strides = 2,activation = 'relu',padding = "same",input_shape = (312,312,3)))
  model.add(keras.layers.normalization.Batchnormalization())
  model.add(keras.layers.MaxPooling2D((2,2),padding = "same"))
  model.add(keras.layers.normalization.Batchnormalization())
  
  model.add(keras.layers.Conv2D(128,kernel_size = 3,activation="relu",padding = "same"))         
  model.add(keras.layers.normalization.Batchnormalization())
  model.add(keras.layers.Conv2D(128,padding = "same"))          
  model.add(keras.layers.normalization.Batchnormalization())
  model.add(keras.layers.MaxPooling2D((2,padding = "same"))
  model.add(keras.layers.normalization.Batchnormalization())
  
  model.add(keras.layers.Conv2D(256,padding = "same"))          
  model.add(keras.layers.normalization.Batchnormalization())
  model.add(keras.layers.Conv2D(256,padding = "same"))        
  model.add(keras.layers.normalization.Batchnormalization())
  model.add(keras.layers.MaxPooling2D((2,padding = "same"))
  model.add(keras.layers.normalization.Batchnormalization())
 
  model.add(keras.layers.Flatten())
  model.add(keras.layers.normalization.Batchnormalization())
  model.add(keras.layers.Dense(64,activation = "relu"))
  model.add(keras.layers.Dropout(drop))
  model.add(keras.layers.normalization.Batchnormalization())
  model.add(keras.layers.Dense(16,activation = "relu"))
  model.add(keras.layers.Dropout(drop))
  model.add(keras.layers.normalization.Batchnormalization())
  model.add(keras.layers.Dense(3,activation = "softmax"))

  optimizer = keras.optimizers.Adam(learning_rate = lr)
  

  model.compile(loss='categorical_crossentropy',optimizer=optimizer,metrics=['accuracy'])
                
  return model

当我在验证数据集上运行 model.evaluate 时,我获得了 69% 的准确率。但是,当我使用 model.predict 手动计算准确度和混淆矩阵时,我得到了 ~ 31%

model.evaluate(valid_gen)

4/4 [==============================] - 2 秒 506 毫秒/步 - 损失:0.7732 - 准确度: 0.6917 [0.773181676864624,0.6916666626930237]

def print_cm(cm,labels):
    """pretty print for confusion matrixes"""
    columnwidth = max([len(x) for x in labels])
    # Print header
    print(" " * columnwidth,end="\t")
    for label in labels:
        print("%{0}s".format(columnwidth) % label,end="\t")
    print()
    # Print rows
    for i,label1 in enumerate(labels):
        print("%{0}s".format(columnwidth) % label1,end="\t")
        for j in range(len(labels)):
            print("%{0}d".format(columnwidth) % cm[i,j],end="\t")
        print()

pred = np.argmax(model.predict(valid_data),axis=-1)
actual = valid_data.classes
cm = confusion_matrix(actual,pred)
print('Confusion Matrix')
print_cm(cm,["0","1","2"]) 

混淆矩阵 0 1 2
0 9 12 15
1 8 16 14
2 12 19 15

                 Classification Report
           precision    recall  f1-score   support

       0       0.31      0.25      0.28        36
       1       0.34      0.42      0.38        38
       2       0.34      0.33      0.33        46

accuracy                           0.33       120

宏观平均值 0.33 0.33 0.33 120 加权平均 0.33 0.33 0.33 12

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)