Как я могу предсказать одно изображение в модели Keras CNN? - PullRequest
0 голосов
/ 28 января 2020

Я следую этому руководству, чтобы изучить классификацию изображений с CNN, и я внедрил этот код в свой набор данных:

https://www.tensorflow.org/tutorials/images/classification

Код обновлен

train_image_generator = ImageDataGenerator(rescale=1. / 255)  # Generator for our training data
validation_image_generator = ImageDataGenerator(rescale=1. / 255)  # Generator for our validation data

train_data_gen = train_image_generator.flow_from_directory(batch_size=batch_size,
                                                           directory=train_img_folder,
                                                           shuffle=True,
                                                           target_size=(IMG_HEIGHT, IMG_WIDTH),
                                                           class_mode='categorical',
                                                           color_mode='grayscale')

val_data_gen = validation_image_generator.flow_from_directory(batch_size=batch_size,
                                                              directory=valid_img_folder,
                                                              target_size=(IMG_HEIGHT, IMG_WIDTH),
                                                              class_mode='categorical',
                                                              color_mode='grayscale'
                                                              )

model = Sequential([
    Conv2D(16, 3, padding='same', activation='relu', input_shape=(IMG_HEIGHT, IMG_WIDTH, 1)),
    MaxPooling2D(),
    Conv2D(32, 3, padding='same', activation='relu'),
    MaxPooling2D(),
    Conv2D(64, 3, padding='same', activation='relu'),
    MaxPooling2D(),
    Flatten(),
    Dense(512, activation='relu'),
    Dense(3, activation='softmax')
])

model.compile(optimizer='adam',
              loss='categorical_crossentropy',
              metrics=['accuracy'])

history = model.fit_generator(
    train_data_gen,
    steps_per_epoch=total_train_value // batch_size,
    epochs=epochs,
    validation_data=val_data_gen,
    validation_steps=total_valid_value // batch_size
)

# Single prediction
img = []
temp = np.array(Image.open('path/to/pic.jpg').resize((256, 256), Image.ANTIALIAS))
temp.shape = temp.shape + (1,) # now its (256, 256, 1)
img.append(temp)
test = np.array(img) # (1, 1024, 1024, 1)
prediction = model.predict(test) 

Когда я пытаюсь использовать функциюgnatt_generator:

test_datagen = ImageDataGenerator(rescale=1 / 255.)

test_generator = test_datagen.flow_from_directory('test_images/',
                                                  classes=['0', '1', '2'],
                                                  color_mode='grayscale',
                                                  shuffle=True,
                                                  # use same size as in training
                                                  target_size=(256, 256))

preds = model.predict_generator(test_generator, steps=4) # I dont know what is steps doing. I put there because of error. 

Мой первый вопрос: я могу получить точность обучения и проверки, но я хочу получить прогноз одной картинки результат. Как я могу это сделать? Пример:

foo = model.predict(path/to/pic.jpg)
# foo returns 0-> 0.70 | 1-> 0.30

Добавлено: Когда я пытаюсь использовать модель.predict таким образом, я получаю эту ошибку:

ValueError: Error when checking input: expected conv2d_1_input to have 4 dimensions, but got array with shape (1024, 1024)

или преобразование в 2d (а также 3d) np.array still получил то же самое.

Мой второй вопрос: Есть ли способ предсказать без полного% 100? Я имею в виду, если у нас есть 2 класса (кошка и собака) и тестовая картинка луны, я хочу получить такие результаты:

%15 cat | %10 dog

не

%50 cat | %50 dog

Добавлено: Я пытался выставить класс мусора следующим образом. Когда я запускаю эту строку в строке history = model.fit_generator, я получаю следующую ошибку:

ValueError: Error when checking target: expected dense_2 to have shape (3,) but got array with shape (2,) 


Заранее спасибо

1 Ответ

2 голосов
/ 28 января 2020

Первый вопрос: я могу получить точность обучения и проверки, но я хочу получить результат предсказания одной картинки. Как я могу это сделать?

Как вы можете видеть в do c, вы можете полностью использовать model.predict(x), если ваш x:
- массив Numpy (или подобный массиву) или список массивов (в случае, если модель имеет несколько входов).
- диктов, отображающий имена входов в соответствующий массив / тензоры, если модель имеет именованные входы.
- Генератор или keras.utils.Sequence возвращение (входы, цели) или (входы, цели, веса выборки).

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

Второй вопрос: есть ли способ предсказать без полного% 100? Я имею в виду, что если у нас есть 2 класса (кошка и собака) и тестовая картинка луны, я хочу получить такие результаты:

Вы можете создать третий класс 'мусора', для этого вам понадобится изменить последний слой вашего net на:

Dense(3, activation='softmax')

и изменить потери на categorical_crossentropy

model.compile(optimizer='adam',
              loss='categorical_crossentropy',
              metrics=['accuracy'])

и изменить class_mode на categorical, а не binary.

В этом случае у вас будет собака: 15%, кошка: 10%, мусор: 75%

Редактировать при ошибке conv2D:

ValueError: Ошибка при проверке ввода: ожидалось, что conv2d_1_input будет иметь 4 измерения, но получил массив с формой (1024, 1024)

у вас есть:

Conv2D(16, 3, padding='same', activation='relu', input_shape=(IMG_HEIGHT, IMG_WIDTH, 3)),

Это означает, что an image (height, width, channel).
Как видно из do c, так как это слой input_layer, вам нужно предоставить формат в 4D с формой: (samples, rows, cols, channels). Если вы хотите дать только одно изображение, вам нужно иметь массив в виде (1, rows, cols, channels).

...