Я использовал глубокую нейронную сеть (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 для проверки). Я думаю, что прогнозы при обучении модели могут немного отличаться после загрузки весов в новую созданную модель и повторного выполнения прогноза. Итак, это источник ошибки? Я также заметил, что неправильно классифицированные образцы были классифицированы как принадлежащие к аналогичному классу истинному классу. Однако это странно, потому что точность очень низкая.