Tensorflow 在keras图像分类中,当损失减少时,验证精度不变?

Tensorflow 在keras图像分类中,当损失减少时,验证精度不变?,tensorflow,keras,deep-learning,image-classification,Tensorflow,Keras,Deep Learning,Image Classification,我有两类图像 伪造的 真实的 数据集拆分详细信息如下 共训练假图像3457张 总训练真实图像675 验证假图像总数642 总验证真实图像336 我已经在这方面应用了CNN,但我的验证准确率在下降,而损失在增加。我还对数据进行了数据扩充和预处理 train_dir = '/content/drive/MyDrive/Training/Training Data' validations_dir = '/content/drive/MyDrive/Training/Validation Data'

我有两类图像

伪造的 真实的 数据集拆分详细信息如下

共训练假图像3457张

总训练真实图像675

验证假图像总数642

总验证真实图像336

我已经在这方面应用了CNN,但我的验证准确率在下降,而损失在增加。我还对数据进行了数据扩充和预处理

train_dir = '/content/drive/MyDrive/Training/Training Data'
validations_dir = '/content/drive/MyDrive/Training/Validation Data'
train_fake_dir = '/content/drive/MyDrive/Training/Training Data/FAKE'
train_real_dir = '/content/drive/MyDrive/Training/Training Data/REAL'

validation_fake_dir = '/content/drive/MyDrive/Training/Validation Data/FAKE'
validation_real_dir = '/content/drive/MyDrive/Training/Validation Data/REAL'
num_fake_train = len(os.listdir(train_fake_dir))
num_real_train = len(os.listdir(train_real_dir))

num_fake_validation = len(os.listdir(validation_fake_dir))
num_real_validation = len(os.listdir(validation_real_dir))
print("Total Training FAKE Images",num_fake_train)
print("Total Training REAL Images",num_real_train)
print("--")
print("Total validation FAKE Images",num_fake_validation)
print("Total validation REAL Images",num_real_validation)
total_train = num_fake_train+num_real_train
total_validation = num_fake_validation+num_real_validation
print("Total Training Images",total_train)
print("--")
print("Total Validation Images",total_validation)

image_gen_train = ImageDataGenerator(rescale = 1./255,rotation_range = 40,width_shift_range=0.3,
                                     height_shift_range=0.3,shear_range = 0.3,zoom_range = 0.2,
                                     horizontal_flip = True,fill_mode = 'nearest')
train_data_gen = image_gen_train.flow_from_directory(batch_size = batch_size,
                                                     directory = train_dir,
                                                     shuffle= True,
                                                     target_size = (img_height,img_width),
                                                     class_mode = 'binary')
image_generator_validation = ImageDataGenerator(rescale=1./255)
val_data_gen = image_generator_validation.flow_from_directory(batch_size=batch_size,
                                                 directory=validations_dir,
                                                 target_size=(img_height,img_width),
                                                 shuffle= True,
                                                 class_mode='binary')
classifier = tf.keras.Sequential([
        tf.keras.layers.Conv2D(16,(3,3),activation='relu',input_shape=(img_width,img_height, 3)),
        tf.keras.layers.Dropout(0.5),
        tf.keras.layers.BatchNormalization(),
        tf.keras.layers.MaxPooling2D(2,2),
        tf.keras.layers.Flatten(),
        tf.keras.layers.Dense(128,activation= 'relu'),
        tf.keras.layers.Dense(2,activation='softmax')  
])
classifier.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['acc'])
history_classifier = classifier.fit(train_data_gen,epochs = epochs,validation_data=val_data_gen,verbose = 1)

在model.compile中,您的损失是不正确的。应该是

loss='BinaryCrossentropy'
tf.keras.layers.Dense(1,activation='sigmoid')
在模型中,最后一层应为

loss='BinaryCrossentropy'
tf.keras.layers.Dense(1,activation='sigmoid')
或者,您可以保持一切原样,但将train_data_gen和val_data_gen中的class_模式更改为

class_mode='sparse' 

不,在两个类中使用softmax没有错。我认为在概率方面,在两个类中使用softmax是正确的。