Python Keras CNN的准确度要么是静态的,要么对图像分类来说太高

Python Keras CNN的准确度要么是静态的,要么对图像分类来说太高,python,tensorflow,keras,deep-learning,conv-neural-network,Python,Tensorflow,Keras,Deep Learning,Conv Neural Network,我正在尝试实现一个卷积神经网络,可以检测一个人是否戴眼镜。不幸的是,无论我对学习速率、特定优化器等使用哪种精确设置,我都会得到非常奇怪的结果。在大多数设置中,我注意到我的模型的精度在第二个历元后不会改变,并且停留在0.56左右(这接近于一个标签2700张图像与另一个标签2200张图像的比率)。在其他运行中,在设置稍有不同的情况下,准确度突然上升到0.9左右并不断增加。然而,在这两种情况下,模型每次预测的分类都完全相同(“带眼镜”)(即使是在培训/验证集中的图像上),始终具有100%的置信水平(每

我正在尝试实现一个卷积神经网络,可以检测一个人是否戴眼镜。不幸的是,无论我对学习速率、特定优化器等使用哪种精确设置,我都会得到非常奇怪的结果。在大多数设置中,我注意到我的模型的精度在第二个历元后不会改变,并且停留在0.56左右(这接近于一个标签2700张图像与另一个标签2200张图像的比率)。在其他运行中,在设置稍有不同的情况下,准确度突然上升到0.9左右并不断增加。然而,在这两种情况下,模型每次预测的分类都完全相同(“带眼镜”)(即使是在培训/验证集中的图像上),始终具有100%的置信水平(每次标签正好为1)

我对用于图像分类的神经网络没有太多经验,因此我不太确定如何解决这个问题。我尝试从数据集中打印一些值及其各自的标签,标签确实包含两个标签(0和1)因此,我认为这可能是我的模型的一个问题,但我自己不能真正弄清楚。我尝试过不同的优化器(Adam,SGD),越来越小的学习率,不同的动量值,更少/更多的卷积层,填充和内核初始化器的不同参数,不同的批量大小…它仍然停留在快速提高精度或静态精度上

我的代码如下所示:

#参数
批量大小=16
img_高度=180
img_宽度=180
num_classes=2
纪元=10
#训练数据
训练\u db=tf.keras.preprocessing.image\u数据集\u来自\u目录(
`D:\archive\faces\`,
验证_分割=0.2,
subset=“培训”,
种子=123,
图像大小=(图像高度,图像宽度),颜色模式=“灰度”,
批次大小=批次大小)
#验证数据
val_db=tf.keras.preprocessing.image_数据集来自_目录(
`D:\archive\faces\`,
验证_分割=0.2,
subset=“验证”,
种子=123,
图像大小=(图像高度,图像宽度),颜色模式=“灰度”,
批次大小=批次大小)
#加快模型训练
自动调谐=tf.data.experimental.AUTOTUNE
train\u db=train\u db.cache().shuffle(1000).预取(缓冲区大小=自动调谐)
val_db=val_db.cache().预取(缓冲区大小=自动调谐)
#建立模型
模型=顺序([
层。实验。预处理。重缩放(1./255),
layers.Conv2D(16,(3,3),activation='relu',input_shape=(img_宽度,img_高度,1),kernel_初始化器='he_uniform',padding='same'),
层。MaxPoolig2D(2,2),
layers.Conv2D(32,(3,3),activation='relu',kernel\u initializer='he\u uniform',padding='same'),
层。MaxPoolig2D(2,2),
clayers.Conv2D(64,(3,3),activation='relu',kernel\u initializer='he\u uniform',padding='same'),
层。MaxPoolig2D(2,2),
clayers.Conv2D(64,(3,3),activation='relu',kernel\u initializer='he\u uniform',padding='same'),
层。MaxPoolig2D(2,2),
clayers.Conv2D(64,(3,3),activation='relu',kernel\u initializer='he\u uniform',padding='same'),
层。MaxPoolig2D(2,2),
层。展平(),
密集层(512,激活='relu',内核初始化器='he_uniform'),
层。致密(1,激活='s形')
])
#不同的优化器选项
opt=tf.keras.optimizers.SGD(学习率=0.001,动量=0.9)
opt2=tf.keras.optimizers.Adam(学习率=0.001)
#编译模型
model.compile(
优化器=opt,
loss=tf.loss.BinaryCross熵(),
度量(精确性)
#训练模型
模型拟合(训练数据库,验证数据=val数据库,历元数=历元数)

因为您使用的是loss=tf.loss.BinaryCrossentropy(),所以在\u目录中的image\u dataset\u中,您需要为train\u db和val\u db添加标签\u mode='binary'。对于val\u db add shuffle=False

我尝试添加此项,但不幸的是没有效果。看起来有区别的是使用了更少的数据量(实际数据集的10%),现在它实际预测的值介于0和1之间。请尝试在model.fit中添加batch_size=batch_size