Python keras迁移学习预测班级工作,预测不工作

Python keras迁移学习预测班级工作,预测不工作,python,tensorflow,machine-learning,keras,computer-vision,Python,Tensorflow,Machine Learning,Keras,Computer Vision,我正在使用迁移学习,并在“inception_v3”模型的基础上进行构建。训练似乎进行得很顺利,我得到的val_精度为0.9526。我也可以做预测课后,得到新样本的预测标签-这似乎也相当好。 然而,由于某种原因,当我尝试使用预测函数时,它总是输出在0到3.31e-11范围内的非常低的概率。我认为它应该输出0到1的概率? 也许我做错了什么?这是一个两级问题,这就是我正在做的: 导入tensorflow作为tf 从tensorflow.keras.preprocessing.image导入Imag

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


导入tensorflow作为tf
从tensorflow.keras.preprocessing.image导入ImageDataGenerator
从tensorflow.keras.callbacks导入模型检查点、还原隆坪、早期停止
从tensorflow.keras.optimizers导入Adam
从tensorflow.keras导入正则化器
图像大小=(128128)
批量大小=32
训练\u ds=tf.keras.preprocessing.image\u数据集\u来自\u目录(
数据目录,
验证_分割=0.2,
subset=“培训”,
label_mode='binary',
种子=1337,
图像大小=图像大小,
批次大小=批次大小,
)
val_ds=tf.keras.preprocessing.image_数据集来自_目录(
数据目录,
验证_分割=0.2,
subset=“验证”,
label_mode='binary',
种子=1337,
图像大小=图像大小,
批次大小=批次大小,
)
全局平均层=tf.keras.layers.GlobalAveragePoolig2D()
Dl_1=tf.keras.layers.Dropout(速率=0.2)
预测层=tf.keras.layers.density(1,活化='sigmoid')120,softmax
#添加退出层
模型_V3=tf.keras.Sequential([
预先培训的模型,
全球平均层,
Dl_1,
预测层
])
模型_V3.compile(optimizer='adam',
loss='binary_Cross熵',#稀疏_Category_Cross熵
指标=[‘准确度’])
模型_V3.summary()
#回调
lr_reduce=reducelRonplation(监视器='val_loss',系数=0.2,耐心=3,详细=2,模式='max')
提前停止=提前停止(监视器='val\u loss',最小增量=0.1,耐心=1,模式='min')
hist=型号_V3.fit(
扩充序列重复(),每历元步数=int(8000/批次大小),
epochs=10,validation\u data=augmented\u val\u ds.repeat(),
验证步骤=int(2000/批量大小),回调=[lr\u reduce])

Ypred=model_V3.predict(val_ds)#在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_精度:0.9661。但计算出的roc_auc_分数显示为0.51504105096363 混淆矩阵显示:

[[2094  552]
 [ 545  114]]
一个精确率为96%的模型怎么能给出如此糟糕的结果

将tensorflow导入为tf
导入操作系统
从tensorflow进口keras
从tensorflow.keras导入图层
将matplotlib.pyplot作为plt导入
来自tensorflow.keras.applications.inception\u v3导入接收v3
将numpy作为np导入
导入tensorflow作为tf
从tensorflow.keras.preprocessing.image导入ImageDataGenerator
从tensorflow.keras.callbacks导入模型检查点、还原隆坪、早期停止
从tensorflow.keras.optimizers导入Adam
从tensorflow.keras导入正则化器
从sklearn.metrics导入分类报告、混淆矩阵、roc\U auc\U分数
数据_dir='/path/to_dir/'
图像大小=(128128)
目标大小=(128128)
批量大小=32
datagen=tf.keras.preprocessing.image.ImageDataGenerator(
缩放范围=0.2,
剪切范围=0.2,
旋转范围=10,
重新缩放=1/255,
验证_分割=0.2,
#其他事情。。。
)
列车\u ds=来自\u目录的datagen.flow\u(
数据目录,
subset=“培训”,
class_mode='binary',
目标大小=目标大小,
批次大小=批次大小,
)
val_ds=datagen.flow_来自_目录(
数据目录,
subset=“验证”,
class_mode='binary',
目标大小=目标大小,
批次大小=批次大小,
)
预先训练的模型=接收v3(输入形状=(128128,3),
include_top=False,
权重(='imagenet')
对于pre_trained_model.layers中的图层:
layer.trainable=错误
全局平均层=tf.keras.layers.GlobalAveragePoolig2D()
Dl_1=tf.keras.layers.Dropout(速率=0.2)
预测层=tf.keras.layers.density(1,活化='sigmoid')
模型_V3=tf.keras.Sequential([
预先培训的模型,
全球平均层,
Dl_1,
预测层
])
模型_V3.compile(optimizer='adam',
损失='binary\u交叉熵',
指标=[‘准确度’])
lr_reduce=reducelRonplation(监视器='val_loss',系数=0.2,耐心=3,详细=2,模式='max')
hist=型号_V3.fit(
列车,,
纪元=5,
每历元步数=len(列数),
验证数据=val\U ds,
验证步骤=len(val\u ds),
回调=[lr\u reduce])
y_分数=模型V3.预测(val_ds)
y_pclass=模型V3.预测类(val\u ds)
打印(混淆矩阵(值类,y类))
打印(roc_auc_分数(val_ds.classes,y_分数))

在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_精度:0.9661。但计算出的roc_auc_分数显示为0.51504105096363 混淆矩阵显示:

[[2094  552]
 [ 545  114]]
一个精确率为96%的模型怎么能给出如此糟糕的结果

将tensorflow导入为tf
导入操作系统
从tensorflow进口keras
从tensorflow.keras导入图层
将matplotlib.pyplot作为plt导入
来自tensorflow.keras.applications.inception\u v3导入接收v3
将numpy作为np导入
导入tensorflow作为tf
从tensorflow.keras.preprocessing.image导入ImageDataGenerator
从tensorflow.keras.callbacks导入模型检查点、还原隆坪、早期停止
从tensorflow.keras.optimizers导入Adam
从tensorflow.keras导入正则化器
从sklearn.metrics导入分类报告、混淆矩阵、roc\U auc\U分数
数据_dir='/path/to_dir/'
图像大小=(128128