Классификация изображений Tensorflow Python всегда говорит один и тот же ответ - PullRequest
0 голосов
/ 21 февраля 2019

Я написал код распознавания изображений для одного из моих классов.Я классифицирую «хорошие» и «плохие» ультразвуковые изображения сердца.У меня проблема в том, что классификатор всегда предсказывает, что изображение «хорошее».В данный момент у меня не так много изображений для сортировки, поэтому точность составляет всего около 50%, однако я не уверен, почему аппарат всегда считает, что изображение хорошее.

Примеры изображений:

Вот плохое изображение

Вот хорошее изображение

Есть советы?Я предоставил код ниже:

#required imports

#using sequential from tensorflow 

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


#classification model to be sequential
classifier = Sequential()

classifier.add(Conv2D(32, (3, 3), input_shape = (64, 64, 3), activation = 'relu'))
classifier.add(MaxPooling2D(pool_size = (2, 2)))
classifier.add(Flatten())
classifier.add(Dense(units = 128, activation = 'relu'))

#output layer
classifier.add(Dense(units = 1, activation = 'sigmoid'))

#compilation
classifier.compile(optimizer = 'adam', loss = 'binary_crossentropy', metrics = ['accuracy'])

#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("/home/jovyan/dataset/training_set/", target_size = (64, 64), batch_size = 32, class_mode = 'binary')

test_set = test_datagen.flow_from_directory("/home/jovyan/dataset/test_set/", target_size = (64, 64), batch_size = 32, class_mode = 'binary')

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

#predictions
import numpy as np
from keras.preprocessing import image
test_image=image.load_img("/home/jovyan/dataset/test_set/test_bad_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='good'
else:
    prediction='bad'

print(prediction)`

Ответы [ 2 ]

0 голосов
/ 22 февраля 2019

Масштаб test_image необходимо изменить на 1./255 так же, как train_datagen и test_datagen.Поскольку «хорошо», по-видимому, имеет место, когда больше белой области, более высокие значения в test_image, вероятно, насыщают выходную активацию, чтобы всегда быть «хорошими».

0 голосов
/ 22 февраля 2019

Я не знаком с Keras, поэтому я просто допущу, что в вашем коде нет проблем, и попытаюсь дать два моих цента на ваш вопрос.

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

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

Если это не сработает, вы можете попробовать другие способы для обработки этого несбалансированного набора данных.

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