model.predict выдает одинаковый результат для всех изображений

Вопрос или проблема

Я пытаюсь создать модель, используя resnet50, для классификации изображений КТ как covid или нет. Однако при использовании model.predict с заданным изображением она выдает точно одинаковое значение для всех изображений, а именно:

array([[1.,0.]], dtype=float32)

Суммарная информация о модели:

Model: "sequential_2"
_________________________________________________________________
 Layer (type)                Output Shape              Param #   
=================================================================
 resnet50 (Functional)       (None, 2048)              23587712  
                                                                 
 flatten_2 (Flatten)         (None, 2048)              0         
                                                                 
 dropout_2 (Dropout)         (None, 2048)              0         
                                                                 
 dense_2 (Dense)             (None, 2)                 4098      
                                                                 
=================================================================
Total params: 23,591,810
Trainable params: 1,059,842
Non-trainable params: 22,531,968

Моя наивысшая точность была 0.754.

Вот код:

import tensorflow as tf
from tensorflow.keras.preprocessing.image import ImageDataGenerator
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Conv2D, MaxPooling2D
from tensorflow.keras.layers import Activation, Dropout, Flatten, Dense, BatchNormalization
import os
import pandas as pd
import numpy as np
import cv2
from tensorflow.keras.preprocessing.image import ImageDataGenerator
datagen= ImageDataGenerator(rescale=1./255,validation_split=0.2)
from tensorflow.keras.applications.resnet import ResNet50
from tensorflow.keras.applications.vgg19 import VGG19, preprocess_input
#from tensorflow.keras.applications.mobilenet_v2 import MobileNetV2 
from tensorflow.keras.layers import Flatten,Dense,Dropout,BatchNormalization
from tensorflow.keras.models import Model,Sequential
from tensorflow.keras.utils import to_categorical
from tensorflow.keras.layers import Conv2D, MaxPooling2D, BatchNormalization
from tensorflow.keras.layers import PReLU
from tensorflow.keras.optimizers import RMSprop

from tensorflow.keras.callbacks import ReduceLROnPlateau

base_dir = r'\filepath for dataset'
img_h,img_w= (164,164)
batch_size=32
epochs=10


base_model= ResNet50(include_top=False, weights="imagenet",
                                       input_tensor=None, input_shape= 
                                       (img_h,img_w,3),pooling='avg')
 
for layer in base_model.layers[:-7]:
    layer.trainable=False

 
model=Sequential()
model.add(base_model)
model.add(Flatten())
model.add(Dropout(0.4))


model.add(Dense(2,activation='softmax'))
model.summary()

for layer in base_model.layers:
    print(layer,"-->",layer.trainable)

from tensorflow.keras.optimizers import Adam,SGD,Adagrad,Adadelta,RMSprop
from tensorflow.keras.callbacks import ReduceLROnPlateau


reduce_learning_rate = ReduceLROnPlateau(monitor="loss",
                                         factor=0.1,
                                         patience=3,
                                         cooldown=2,
                                         min_lr=1e-10,
                                         verbose=1)

checkpoint =tf.keras.callbacks.ModelCheckpoint(filepath="reswtk.h5", 
                            monitor="val_accuracy",
                            verbose=1,
                            save_best_only=True, 
                            save_weights_only=False, 
                            mode="auto",
                            save_freq='epoch')


import time
class TimeHistory(tf.keras.callbacks.Callback):
    def on_train_begin(self, logs={}):
        self.times = []

    def on_epoch_begin(self, batch, logs={}):
        self.epoch_time_start = time.time()

    def on_epoch_end(self, batch, logs={}):
        self.times.append(time.time() - self.epoch_time_start)

time_callback = TimeHistory()

callbacks = [reduce_learning_rate, checkpoint, time_callback]
optimizer = RMSprop(lr=0.001, rho=0.9, epsilon=1e-08, decay=0.0)
model.compile( loss="categorical_crossentropy",optimizer= optimizer, metrics=['accuracy'])

train_generator = datagen.flow_from_directory(
        base_dir,  # Это исходный каталог для обучающих изображений
        target_size=(img_h, img_w),  
        batch_size=batch_size,
        class_mode="categorical",
        subset="training",
        #color_mode="rgb",
        shuffle=True)


validation_generator = datagen.flow_from_directory(
         base_dir,     
        target_size=(img_h, img_w),
        batch_size=batch_size,
        class_mode="categorical",
        #color_mode="rgb",
        subset="validation",
        shuffle=False)

history = model.fit(
      train_generator,
      steps_per_epoch=train_generator.samples//batch_size, 
      epochs=epochs,
      validation_data=validation_generator,
      validation_steps=validation_generator.samples//batch_size,  
      callbacks=callbacks,
      verbose=1)

model.evaluate(validation_generator,verbose=1)
accu= history.history['val_accuracy']

img = cv2.imread("\filepath to png file") 
image_resized= cv2.resize(img, (img_h,img_w))
img=np.expand_dims(image_resized,axis=0)
y_proba = model.predict(img)
y_classes = y_proba.argmax(axis=-1)
y_proba

вывод для этого:

array([[1.,0.]], dtype=float32)

и вывод для y_classes:

array([0], dtype=int64)

оба остаются неизменными для всех изображений.

Этот код работал первоначально. Однако я попытался установить np_utils через conda, и проблемы начались после этого. Я не уверен, удалил ли я какой-то код или нет.

Изменение значения размера пакета, похоже, сработало. Я установил

batch_size=10

и теперь модель предсказывает правильно. Не суперточно, но, по крайней мере, теперь дает разные предсказания.

Ответ или решение

Проблема, с которой вы столкнулись, когда model.predict выдаёт одинаковый результат для всех изображений, может иметь несколько причин. Разберём их подробно и предложим возможные решения.

Возможные причины проблемы:

  1. Инициализация модели или данные:

    • Если модель или её слои инициализированы с некорректными параметрами или веса модели случайно сброшены, это может привести к неспособности модели различать изображения.
    • Убедитесь, что данные загружаются и предобрабатываются правильно. Неправильный размер или форма могут влиять на предсказания.
  2. Переобучение или недообучение:

    • При высокой точности на тренировочных данных и плохой на тестовых это может указывать на переобучение. Наоборот, низкая точность в обоих случаях говорит о недообучении.
    • Данные аугментации или изменение гиперпараметров обучения могут помочь в таких случаях.
  3. Отсутствие разнообразия в данных:

    • Проверьте, что данные не односторонние и действительно содержат различные классы. Если данные случайно распределены неправильно (например, все данные относятся к одному классу), это может привести к подобной проблеме.
  4. Ошибки в коде или настройках модели:

    • Ошибки в коде или конфигурации моделей — например, блокировка всех слоёв для обучения или неправильная инициализация слоя классификаций — могут вызвать аналогичные результаты.
    • Проверьте, все ли слои настроены на обучение правильно. Убедитесь, что слои перед финальной классификацией обучаются.

Предложения по решению:

  1. Проверка данных и аугментации:

    • Убедитесь, что данные правильно загружаются. Попробуйте вручную проверить и визуализировать несколько изображений и их предобработки для подтверждения корректности.
    • Подумайте об увеличении данных. Аугментация поможет разнообразить тренировочный набор и улучшить результаты.
  2. Настройка обучения:

    • Попробуйте изменить гиперпараметры, такие как learning rate, или измените алгоритм оптимизации для оценки, как они влияют на способность модели к обучению.
    • Поменяйте batch size, как это было предложено вами. В вашей ситуации это помогло, что подтвердило важность экспериментов с параметрами во время обучения.
  3. Перепроверка модели:

    • Убедитесь, что все слои модели настроены корректно и ищите потенциальное несоответствие в активации или структурных решениях, которые могли бы повлиять на обучение.
    • Проверьте заморозку слоёв и убедитесь, что только последние слои разблокированы для обучения, если это необходимо.

Помимо вышесказанного, внимательно пересмотрите изменения, которые были произведены, начиная с момента, когда проблема начала проявляться. Иногда устранение ошибки требует возврата к более ранней версии рабочей модели и тщательного анализа последствий последующих изменений.

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

Оцените материал
Добавить комментарий

Капча загружается...