Высокая точность проверки при низкой точности поезда - PullRequest
0 голосов
/ 15 марта 2020

Я работаю над проектом, в котором я хочу классифицировать болезнь Альцгеймера, используя изображения спектрограмм, полученные из сегментов естественной речи пораженных и здоровых людей. Первоначально я использовал архитектуру VGG16 с нуля и использовал ее весовые коэффициенты для получения дискретных результатов, затем я изменил архитектуру с InceptionV3, и здесь возникли проблемы: глядя на мои результаты, можно увидеть, как точность обучения застряла на уровне около 52%, а точность проверки вместо этого идет от 33% до 98% (с пиками на 100%), и я не понимаю, как это могло быть возможно. Я знаю, что при небольшом наборе данных (почти 450 изображений для обучения и 50 для проверки) изменчивость результатов может быть высокой, но не так. Кто-нибудь из вас понимает, почему это происходит и, в случае, как решить проблему? Код здесь ниже:

from keras.applications.inception_v3 import InceptionV3

train_dir = 'C:/Users/marto/Desktop/Datasets/3. Dem@Care_Resized_V3/Train'
validation_dir = 'C:/Users/marto/Desktop/Datasets/3. Dem@Care_Resized_V3/Val'

### Instantiate convolutional base

img_width, img_height, channels = 299, 299, 3

train_size, validation_size = 436, 48

conv_base = InceptionV3(weights= None, #'imagenet',
                  include_top=False,
                  input_shape=(img_width, img_height, channels))

### Estracting features from InceptionV3 architecture 

from keras.preprocessing.image import ImageDataGenerator

datagen = ImageDataGenerator(rescale=1./255)
batch_size = 4

def extract_features(directory, sample_count):
    features = np.zeros(shape=(sample_count, 8, 8, 2048))
    labels = np.zeros(shape=(sample_count))

    # Preprocess data
    generator = datagen.flow_from_directory(directory,
                                            target_size=(img_width,img_height),
                                            batch_size = batch_size,
                                            class_mode='binary',
                                            shuffle = True)

    # Pass data through convolutional base
    i = 0
    for inputs_batch, labels_batch in generator:
        features_batch = conv_base.predict(inputs_batch)
        features[i * batch_size: (i + 1) * batch_size] = features_batch
        labels[i * batch_size: (i + 1) * batch_size] = labels_batch
        i += 1
        if i * batch_size >= sample_count:
            break
    return features, labels

train_features, train_labels = extract_features(train_dir, train_size)  
validation_features, validation_labels = extract_features(validation_dir, validation_size)

################################ MODELING #####################################

from keras import models
from keras import layers
from keras import optimizers
import keras_metrics as km
from keras.optimizers import RMSprop
from sklearn.model_selection import StratifiedKFold

seed = 42
epochs = 50

kfold = StratifiedKFold(n_splits=5, shuffle=False, random_state = seed)
cv_scores = []

### Defining the Model

for train, val in kfold.split(train_features, train_labels):

    model = models.Sequential()
    model.add(layers.Flatten(input_shape=(8,8,2048)))
    model.add(layers.Dense(128, activation='tanh', input_dim=(8*8*2048)))
    model.add(layers.Dropout(0.3))
    model.add(layers.Dense(1, activation='sigmoid'))

    ### Compiling the  model

    model.compile(optimizer = RMSprop(lr= 0.001),
                  loss='binary_crossentropy',
                  metrics=['acc', km.binary_precision(), km.binary_recall()])

    ### Training the Model

    history = model.fit(train_features, train_labels,
                        epochs=epochs,
                        batch_size=batch_size, 
                        validation_data=(validation_features, validation_labels))```


These reported are the first 10 epochs of the first CV_Folder:

Train on 436 samples, validate on 48 samples
Epoch 1/50
436/436 [==============================] - 19s 42ms/step - loss: 0.7451 - acc: 0.5046 - precision: 0.5263 - recall: 0.5677 - val_loss: 0.6611 - val_acc: 0.9792 - val_precision: 1.0000 - val_recall: 0.9792
Epoch 2/50
436/436 [==============================] - 17s 39ms/step - loss: 0.7204 - acc: 0.4908 - precision: 0.5142 - recall: 0.5546 - val_loss: 0.5067 - val_acc: 1.0000 - val_precision: 1.0000 - val_recall: 1.0000
Epoch 3/50
436/436 [==============================] - 17s 39ms/step - loss: 0.7107 - acc: 0.5115 - precision: 0.5317 - recall: 0.5852 - val_loss: 0.3703 - val_acc: 1.0000 - val_precision: 1.0000 - val_recall: 1.0000
Epoch 4/50
436/436 [==============================] - 17s 39ms/step - loss: 0.7148 - acc: 0.4977 - precision: 0.5189 - recall: 0.5983 - val_loss: 0.6066 - val_acc: 0.9792 - val_precision: 1.0000 - val_recall: 0.9792
Epoch 5/50
436/436 [==============================] - 17s 39ms/step - loss: 0.7219 - acc: 0.4771 - precision: 0.5019 - recall: 0.5808 - val_loss: 0.7211 - val_acc: 0.3333 - val_precision: 1.0000 - val_recall: 0.3333
Epoch 6/50
436/436 [==============================] - 17s 40ms/step - loss: 0.7028 - acc: 0.5344 - precision: 0.5504 - recall: 0.6201 - val_loss: 0.4808 - val_acc: 1.0000 - val_precision: 1.0000 - val_recall: 1.0000
Epoch 7/50
436/436 [==============================] - 17s 40ms/step - loss: 0.7044 - acc: 0.5596 - precision: 0.5761 - recall: 0.6114 - val_loss: 0.5336 - val_acc: 0.9792 - val_precision: 1.0000 - val_recall: 0.9792
Epoch 8/50
436/436 [==============================] - 17s 40ms/step - loss: 0.7053 - acc: 0.5321 - precision: 0.5490 - recall: 0.6114 - val_loss: 0.5413 - val_acc: 0.9792 - val_precision: 1.0000 - val_recall: 0.9792
Epoch 9/50
436/436 [==============================] - 17s 39ms/step - loss: 0.7008 - acc: 0.5344 - precision: 0.5504 - recall: 0.6201 - val_loss: 0.4413 - val_acc: 1.0000 - val_precision: 1.0000 - val_recall: 1.0000
Epoch 10/50
436/436 [==============================] - 17s 39ms/step - loss: 0.7043 - acc: 0.5413 - precision: 0.5535 - recall: 0.6550 - val_loss: 0.6734 - val_acc: 0.6667 - val_precision: 1.0000 - val_recall: 0.6667
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...