Keras 转移学习CNN模型无法预测看不见的图像

Keras 转移学习CNN模型无法预测看不见的图像,keras,conv-neural-network,transfer-learning,Keras,Conv Neural Network,Transfer Learning,我正在使用VGG16和keras构建一个模型,目的是识别100种不同的蘑菇类,虽然该模型似乎具有很高的训练精度,但在识别新图像方面却失败得很惨。我认为这意味着模型过于拟合,所以我应用了几种不同的正则化技术,特别是辍学层、L1和L2正则化,都没有用。你能帮我找出我模型中的错误吗 import numpy as np import pandas as pd from keras import applications from keras.callbacks import ModelCheckpoi

我正在使用VGG16和keras构建一个模型,目的是识别100种不同的蘑菇类,虽然该模型似乎具有很高的训练精度,但在识别新图像方面却失败得很惨。我认为这意味着模型过于拟合,所以我应用了几种不同的正则化技术,特别是辍学层、L1和L2正则化,都没有用。你能帮我找出我模型中的错误吗

import numpy as np
import pandas as pd
from keras import applications
from keras.callbacks import ModelCheckpoint
from keras import optimizers
from keras.models import Model
from keras.layers import Input, Dense, BatchNormalization, MaxPooling2D, Dropout, Flatten
from keras.preprocessing.image import ImageDataGenerator
from keras import regularizers
import tensorflow as tf


class ImageModel():
    
    # Preprocessing constants
        
    IMG_WIDTH = 224
    IMG_HEIGHT = 224
    COLORS = 3
    BATCH_SIZE = 32
    SEED = 42
    
    # Neural network layer parameters
        
    POOLING_DROPOUT_RATE = 0.1
    FC_DROPOUT_RATE = 0.4
    NUMBER_OF_CLASSES = 100
    FC1_NEURONS = 1536
    FC2_NEURONS = 1024
    FC3_NEURONS = 512
    
    # Hyperparameters and others
        
    LEARNING_RATE = 0.00005
    DECAY = 0.95
    EPSILON = 1e-08
    NUMBER_OF_EPOCHS = 50
    
    def __init__(self):
        pass
    
    def load_data(self):
        
        datagen = ImageDataGenerator()
        
        train_generator = datagen.flow_from_directory(directory = '/kaggle/input/mushroom5/prep_images',
                                                      batch_size = self.BATCH_SIZE,
                                                      seed = self.SEED,
                                                      shuffle = True,
                                                      class_mode = 'categorical',
                                                      target_size = (self.IMG_WIDTH, self.IMG_HEIGHT))
        label_map = (train_generator.class_indices)
        return train_generator


# Initialzing transfer learning model
    
    def start_model(self):

        vgg_model = applications.VGG16(weights = 'imagenet',
                                       include_top = False,
                                       input_shape = (self.IMG_WIDTH, self.IMG_HEIGHT, self.COLORS))
        
        for layer in vgg_model.layers[:-5]:
            layer.trainable = False
            
        for layer in vgg_model.layers[1:4]:
            layer.trainable = True
            
        inputs = Input(shape = (self.IMG_WIDTH, self.IMG_HEIGHT, self.COLORS), name = 'image_input')
        output_vgg16_conv = vgg_model(inputs)
        
        x = BatchNormalization()(output_vgg16_conv)
        x = MaxPooling2D(pool_size = (2, 2), padding = 'same')(x)
        x = Dropout(self.POOLING_DROPOUT_RATE)(x)
        
        x = Flatten()(x)
        x = Dense(self.FC1_NEURONS, activation = 'relu', kernel_regularizer = regularizers.l1_l2(l1 = 0.07, l2 = 0.007))(x)
        x = BatchNormalization()(x)
        x = Dropout(self.FC_DROPOUT_RATE)(x)
        
        x = Dense(self.FC2_NEURONS, activation = 'relu', kernel_regularizer=regularizers.l1_l2(l1 = 0.06, l2 = 0.006))(x)
        x = BatchNormalization()(x)
        x = Dropout(self.FC_DROPOUT_RATE)(x)
        
        x = Dense(self.FC3_NEURONS, activation = 'relu', kernel_regularizer=regularizers.l1_l2(l1 = 0.05, l2 = 0.006))(x)
        x = BatchNormalization()(x)
        x = Dropout(self.FC_DROPOUT_RATE)(x)
        
        x = Dense(self.NUMBER_OF_CLASSES, activation = 'softmax')(x)
        
        model = Model(inputs = inputs, outputs = x)
        model.summary()
        
        return model

    def compile_and_fit_model(self, model: Model, train_generator, checkpoint):
        
        model.compile(loss = 'categorical_crossentropy',
                      optimizer = optimizers.RMSprop(lr = self.LEARNING_RATE, rho = self.DECAY, epsilon = self.EPSILON),
                      metrics = ['accuracy'])

        
        STEP_SIZE_TRAIN = train_generator.n // self.BATCH_SIZE
        
        model.fit(train_generator,
                            steps_per_epoch = STEP_SIZE_TRAIN,
                            epochs = self.NUMBER_OF_EPOCHS,
                            verbose = 1, callbacks = [checkpoint])
    
        model.save_weights('weights.hdf5')


img_model = ImageModel()
gen = img_model.load_data()

checkpoint = ModelCheckpoint('best_model.hdf5', monitor = 'loss', verbose = 1,
    save_best_only = True, mode = 'auto', save_freq = 'epoch')

model = img_model.start_model()
img_model.compile_and_fit_model(model, gen, checkpoint)

这是我尝试的上一个型号的培训日志:

Found 125474 images belonging to 100 classes.
Model: "model_15"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
image_input (InputLayer)     [(None, 224, 224, 3)]     0         
_________________________________________________________________
vgg16 (Functional)           (None, 7, 7, 512)         14714688  
_________________________________________________________________
batch_normalization_60 (Batc (None, 7, 7, 512)         2048      
_________________________________________________________________
max_pooling2d_15 (MaxPooling (None, 4, 4, 512)         0         
_________________________________________________________________
dropout_60 (Dropout)         (None, 4, 4, 512)         0         
_________________________________________________________________
flatten_15 (Flatten)         (None, 8192)              0         
_________________________________________________________________
dense_60 (Dense)             (None, 1536)              12584448  
_________________________________________________________________
batch_normalization_61 (Batc (None, 1536)              6144      
_________________________________________________________________
dropout_61 (Dropout)         (None, 1536)              0         
_________________________________________________________________
dense_61 (Dense)             (None, 1024)              1573888   
_________________________________________________________________
batch_normalization_62 (Batc (None, 1024)              4096      
_________________________________________________________________
dropout_62 (Dropout)         (None, 1024)              0         
_________________________________________________________________
dense_62 (Dense)             (None, 512)               524800    
_________________________________________________________________
batch_normalization_63 (Batc (None, 512)               2048      
_________________________________________________________________
dropout_63 (Dropout)         (None, 512)               0         
_________________________________________________________________
dense_63 (Dense)             (None, 100)               51300     
=================================================================
Total params: 29,463,460
Trainable params: 21,859,748
Non-trainable params: 7,603,712
_________________________________________________________________
Epoch 1/50
3921/3921 [==============================] - 660s 168ms/step - loss: 2584.9164 - accuracy: 0.0248

Epoch 00001: loss improved from inf to 754.43689, saving model to best_model.hdf5
Epoch 2/50
3921/3921 [==============================] - 658s 168ms/step - loss: 29.5504 - accuracy: 0.0620

Epoch 00002: loss improved from 754.43689 to 29.46682, saving model to best_model.hdf5
Epoch 3/50
3921/3921 [==============================] - 658s 168ms/step - loss: 29.1835 - accuracy: 0.1096

Epoch 00003: loss improved from 29.46682 to 29.11829, saving model to best_model.hdf5
Epoch 4/50
3921/3921 [==============================] - 657s 168ms/step - loss: 28.9046 - accuracy: 0.1428

Epoch 00004: loss improved from 29.11829 to 28.85434, saving model to best_model.hdf5
Epoch 5/50
3921/3921 [==============================] - 657s 167ms/step - loss: 28.6818 - accuracy: 0.1818

Epoch 00005: loss improved from 28.85434 to 28.64897, saving model to best_model.hdf5
Epoch 6/50
3921/3921 [==============================] - 656s 167ms/step - loss: 28.5150 - accuracy: 0.2040

Epoch 00006: loss improved from 28.64897 to 28.49173, saving model to best_model.hdf5
Epoch 7/50
3921/3921 [==============================] - 656s 167ms/step - loss: 28.3833 - accuracy: 0.2304

Epoch 00007: loss improved from 28.49173 to 28.36085, saving model to best_model.hdf5
Epoch 8/50
3921/3921 [==============================] - 657s 168ms/step - loss: 28.2639 - accuracy: 0.2517

Epoch 00008: loss improved from 28.36085 to 28.24930, saving model to best_model.hdf5
Epoch 9/50
3921/3921 [==============================] - 656s 167ms/step - loss: 28.1710 - accuracy: 0.2719

Epoch 00009: loss improved from 28.24930 to 28.15787, saving model to best_model.hdf5
Epoch 10/50
3921/3921 [==============================] - 656s 167ms/step - loss: 28.1001 - accuracy: 0.2878

Epoch 00010: loss improved from 28.15787 to 28.08827, saving model to best_model.hdf5
Epoch 11/50
3921/3921 [==============================] - 659s 168ms/step - loss: 28.0264 - accuracy: 0.3011

Epoch 00011: loss improved from 28.08827 to 28.02402, saving model to best_model.hdf5
Epoch 12/50
3921/3921 [==============================] - 657s 167ms/step - loss: 27.9653 - accuracy: 0.3136

Epoch 00012: loss improved from 28.02402 to 27.95928, saving model to best_model.hdf5
Epoch 13/50
3921/3921 [==============================] - 658s 168ms/step - loss: 27.9122 - accuracy: 0.3267

Epoch 00013: loss improved from 27.95928 to 27.90305, saving model to best_model.hdf5
Epoch 14/50
3921/3921 [==============================] - 656s 167ms/step - loss: 27.8657 - accuracy: 0.3344

Epoch 00014: loss improved from 27.90305 to 27.85427, saving model to best_model.hdf5
Epoch 15/50
3921/3921 [==============================] - 657s 168ms/step - loss: 27.8134 - accuracy: 0.3464

Epoch 00015: loss improved from 27.85427 to 27.81693, saving model to best_model.hdf5
Epoch 16/50
3921/3921 [==============================] - 662s 169ms/step - loss: 27.7803 - accuracy: 0.3570

Epoch 00016: loss improved from 27.81693 to 27.77740, saving model to best_model.hdf5
Epoch 17/50
3921/3921 [==============================] - 656s 167ms/step - loss: 27.7481 - accuracy: 0.3619

Epoch 00017: loss improved from 27.77740 to 27.73766, saving model to best_model.hdf5
Epoch 18/50
3921/3921 [==============================] - 667s 170ms/step - loss: 27.6905 - accuracy: 0.3812

Epoch 00018: loss improved from 27.73766 to 27.67320, saving model to best_model.hdf5
Epoch 19/50
3921/3921 [==============================] - 656s 167ms/step - loss: 27.6105 - accuracy: 0.4125

Epoch 00019: loss improved from 27.67320 to 27.59259, saving model to best_model.hdf5
Epoch 20/50
3921/3921 [==============================] - 656s 167ms/step - loss: 27.4996 - accuracy: 0.4612

Epoch 00020: loss improved from 27.59259 to 27.47169, saving model to best_model.hdf5
Epoch 21/50
3921/3921 [==============================] - 655s 167ms/step - loss: 27.3658 - accuracy: 0.5032

Epoch 00021: loss improved from 27.47169 to 27.34458, saving model to best_model.hdf5
Epoch 22/50
3921/3921 [==============================] - 656s 167ms/step - loss: 27.2737 - accuracy: 0.5299

Epoch 00022: loss improved from 27.34458 to 27.25794, saving model to best_model.hdf5
Epoch 23/50
3921/3921 [==============================] - 656s 167ms/step - loss: 27.1896 - accuracy: 0.5543

Epoch 00023: loss improved from 27.25794 to 27.17504, saving model to best_model.hdf5
Epoch 24/50
3921/3921 [==============================] - 655s 167ms/step - loss: 27.1189 - accuracy: 0.5754

Epoch 00024: loss improved from 27.17504 to 27.10810, saving model to best_model.hdf5
Epoch 25/50
3921/3921 [==============================] - 655s 167ms/step - loss: 27.0545 - accuracy: 0.5906

Epoch 00025: loss improved from 27.10810 to 27.04820, saving model to best_model.hdf5
Epoch 26/50
3921/3921 [==============================] - 655s 167ms/step - loss: 27.0120 - accuracy: 0.6043
提前感谢您的回答