Модель Keras VGG16 случайным образом застревает с точностью до 50% - PullRequest
0 голосов
/ 30 апреля 2019

Я пытаюсь реализовать предварительно обученную модель Keras VGG16 CNN на моих собственных данных для простой задачи классификации двоичных изображений.В настоящее время у меня есть 1184 изображения для обучения и 512 для проверки - обратите внимание, что у меня есть только два класса.В своем коде я сначала вычисляю узкие места своих изображений, а затем сохраняю упомянутые функции.Затем модель обучает классификатор с использованием функции потерь binary_crossentropy.Кажется, в большинстве случаев это работает нормально, но в некоторых случаях модель застревает.Потери в поездах и вальцах, а также точность остаются совершенно постоянными - с точностью до 50%.

Что-то не так с тем, как я это делаю?Или я просто переоснащаюсь, и модель случайно застревает в локальной минуте без шансов выбраться?Вот мой код:

import numpy as np
from keras.preprocessing.image import ImageDataGenerator
from keras.models import Sequential
from keras.layers import Dropout, Flatten, Dense
from keras import applications
from keras.losses import categorical_crossentropy, binary_crossentropy
from keras.optimizers import RMSprop
from keras.utils import to_categorical
from keras.preprocessing.image import ImageDataGenerator, array_to_img, img_to_array, load_img
from keras.applications.imagenet_utils import decode_predictions
from keras.applications.vgg16 import preprocess_input

img_width, img_height = 256, 256
train_count = 1184
validation_count = 512
batch_size = 32
epochs = 50
top_model_weights_path = 'bottleneck_fc_model.h5'
learnrate=10e-4

train_data_dir = 'path/to/train'
validation_data_dir = 'path/to/validation'

# ----TRAIN----
model = applications.VGG16(include_top=False, weights='imagenet')

datagen = ImageDataGenerator(rescale=1. / 255, preprocessing_function = preprocess_input) 

generator = datagen.flow_from_directory(
        train_data_dir,
        target_size=(img_width, img_height),
        batch_size=batch_size,
        class_mode=None,
        shuffle=False)

bottleneck_features_train = model.predict_generator(generator, train_count // batch_size)

np.save('bottleneck_features_train.npy', bottleneck_features_train)

generator = datagen.flow_from_directory(
            validation_data_dir,
            target_size=(img_width, img_height),
            batch_size=batch_size,
            class_mode=None,
            shuffle=False)

datagen = ImageDataGenerator(rescale=1./255, preprocessing_function = preprocess_input)


bottleneck_features_validation = model.predict_generator(generator, validation_count // batch_size)
np.save('bottleneck_features_validation.npy', bottleneck_features_validation)



# ----TEST----

train_data = np.load('bottleneck_features_train.npy')   
train_labels = np.array([0] * int(train_count/2) + [1] * int(train_count/2))

validation_data = np.load('bottleneck_features_validation.npy')
validation_labels = np.array([0] * 256 + [1] * 256)

model = Sequential()
model.add(Flatten(input_shape=train_data.shape[1:]))
model.add(Dense(256, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(1, activation='sigmoid'))
rms = RMSprop(lr=learnrate)


model.compile(optimizer=rms, loss='binary_crossentropy', metrics=['accuracy'])


hist = model.fit(train_data, train_labels, verbose = 1,
              epochs=epochs,
              batch_size=batch_size,
              validation_data=(validation_data, validation_labels))
model.save_weights(top_model_weights_path)

Вот некоторые выходные данные, когда он застревает:

Epoch 1/50
1184/1184 [==============================] - 5s 4ms/step - loss: 7.8217 - acc: 0.4949 - val_loss: 7.9712 - val_acc: 0.5000
Epoch 2/50
1184/1184 [==============================] - 4s 4ms/step - loss: 7.9712 - acc: 0.5000 - val_loss: 7.9712 - val_acc: 0.5000
Epoch 3/50
1184/1184 [==============================] - 4s 4ms/step - loss: 7.9712 - acc: 0.5000 - val_loss: 7.9712 - val_acc: 0.5000
Epoch 4/50
1184/1184 [==============================] - 4s 4ms/step - loss: 7.9712 - acc: 0.5000 - val_loss: 7.9712 - val_acc: 0.5000
Epoch 5/50
1184/1184 [==============================] - 4s 4ms/step - loss: 7.9712 - acc: 0.5000 - val_loss: 7.9712 - val_acc: 0.5000
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...