Python 验证准确度(val_acc)不会随时代而变化

Python 验证准确度(val_acc)不会随时代而变化,python,machine-learning,keras,conv-neural-network,vgg-net,Python,Machine Learning,Keras,Conv Neural Network,Vgg Net,val_acc的值不会随年代而变化 总结: 我使用的是来自Keras的预培训(ImageNet)VGG16 from keras.applications import VGG16 conv_base = VGG16(weights='imagenet', include_top=True, input_shape=(224, 224, 3)) 来自ISBI 2016(ISIC)的数据库-这是一组900张用于二元分类(恶性或良性)的皮肤损伤图像,用于培训和验证,再加上379张用于测试的图像

val_acc的值不会随年代而变化

总结:
  • 我使用的是来自Keras的预培训(ImageNet)VGG16

    from keras.applications import VGG16
    conv_base = VGG16(weights='imagenet', include_top=True, input_shape=(224, 224, 3))
    
  • 来自ISBI 2016(ISIC)的数据库-这是一组900张用于二元分类(恶性或良性)的皮肤损伤图像,用于培训和验证,再加上379张用于测试的图像

  • 我使用VGG16的顶层密集层,除了最后一层(分类超过1000个类),并使用带sigmoid函数激活的二进制输出

    conv_base.layers.pop() # Remove last one
    conv_base.trainable = False
    model = models.Sequential()
    model.add(conv_base)
    model.add(layers.Dense(1, activation='sigmoid'))
    
  • 解锁密集层,将其设置为可训练层

  • 获取“训练数据”文件夹中两个不同文件夹中的数据,一个名为“恶性”,另一个名为“良性”

  • 然后我用100多个历元和较低的学习率对其进行微调,将最后一个卷积层设置为可训练

我试过很多方法,比如:

  • 更改优化器(RMSprop、Adam和SGD)
  • 移除预培训VGG16的顶部密集层,并添加矿井

    model.add(layers.Flatten())
    model.add(layers.Dense(128, activation='relu')) 
    model.add(layers.Dense(64, activation='relu'))
    model.add(layers.Dense(1, activation='sigmoid')) 
    
  • 验证生成器中的Shuffle=True

  • 改变批量大小

  • 改变学习率(
    0.001、0.0001、2e-5


  • 结果如下所示:

    Epoch 1/100
    37/37 [==============================] - 33s 900ms/step - loss: 0.6394 - acc: 0.7857 - val_loss: 0.6343 - val_acc: 0.8101
    Epoch 2/100
    37/37 [==============================] - 30s 819ms/step - loss: 0.6342 - acc: 0.8107 - val_loss: 0.6342 - val_acc: 0.8101
    Epoch 3/100
    37/37 [==============================] - 30s 822ms/step - loss: 0.6324 - acc: 0.8188 - val_loss: 0.6341 - val_acc: 0.8101
    Epoch 4/100
    37/37 [==============================] - 31s 840ms/step - loss: 0.6346 - acc: 0.8080 - val_loss: 0.6341 - val_acc: 0.8101
    Epoch 5/100
    37/37 [==============================] - 31s 833ms/step - loss: 0.6395 - acc: 0.7843 - val_loss: 0.6341 - val_acc: 0.8101
    Epoch 6/100
    37/37 [==============================] - 31s 829ms/step - loss: 0.6334 - acc: 0.8134 - val_loss: 0.6340 - val_acc: 0.8101
    Epoch 7/100
    37/37 [==============================] - 31s 834ms/step - loss: 0.6334 - acc: 0.8134 - val_loss: 0.6340 - val_acc: 0.8101
    Epoch 8/100
    37/37 [==============================] - 31s 829ms/step - loss: 0.6342 - acc: 0.8093 - val_loss: 0.6339 - val_acc: 0.8101
    Epoch 9/100
    37/37 [==============================] - 31s 849ms/step - loss: 0.6330 - acc: 0.8147 - val_loss: 0.6339 - val_acc: 0.8101
    Epoch 10/100
    37/37 [==============================] - 30s 812ms/step - loss: 0.6332 - acc: 0.8134 - val_loss: 0.6338 - val_acc: 0.8101
    Epoch 11/100
    37/37 [==============================] - 31s 839ms/step - loss: 0.6338 - acc: 0.8107 - val_loss: 0.6338 - val_acc: 0.8101
    Epoch 12/100
    37/37 [==============================] - 30s 807ms/step - loss: 0.6334 - acc: 0.8120 - val_loss: 0.6337 - val_acc: 0.8101
    Epoch 13/100
    37/37 [==============================] - 32s 852ms/step - loss: 0.6334 - acc: 0.8120 - val_loss: 0.6337 - val_acc: 0.8101
    Epoch 14/100
    37/37 [==============================] - 31s 826ms/step - loss: 0.6330 - acc: 0.8134 - val_loss: 0.6336 - val_acc: 0.8101
    Epoch 15/100
    37/37 [==============================] - 32s 854ms/step - loss: 0.6335 - acc: 0.8107 - val_loss: 0.6336 - val_acc: 0.8101
    
    并且以同样的方式进行,常数
    val_acc=0.8101

    当我在完成培训后使用测试集时,混淆矩阵对良性病变(304)的正确率为100%,对恶性病变的正确率为0%,因此:

        Confusion Matrix
        [[304   0]
         [ 75   0]]
    
    我可能做错了什么


    谢谢。

    VGG16接受了以RGB为中心的数据培训。但是,您的
    ImageDataGenerator
    未启用
    featurewise_center
    ,因此您正在向网络提供原始RGB数据。VGG卷积基无法处理这个问题以提供任何有意义的信息,因此您的网络最终会普遍猜测更常见的类

    一般来说,当你看到这类问题时(你的网络只猜测最常见的类),这意味着你的数据有问题,而不是网络。这可能是由这样的预处理步骤造成的,也可能是由“中毒”异常训练数据的很大一部分造成的,这些异常训练数据会积极地损害训练过程

        Confusion Matrix
        [[304   0]
         [ 75   0]]