Почему точность обучения моей модели высока во время обучения, но низкая при ее развертывании? - PullRequest
0 голосов
/ 25 марта 2020

Я использовал глубокую нейронную сеть (VGG16) для классификации текстурных изображений. Мне пришлось тренировать всю сеть с нуля, чтобы получить хорошую точность, так как сеть предварительно обучена распознавать изображения объектов. После обучения я получил 90% точности проверки. Насколько мне известно, keras вычисляет точность, проверяя, является ли класс, который имеет наибольшее значение в векторе вероятности изображения, правильным классом. Я сделал то же самое, чтобы вычислить точность данных испытаний. Удивительно, но она была очень низкой - 30%. Я думал, что данные испытаний отличаются от данных проверки. Таким образом, я пересчитал точность данных проверки так же, как и керас, и точность составила около 30%. Обратите внимание, что после тренировки модели я сохранил вес модели. После этого я создал новую модель, загрузил веса и скомпилировал ее:

vgg16_model = VGG16(weights=None, include_top=False, input_shape=(224,224,3))
model = Sequential()
model.add(vgg16_model)
model.add(Flatten())
model.add(Dense(256, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(classesNb, activation='softmax'))
model.load_weights(trainedModelsDir + modelName)
model.compile(loss='categorical_crossentropy', optimizer= optimizers.sgd(lr = 1e-4, momentum = 0.9), 
metrics = ['accuracy'])
model.save(compiledModelsDir + modelName)

После этого я вычислил точность данных испытаний / проверки:

global cpArray
classesProbabilities =[] 
model = load_model(compiledModelsDir +'model1.h5')

classIdx = -1
crrctPred = 0

for subdir, dirs, files in sorted(os.walk(splittedDatasetDir +'val/')):
   for imageName in sorted(files):
       imagePath = subdir + os.sep + imageName
       img = image.load_img(imagePath, target_size=(224,224))
       img = image.img_to_array(img)
       img = np.expand_dims(img, axis=0)
       img = preprocess_input(img)
       y=model.predict(img)[0]
       classesProbabilities.append(y) 
       if y[classIdx] == np.amax(y):
          crrctPred += 1   
   cpArray = np.array(classesProbabilities) 
   classIdx += 1 

classAcc = crrctPred / len(classesProbabilities)

Я положил sorted чтобы классы были в том же порядке, что и в векторе вероятностей классов (я использовал flow_from_directory во время обучения, которое берет классы из каталога в алфавитном порядке), и установил classIdx в -1, поэтому в l oop начинается с 0. Также обратите внимание, что набор данных, который я использую, очень мал (250 для обучения, 125 для тестирования и 125 для проверки). Я думаю, что прогнозы при обучении модели могут немного отличаться после загрузки весов в новую созданную модель и повторного выполнения прогноза. Итак, это источник ошибки? Я также заметил, что неправильно классифицированные образцы были классифицированы как принадлежащие к аналогичному классу истинному классу. Однако это странно, потому что точность очень низкая.

...