Keras Prediction дает одинаковый результат для разных классов в тестовом наборе
Все .
Я использую трансферное обучение, чтобы построить новую модель на основе моих собственных образцов. Основой обучения является Keras 2.0+. Я изменил коды со ссылкой на эту страницу: Тонкая настройка InceptionV3 для нового набора классов https://keras.io/applications/
Ничто не идет не так на тренировочном этапе. Когда я тестирую модель, используя наборы тестов, каждое изображение дает один и тот же предсказанный класс, хотя они из разных классов. Пример:
>>> print(preds)
[[0.0000000e+00 4.5558951e-38 0.0000000e+00 0.0000000e+00 6.3798614e-36
8.4623914e-22 1.0000000e+00 1.0636564e-11]]
>>> print(pred_classes)
6
Я тестирую 10 картинок 8 классов, все дали 6 классов.
Какие-либо предложения?
Учебный код:
from keras.applications.inception_v3 import InceptionV3, preprocess_input
from keras.preprocessing import image
from keras.models import Model
from keras.layers import Dense, GlobalAveragePooling2D
from keras import backend as K
from keras.preprocessing.image import ImageDataGenerator
base_model = InceptionV3(weights='imagenet', include_top=False)
x = base_model.output
x = GlobalAveragePooling2D()(x)
x = Dense(1024, activation='relu')(x)
predictions = Dense(8, activation='softmax')(x)
model = Model(inputs=base_model.input, outputs=predictions)
for layer in base_model.layers:
layer.trainable = False
model.compile(optimizer='rmsprop', loss='categorical_crossentropy',metrics=['accuracy'])
train_datagen=ImageDataGenerator(preprocessing_function=preprocess_input)
train_generator=train_datagen.flow_from_directory('./TranningSet',
target_size=(224,224),
color_mode='rgb',
batch_size=32,
class_mode='categorical',
shuffle=True)
step_size_train=train_generator.n//train_generator.batch_size
model.fit_generator(generator=train_generator,
steps_per_epoch=step_size_train,
epochs=100,
use_multiprocessing=True)
Конечная точность поезда немного низкая, но около 70%
50/50 [==============================] - 297s 6s/step - loss: 4.2306 - acc: 0.7040
Epoch 99/100
50/50 [==============================] - 303s 6s/step - loss: 3.7681 - acc: 0.7387
Epoch 100/100
50/50 [==============================] - 293s 6s/step - loss: 3.7569 - acc: 0.7443
<keras.callbacks.History object at 0x7fd931756bd0>
>>>
Код прогноза:
import keras
from keras import backend as K
from keras.preprocessing.image import ImageDataGenerator
from keras.preprocessing import image
from keras.models import Model
import numpy as np
from keras.models import load_model
from keras.applications.inception_v3 import preprocess_input
model = load_model('/root/AIdetection/Keras/V6.5/20181217_V6.5.h5')
from keras.preprocessing import image
img =image.load_img('/root/AIdetection/Keras/V6.5/TestSet/Healthy50/20181026.06.JPG', target_size=(224, 224))
x = image.img_to_array(img)
x *= (255.0/x.max())
image = np.expand_dims(x, axis = 0)
image = preprocess_input(image)
preds = model.predict(image)
pred_classes = np.argmax(preds)
print(preds)
print(pred_classes)
1 ответ
Сбалансированы ли ваши тренировочные данные и вы перетасовываете их перед тренировкой? Другими словами, возможно ли, что большая часть ваших тренировочных данных относится к 6 классу, и он учится просто предсказывать 6 каждый раз?
Также убедитесь, что ваш тестовый набор находится в том же формате, что и ваш набор поездов. Делаете ли вы какой-либо тип обработки изображения перед передачей данных поезда в вашу модель?