【问题标题】:keras transferlearning predict classes working and predict not workingkeras 迁移学习预测类工作和预测不工作
【发布时间】:2020-09-07 17:44:10
【问题描述】:

我正在使用迁移学习并在“inception_v3”模型的基础上进行构建。训练似乎很顺利,我的 val_accuracy 为 0.9526。我也可以在获得新样本的预测标签之后执行 predict_class - 这似乎也很好。 但是,由于某种原因,当我尝试使用 predict 函数时,它总是在 0 到 3.31e-11 的范围内输出非常低的概率。我认为它应该输出0到1范围内的概率? 也许我做错了什么?这是一个 2 类问题,这就是我正在做的事情:


import tensorflow as tf
from tensorflow.keras.preprocessing.image import ImageDataGenerator
from tensorflow.keras.callbacks import ModelCheckpoint, ReduceLROnPlateau, EarlyStopping
from tensorflow.keras.optimizers import Adam
from tensorflow.keras import regularizers

image_size = (128,128)
batch_size = 32

train_ds = tf.keras.preprocessing.image_dataset_from_directory(
    data_dir,
    validation_split=0.2,
    subset="training",
    label_mode = 'binary',
    seed = 1337,
    image_size=image_size,
    batch_size=batch_size,
)
val_ds = tf.keras.preprocessing.image_dataset_from_directory(
    data_dir,
    validation_split=0.2,
    subset="validation",
    label_mode = 'binary',
    seed = 1337,
    image_size=image_size,
    batch_size=batch_size,
)


global_average_layer = tf.keras.layers.GlobalAveragePooling2D()
Dl_1 = tf.keras.layers.Dropout(rate = 0.2)
prediction_layer = tf.keras.layers.Dense(1,activation='sigmoid') # 120, softmax

#Add dropout Layer
model_V3 = tf.keras.Sequential([
  pre_trained_model,
  global_average_layer,
  Dl_1,
  prediction_layer
])

model_V3.compile(optimizer='adam',
              loss='binary_crossentropy',#sparse_categorical_crossentropy
              metrics=['accuracy'])

model_V3.summary()

# Callbacks

lr_reduce = ReduceLROnPlateau(monitor='val_loss', factor=0.2, patience=3, verbose=2, mode='max')
early_stop = EarlyStopping(monitor='val_loss', min_delta=0.1, patience=1, mode='min')

hist = model_V3.fit(
           augmented_train_ds.repeat(), steps_per_epoch=int(8000/batch_size), 
           epochs=10, validation_data=augmented_val_ds.repeat(), 
           validation_steps=int(2000/batch_size) , callbacks=[lr_reduce])


Ypred = model_V3.predict(val_ds)  # <--- This always returns very low probabilities. Why?

【问题讨论】:

  • 训练的结果如何?
  • 纪元 10/10 250/250 [=============================] - 预计到达时间: 0s - 损失:0.1333 - 准确度:0.9537 Epoch 00010:ReduceLROnPlateau 将学习率降低到 8.000000525498762e-06。 250/250 [==============================] - 20s 80ms/步 - 损失:0.1333 - 准确度:0.9537 - val_loss :0.1389 - val_accuracy:0.9506
  • 准确度看起来还可以。你得到了什么准确的预测?
  • 我希望在区间 [0,1] 而不是区间 [0,3.31e-11] 中的概率
  • 你的数据集平衡了吗?我的意思是0类的样本数几乎等于1类的样本数?

标签: python tensorflow machine-learning keras computer-vision


【解决方案1】:

在 Yoskutik 的帮助下,代码现在看起来如下所示并且有所改进,但我仍然不明白为什么我会得到这样的结果(请参阅下面的代码)。

在最后一个时期,我得到了这个输出

Epoch 5/5
414/414 [==============================] - ETA: 0s - loss: 0.1207 - accuracy: 0.9587
Epoch 00005: ReduceLROnPlateau reducing learning rate to 0.00020000000949949026.
414/414 [==============================] - 98s 236ms/step - loss: 0.1207 - accuracy: 0.9587 - val_loss: 0.1029 - val_accuracy: 0.9661

所以 val_accuracy:0.9661。但计算出的 roc_auc_score 显示 0.5150403105096363 并且混淆矩阵显示:

[[2094  552]
 [ 545  114]]

准确率达到 96% 的模型怎么会给出这么差的结果?

import tensorflow as tf
import os
from tensorflow import keras
from tensorflow.keras import layers
import matplotlib.pyplot as plt
from tensorflow.keras.applications.inception_v3 import InceptionV3
import numpy as np
import tensorflow as tf
from tensorflow.keras.preprocessing.image import ImageDataGenerator
from tensorflow.keras.callbacks import ModelCheckpoint, ReduceLROnPlateau, EarlyStopping
from tensorflow.keras.optimizers import Adam
from tensorflow.keras import regularizers
from sklearn.metrics import classification_report, confusion_matrix,roc_auc_score

data_dir = '/path/to_dir/'

image_size = (128,128)
target_size = (128,128)
batch_size = 32

datagen = tf.keras.preprocessing.image.ImageDataGenerator(
    zoom_range=0.2,
    shear_range=0.2,
    rotation_range=10,
    rescale=1/255,
    validation_split=0.2,
    # other things...
)

train_ds = datagen.flow_from_directory(
    data_dir,
    subset="training",
    class_mode='binary',
    target_size=target_size,
    batch_size=batch_size,
)

val_ds = datagen.flow_from_directory(
    data_dir,
    subset="validation",
    class_mode='binary',
    target_size=target_size,
    batch_size=batch_size,
)



pre_trained_model = InceptionV3(input_shape=(128,128,3),
                                include_top=False,
                                weights='imagenet')

for layer in pre_trained_model.layers:
  layer.trainable = False


global_average_layer = tf.keras.layers.GlobalAveragePooling2D()
Dl_1 = tf.keras.layers.Dropout(rate = 0.2)
prediction_layer = tf.keras.layers.Dense(1,activation='sigmoid')

model_V3 = tf.keras.Sequential([
  pre_trained_model,
  global_average_layer,
  Dl_1,
  prediction_layer
])

model_V3.compile(optimizer='adam',
                 loss='binary_crossentropy',
                 metrics=['accuracy'])

lr_reduce = ReduceLROnPlateau(monitor='val_loss', factor=0.2, patience=3, verbose=2, mode='max')

hist = model_V3.fit(
    train_ds, 
    epochs=5,
    steps_per_epoch=len(train_ds), 
    validation_data=val_ds, 
    validation_steps=len(val_ds), 
    callbacks=[lr_reduce])

y_score = model_V3.predict(val_ds)
y_pclass = model_V3.predict_classes(val_ds)
print(confusion_matrix(val_ds.classes,y_pclass))
print(roc_auc_score(val_ds.classes, y_score))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-08-19
    • 2017-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-04
    相关资源
    最近更新 更多