Tensorflow: классификация изображений в пакетах

#tensorflow #batch-processing

#tensorflow #пакетная обработка

Вопрос:

Я следовал этому руководству по TensorFlow для классификации изображений с использованием метода обучения передаче. Используя почти 16 000 классифицированных вручную изображений (с разделением примерно 40/60 на 1/0), добавленных поверх предварительно подготовленной модели MobileNet V2, моя модель достигла точности 96% в наборе тестов hold out. Затем я сохранил полученную модель.

Далее я хотел бы использовать эту обученную модель для классификации новых изображений. Для этого я адаптировал одну из частей кода учебника (в конце, где написано #Получить пакет изображений из тестового набора) способом, описанным ниже. Код работает, однако он обрабатывает только одну партию из 32 изображений, и все (в исходной папке сотни изображений). Чего мне здесь не хватает? Пожалуйста, сообщите.

 # Import libraries
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import preprocessing
from tensorflow.keras.preprocessing import image_dataset_from_directory
import matplotlib.pyplot as plt
import numpy as np
import os

# Load saved model
model = tf.keras.models.load_model('/model')

# Re-compile model
base_learning_rate = 0.0001
model.compile(optimizer=tf.keras.optimizers.Adam(lr=base_learning_rate),
              loss=tf.keras.losses.BinaryCrossentropy(from_logits=True),
              metrics=['accuracy'])
# Define paths
PATH = 'Data/'             
new_dir = os.path.join(PATH, 'New_images') # New_images must contain at least one class (sub-folder)

IMG_SIZE = (640, 640)
BATCH_SIZE = 32

new_dataset = image_dataset_from_directory(new_dir, shuffle=True, batch_size=BATCH_SIZE, image_size=IMG_SIZE)

# Retrieve a batch of images from the test set
image_batch, label_batch = new_dataset.as_numpy_iterator().next()
predictions = model.predict_on_batch(image_batch).flatten()

# Apply a sigmoid since our model returns logits
predictions = tf.nn.sigmoid(predictions)
predictions = tf.where(predictions < 0.5, 0, 1)

print('Predictions:n', predictions.numpy())
len(new_dataset) # equals 25, i.e., there are 25 batches
 

Ответ №1:

Замените этот код:

 # Retrieve a batch of images from the test set
image_batch, label_batch = new_dataset.as_numpy_iterator().next()
predictions = model.predict_on_batch(image_batch).flatten()
 

с помощью этого:

 predictions = model.predict(new_dataset,batch_size=BATCH_SIZE).flatten()
 

tf.data.Dataset объекты могут быть переданы непосредственно в метод predict() . Ссылка

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

1. Большое вам спасибо за ваш ответ, @kindustrii Я попробовал предложенный подход, однако он по-прежнему дает мне небольшое количество прогнозов при запуске predict (вывод: <tf.Tensor: shape=(32,), dtype=int32, numpy=array([1, 1, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 1, 0, 1, 1, 1, 0, 1],dtype=int32)>)

2. Я отредактирую свой ответ, потому что я не понял, что вы используете этот model.predict_from_batch() метод. Этот метод возвращает прогнозы только для одной партии образцов.

3. Большое вам спасибо! Ваше решение сработало.