Введите одно изображение в файл H5 и получите проценты для каждого класса в качестве выходных данных

#python #tensorflow #keras #prediction #h5py

#python #tensorflow #keras #прогнозирование #h5py

Вопрос:

Я использую базу данных рентгенографии COVID-19 для создания модели, которая предсказывает, есть ли у пользователя COVID-19 или нет.

Это код, который у меня есть:

 import tensorflow as tf
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import warnings
warnings.filterwarnings('ignore')

tf.random.set_seed(1234)

train_data_dir="X_train_data/"

#Used Sequential
model = tf.keras.Sequential()
model.add(tf.keras.layers.Conv2D(8, (3, 3), activation='relu', input_shape=(64, 64, 3)))
model.add(tf.keras.layers.MaxPooling2D(pool_size=(2,2), strides=None, padding="valid"))
model.add(tf.keras.layers.Conv2D(16, (3, 3), activation='relu'))
model.add(tf.keras.layers.MaxPooling2D(pool_size=(2,2), strides=None, padding="valid"))
model.add(tf.keras.layers.Flatten())
model.add(tf.keras.layers.Dense(32))
model.add(tf.keras.layers.Dropout(.1, input_shape=(32,)))
model.add(tf.keras.layers.Dense(1, activation='sigmoid'))

#Defining optimizer
from tensorflow.keras.optimizers import Adam

model.compile(optimizer=Adam(lr=0.0001), loss='binary_crossentropy', metrics=['accuracy'])

# Directing Images to train folder
from tensorflow.keras.preprocessing.image import ImageDataGenerator
img_height, img_width = 64,64
batch_size = 16
train_datagen = ImageDataGenerator(validation_split=0.3) # set validation split

train_generator = train_datagen.flow_from_directory(
    train_data_dir,
    target_size=(img_height, img_width),
    batch_size=batch_size,
    class_mode='binary',
    subset='training') # set as training data

# Splitting images for validation set
validation_generator = train_datagen.flow_from_directory(
    train_data_dir, # same directory as training data
    target_size=(img_height, img_width),
    batch_size=batch_size,
    class_mode='binary',
    subset='validation') # set as validation data

# Training the model
trainer=model.fit(train_generator, validation_data=validation_generator, epochs=10, verbose=2)

model.save("cnn_covid_x-ray_v1.h5") #you can load this model from output part
 

Я получаю точность обучения 97,82% и точность проверки 96,78%. Как мне теперь использовать мой h5 файл для прогнозирования? Например, я хочу ввести одно изображение, скажем, рентгеновский снимок COVID-19, и получить процент того, насколько вероятно, что оно принадлежит COVID-19 классу и насколько вероятно, что оно принадлежит NORMAL классу.

Комментарии:

1. Разве это не просто model = tf.keras.models.load_model("cnn_covid_x-ray_v1.h5") и prediction = model.predict(x_ray_img) ?

2. @Mr.ForExample Нет, это не так. Я не понимаю, почему вы считаете, что это всего 2 строки кода.

3. Разве то, что вы хотите, не является результатом простой двоичной классификации? чего еще вы хотите?

4. @Mr.ForExample Двоичная классификация даст либо 1, либо 0. Мне нужен процент для каждого из двух классов.

5. Model.predict является выводом последнего слоя модели, не даст вам 1 или 0, сигмоид в вашем случае даст вам значение float внутри диапазона (0, 1), что именно то, что вы хотите, ознакомьтесь с базовым руководством по бинарной классификации TF

Ответ №1:

Первое, что вам нужно сделать, это убедиться, что изображение, которое вы хотите использовать, проходит ту же предварительную обработку, которая использовалась для обучающих изображений. Я заметил, что вы не изменили масштаб изображений в ImageDataGenerator. Если они были изменены в чем-то ранее, убедитесь, что вы изменили масштаб ваших изображений таким же образом. Затем измените размер ваших изображений до 64 X 64. Передайте изображение в model.predict. В качестве выходных данных будет получено значение вероятности. Если значение меньше или равно .5, это класс 0, если больше .5, это класс 1. Чтобы узнать, какой из них какой, используйте class_dict=train_generator.class_indices. Распечатайте словарь. Оно имеет вид class name:index, где class name — это имя каталога, связанного с индексом. Например, если ваши каталоги были названы Covid и NonCovid, ваш словарь будет выглядеть как {Covid:0, NonCovid:1}

Комментарии:

1. Я изменил масштаб изображений. Размер исходного изображения составляет 256 x 256. Вот почему я сделал 64 x 64, когда я это сделал input_shape=(64, 64, 3) .