Как обрабатывать ложные прогнозы в нейронной сети, созданной и обученной с помощью Keras? - PullRequest
0 голосов
/ 25 апреля 2018

Я очень новичок в нейронных сетях, и я попробовал типичный первый пример с помощью некоторых интернет-блогов: Классификация изображений кошек или собак. После обучения нейронной сети, приведенной ниже, я попытался идентифицировать некоторые случайные изображения кошек / собак, которые я нашел в Google и которых нет ни в моем training_set, ни в моем test_set… Я обнаружил, что иногда сеть дает правильный прогноз (распознавание собаки когда показываю собаку) и, к сожалению, иногда ложное предсказание, т.е. я показываю фотографию кошки, а сеть предсказывает «собаку». Как мне справиться с такими ошибками?

Добавление всех неправильных картинок в training_set или test_set и повторяет ли весь процесс обучения? Или есть какой-либо другой способ сообщить сети, что она сделала ложный прогноз и должна адаптировать свои веса?

#Part 1 - Import
from keras.models import Sequential
from keras.layers import Conv2D
from keras.layers import MaxPooling2D
from keras.layers import Flatten
from keras.layers import Dense
#Part 2 – Build Network
classifier = Sequential()
classifier.add(Conv2D(32, (3, 3), input_shape = (64, 64, 3), activation = 'relu'))
classifier.add(MaxPooling2D(pool_size = (2, 2)))
classifier.add(Conv2D(32, (3, 3), activation = 'relu'))
classifier.add(MaxPooling2D(pool_size = (2, 2)))
classifier.add(Flatten())
classifier.add(Dense(units = 128, activation = 'relu'))
classifier.add(Dense(units = 1, activation = 'sigmoid'))
classifier.compile(optimizer = 'adam', loss = 'binary_crossentropy', metrics = ['accuracy'])
#Part 3 - Training
from keras.preprocessing.image import ImageDataGenerator
train_datagen = ImageDataGenerator(rescale = 1./255, shear_range = 0.2, zoom_range = 0.2, horizontal_flip = True)
test_datagen = ImageDataGenerator(rescale = 1./255)
training_set = train_datagen.flow_from_directory('C:/…/KNNDaten/training_set', target_size = (64, 64), batch_size = 32, class_mode = 'binary')
test_set = test_datagen.flow_from_directory('C:/…/KNNDaten/test_set', target_size = (64, 64), batch_size = 32, class_mode = 'binary')

classifier.fit_generator(training_set, steps_per_epoch = 8000, epochs = 25, validation_data = test_set, validation_steps = 2000)

#Part 4 – Saving Model and weights 
model_json = classifier.to_json()
with open("model1.json", "w") as json_file:
 json_file.write(model_json)
 classifier.save_weights("model1.h5")

# Part 5 - Making new predictions
import numpy as np
from keras.preprocessing import image
test_image = image.load_img('C:/… /KNNDaten/single_prediction/cat_or_dog_1.jpg', target_size = (64, 64))
test_image = image.img_to_array(test_image)
test_image = np.expand_dims(test_image, axis = 0)
result = classifier.predict(test_image)
training_set.class_indices
if result[0][0] == 1:
    prediction = 'dog'
else:
    prediction = 'cat'

print("Image contains: " + prediction);

На данный момент мой тренировочный процесс выглядит так: Результаты моего тренировочного процесса: точность, ...

Большое спасибо за помощь!

1 Ответ

0 голосов
/ 25 апреля 2018

Обычный процесс заключается в добавлении неправильно предсказанных изображений в набор обучающих данных и переобучении сети со случайными весами или с использованием весов, полученных ранее с новыми изображениями и старыми.

При обучении сети вам не нужно начинать со случайных весов, вы можете использовать предыдущие веса, это иногда называется трансферным обучением. Если вы попытаетесь сделать это, важно также включить исходные изображения, использованные для тренировки модели, или хотя бы ее часть, если вы не хотите надевать модель.

Поскольку комментарии Dascienz, использующие методы дополнения данных, также могут быть очень полезны, чтобы получить лучшее обобщение, например, добавление новых изображений и их вариаций: повороты, перемещение, симметрии и масштабирование.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...