Неправильные прогнозы с использованием model.predict () - PullRequest
0 голосов
/ 09 ноября 2018

У меня проблема с прогнозированием в сети VGG16 с обучением передаче. У меня есть модель, обученная с Адамом на 7 классах. Обучался с помощью fit_generator (), используя ImageDataGenerator. Я загружаю модель используя:

# load the model we saved
model = load_model('models/vgg16_9.h5')
model.compile(loss='categorical_crossentropy',
              optimizer=optimizers.Adam(lr=1e-4),
              metrics=['acc'])

А потом пытался делать прогнозы. Во-первых, я использовал Предикат_генератор (), чтобы создать файл .CSV с результатами:

test_datagen = ImageDataGenerator(rescale = 1./255)
test_generator = test_datagen.flow_from_directory("dataset/test_set",
                                                  target_size=(227, 454),
                                                  batch_size=1,
                                                  class_mode=None,
                                                  shuffle=False,
                                                  seed=42)

test_generator.reset()
pred = model.predict_generator(test_generator, verbose = 1)
predicted_class_indices = np.argmax(pred, axis = 1)

labels = (valid_generator.class_indices)
labels = dict((v,k) for k,v in labels.items())
predictions = [labels[k] for k in predicted_class_indices]

filenames=test_generator.filenames
results=pd.DataFrame({"Filename":filenames,
                      "Predictions":predictions})
results.to_csv("results.csv",index=False)

Это работает нормально, и я получаю результат как:

...
Filename,Predictions
test\green.1191.png,Green
test\green.1195.png,Green
test\green.1196.png,Green
test\green.1197.png,Green
test\green.1198.png,OK
test\green.1199.png,Green
test\green.1200.png,Green
test\green.1201.png,Green
test\green.1202.png,OK
test\green.1203.png,Green
test\green.1204.png,OK
test\green.1205.png,Green
test\green.1206.png,Green
test\green.1207.png,Green
...

Но когда я пытаюсь сделать прогноз одного изображения с помощью:

# predicting images
test_image = image.load_img('dataset/test_set/test/green.1230.png', target_size = (227, 454))
test_image = image.img_to_array(test_image)
test_image = np.expand_dims(test_image, axis = 0)
result = model.predict(test_image, verbose=1)
y_pred = np.argmax(result, axis = 1)

Мой y_pred - [6], и, если я правильно читаю class_indices [6], то это совершенно другой класс (уручен Предикат_генератор ()).

Показатели класса:

class_names = (valid_generator.class_indices)

class_names = dict((v,k) for k,v in class_names.items())
class_names_list = []
temp = []

for key, value in class_names.items():
    temp = value
    class_names_list.append(temp)

Дает мне:

{0: 'Green', 1: 'Half', 2: 'Moldy', 3: 'NoEmbryo', 4: 'OK', 5: 'Organic', 6: 'Stones'}

Что я делаю не так?

1 Ответ

0 голосов
/ 09 ноября 2018

Ваша проблема связана с преобразованием python в список. Когда ваш прогноз исходит от Предиката_генератора (), он выбирает из диктовку по ключу .

Во втором примере вы конвертируете его в список и используете индексы списка , что будет совсем другим результатом.

Я не совсем понимаю, для чего:

for key, value in class_names.items():
    temp = value
    class_names_list.append(temp)

Но если вы получите результат класса из class_names_list, вы получите неправильные результаты. Итак:

y_pred = np.argmax(result, axis = 1)
class_names[y_pred]

должно дать вам правильное значение.

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