#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)
.