MNIST и передача обучения с VGG16 в Keras- низкая точность проверки
Недавно я начал использовать в проекте функцию Keras flow_from_dataframe() и решил протестировать ее с набором данных MNIST. У меня есть каталог, полный примеров MNIST в формате png, и фрейм данных с абсолютным каталогом для каждого в одном столбце и меткой в другом.
Я также использую трансферное обучение, импортирую VGG16 в качестве основы и добавляю свой собственный плотный слой 512 узлов и выпадение 0,5 перед слоем softmax 10. (Для цифр 0-9). Я использую rmsprop (lr=1e-4) в качестве оптимизатора.
Когда я запускаю свою среду, она вызывает последнюю версию keras_preprocessing из Git, которая имеет поддержку абсолютных каталогов и расширений файлов с большой буквы.
Моя проблема в том, что у меня очень высокая точность обучения и ужасно низкая точность проверки. К моей последней эпохе (10) у меня была точность обучения 0,94 и точность проверки 0,01.
Мне интересно, что-то не так с моим сценарием? С другим набором данных я даже получаю NaN для значений обучения и потерь проверки после эпохи 4. (Я проверил соответствующие столбцы, нулевых значений нет!)
Вот мой код Я был бы глубоко признателен, если бы кто-то мог взглянуть через это и посмотреть, выпрыгнет ли что-нибудь на них.
import pandas as pd
import numpy as np
import keras
from keras_preprocessing.image import ImageDataGenerator
from keras import applications
from keras import optimizers
from keras.models import Model
from keras.layers import Dropout, Flatten, Dense, GlobalAveragePooling2D
from keras import backend as k
from keras.callbacks import ModelCheckpoint, CSVLogger
from keras.applications.vgg16 import VGG16, preprocess_input
# INITIALIZE MODEL
img_width, img_height = 32, 32
model = VGG16(weights = 'imagenet', include_top=False, input_shape = (img_width, img_height, 3))
# freeze all layers
for layer in model.layers:
layer.trainable = False
# Adding custom Layers
x = model.output
x = Flatten()(x)
x = Dense(512, activation='relu')(x)
x = Dropout(0.5)(x)
predictions = Dense(10, activation="softmax")(x)
# creating the final model
model_final = Model(input = model.input, output = predictions)
# compile the model
rms = optimizers.RMSprop(lr=1e-4)
#adadelta = optimizers.Adadelta(lr=0.001, rho=0.5, epsilon=None, decay=0.0)
model_final.compile(loss = "categorical_crossentropy", optimizer = rms, metrics=["accuracy"])
# LOAD AND DEFINE SOURCE DATA
train = pd.read_csv('MNIST_train.csv', index_col=0)
val = pd.read_csv('MNIST_test.csv', index_col=0)
nb_train_samples = 60000
nb_validation_samples = 10000
batch_size = 60
epochs = 10
# Initiate the train and test generators
train_datagen = ImageDataGenerator()
test_datagen = ImageDataGenerator()
train_generator = train_datagen.flow_from_dataframe(dataframe=train,
directory=None,
x_col='train_samples',
y_col='train_labels',
has_ext=True,
target_size = (img_height,
img_width),
batch_size = batch_size,
class_mode = 'categorical',
color_mode = 'rgb')
validation_generator = test_datagen.flow_from_dataframe(dataframe=val,
directory=None,
x_col='test_samples',
y_col='test_labels',
has_ext=True,
target_size = (img_height,
img_width),
batch_size = batch_size,
class_mode = 'categorical',
color_mode = 'rgb')
# GET CLASS INDICES
print('****************')
for cls, idx in train_generator.class_indices.items():
print('Class #{} = {}'.format(idx, cls))
print('****************')
# DEFINE CALLBACKS
path = './chk/epoch_{epoch:02d}-valLoss_{val_loss:.2f}-valAcc_{val_acc:.2f}.hdf5'
chk = ModelCheckpoint(path, monitor = 'val_acc', verbose = 1, save_best_only = True, mode = 'max')
logger = CSVLogger('./chk/training_log.csv', separator = ',', append=False)
nPlus = 1
samples_per_epoch = nb_train_samples * nPlus
# Train the model
model_final.fit_generator(train_generator,
steps_per_epoch = int(samples_per_epoch/batch_size),
epochs = epochs,
validation_data = validation_generator,
validation_steps = int(nb_validation_samples/batch_size),
callbacks = [chk, logger])
1 ответ
Вы пытались явно определить классы изображений? в качестве таких:
train_generator=image.ImageDataGenerator().flow_from_dataframe(classes=[0,1,2,3,4,5,6,7,8,9])
как в поездах, так и в генераторах проверки.
Я обнаружил, что иногда генераторы поездов и валидации создают разные словари соответствия.