Как использовать учебник по классификации изображений tenorflow для классификации невидимых изображений, не входящих в исходный набор данных обучения или проверки? - PullRequest
1 голос
/ 31 марта 2020

TensorFlow имеет этот учебник , который я могу запустить.

Затем я определяю эту функцию для использования модели:

def predict1(model,img):
    img = img.resize((150,150))  
    im = np.array(img)    
    im = im.reshape(-1,np.shape(im)[0],np.shape(im)[1],3)  # resize for 'batch'
    preds = model.predict(im)   # predict
    return preds

Затем фактически используйте ее :

img = Image.open('MYIMAGE.jpg')
predict1(model,img)

Вывод:

array([[3415.0505]], dtype=float32)

Я замечаю, что когда положительное число (здесь 3415.0505) соответствует одной из категорий, отрицательное число другой (я понимаю, это после нескольких попыток). Это хорошо, я могу написать функцию, которая возвращает мне строку 'dog' или 'cat', основанную на знаке возвращаемой строки.

Однако я думаю, что упускаю суть. Что может быть лучше для получения прогноза 'dog' или 'cat'?

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

1 Ответ

1 голос
/ 02 апреля 2020

Это основано на уроке, который вы пытаетесь сделать,

Я внес некоторые изменения в код в уроке, поскольку вы пытаетесь сделать категориальную классификацию, а не двоичную.

Для демонстрации
Для train_gen:

train_data_gen = train_image_generator.flow_from_directory(batch_size=batch_size,
                                                           directory=train_dir,
                                                           shuffle=True,
                                                           target_size=(IMG_HEIGHT, IMG_WIDTH),
                                                           class_mode='categorical') // change from binary to categorical

Для validation_gen:

val_data_gen = validation_image_generator.flow_from_directory(batch_size=batch_size,
                                                              directory=validation_dir,
                                                              target_size=(IMG_HEIGHT, IMG_WIDTH),
                                                              class_mode='categorical') // changed from binary to categorical

Я также обновил выходной слой начиная с его категориального

model = Sequential([
    Conv2D(16, 3, padding='same', activation='relu', input_shape=(IMG_HEIGHT, IMG_WIDTH ,3)),
    MaxPooling2D(),
    Conv2D(32, 3, padding='same', activation='relu'),
    MaxPooling2D(),
    Conv2D(64, 3, padding='same', activation='relu'),
    MaxPooling2D(),
    Flatten(),
    Dense(512, activation='relu'),
    Dense(2)  #Changed to 2 since you wanted a multiple output e.g.[ 0.333, -0.1333]
]) 

В части прогнозирования я использовал tf.math.argmax метод, он возвращает индекс самого высокого значения из прогноза.

listofLabels = ['dog', 'cat']
x = model.predict(sample_training_images)
labels = tf.math.argmax(x, axis = 1)
print(labels)
for label in labels:
    print(listofLabels[label])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...