Хорошая точность, но неверный прогноз - PullRequest
0 голосов
/ 20 октября 2019

Я обучил модель с очень хорошей val_accuracy, но прогнозы полностью неверны. К сожалению, ответы на подобные вопросы мне не помогли. В моей сети есть проблема с несколькими метками. Конечным результатом является прогнозирование 3-х лучших меток для каждого изображения из альбома.

Это моя функция, которая делает вывод с предсказаниями.

classes = ["label1","label2","label3","label4","label5","label6","label7"]

def image_recognition(path):
    model = load_model(network)
    class = np.array(classes)
    for picture in os.listdir(path):
        pic = os.path.join(path, picture)
        pic = image.load_img(pic, target_size = (224, 224, 3))
        pic = image.img_to_array(pic)
        pic = pic/255
        prediction = model.predict(pic.reshape(1, 224, 224, 3))
        best = np.argsort(prediction[0])[:4:-1]

Мои генераторы:

aug = ImageDataGenerator(rescale = 1./255, 
                                   rotation_range = 40)

train_generator = aug.flow_from_dataframe(
                training,
                x_col = "filename",
                y_col = "labels",
                target_size = (224, 224),
                batch_size = 64,
                classes = classes,
                class_mode = 'categorical',
                shuffle = True)

validation_data = keras.preprocessing.image.ImageDataGenerator(rescale = 1./255)

validation_generator = validation_data.flow_from_dataframe(
                validation,
                x_col = "filename",
                y_col = "labels",
                target_size = (224, 224),
                batch_size = 64,
                classes = classes,
                class_mode = "categorical")

Это мой CNN:

model = models.Sequential()
model.add(pretrained)
model.add(layers.Dropout(0.3))
model.add(layers.Flatten())
model.add(layers.Dropout(0.3))
model.add(layers.Dense(256, activation = 'relu'))
model.add(layers.Dropout(0.3))
model.add(layers.Dense(7, activation = 'sigmoid'))

model.compile(loss = 'binary_crossentropy',
              optimizer = optimizers.RMSprop(lr = 2e-5),
              metrics = ['acc'])

history = model.fit_generator(
      train_generator,
      steps_per_epoch = train_steps,
      epochs = 15,
      validation_data = validation_generator,
      validation_steps = validation_steps)

Значение val_acc составляет 0,9527.

Ответы [ 2 ]

0 голосов
/ 21 октября 2019

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

0 голосов
/ 20 октября 2019

Я не думаю, что есть проблема с сигмоидом (при условии, что это задача с несколькими метками). Я бы посоветовал вам посмотреть на ваши данные, попытаться понять, что происходит. Возможно, ваш набор данных полностью отличается от реальных данных (посмотрите на ковариатный сдвиг). Просто убедитесь, что вы не пропускаете какую-либо информацию в набор проверки. Нет простого способа отладить происходящее, если проблема связана с данными.

...