Почему я не могу поместить данные изображения в model.predict в моем CNN?

#keras #neural-network #runtime-error #conv-neural-network

#keras #нейронная сеть #ошибка во время выполнения #conv-нейронная сеть

Вопрос:

Я построил и обучил свою модель CNN, и я хочу ее протестировать. Я написал скрипт, который принимает входное изображение из указанного пути к каталогу, затем я предварительно обработал изображение и изменил масштаб значений пикселей, чтобы они были между 0 и 1. Я также изменил размер изображения до нужных размеров и использовал model.predict() для прогнозирования. Однако, когда я запускаю код:

 from keras.models import Sequential
from keras_preprocessing.image import *
from keras.layers import *
import tensorflow as tf
import numpy as np
from keras.layers.experimental.preprocessing import Rescaling
import os
import cv2
from keras.models import *

img_size = 250

#Load weights into new model
filepath = os.getcwd()   "/trained_model.h5"

model = load_model(filepath)
print("Loaded model from disk")

#Scales the pixel values to between 0 to 1
#datagen = ImageDataGenerator(rescale=1.0/255.0)

#Prepares Testing Data

testing_dataset = cv2.imread(os.getcwd()   "/cats and dogs images/single test sample/505.png")
#img = datagen.flow_from_directory(testing_dataset, target_size=(img_size,img_size))

img = cv2.resize(testing_dataset, (img_size,img_size))
newimg = np.asarray(img)
pixels = newimg.astype('float32')
pixels /= 255.0
print(pixels.shape)


model.predict(x=pixels)
  

появляется эта ошибка:

 Loaded model from disk
(250, 250, 3)
Traceback (most recent call last):
  File "C:UsersJacksonDocumentsProgrammingPython ProjectsNeural Network That Deteremines Cats and DogsTest Trained Model.py", line 34, in <module>
    model.predict(x=pixels)
  File "C:UsersJacksonAppDataLocalProgramsPythonPython38libsite-packagestensorflowpythonkerasenginetraining.py", line 130, in _method_wrapper
    return method(self, *args, **kwargs)
  File "C:UsersJacksonAppDataLocalProgramsPythonPython38libsite-packagestensorflowpythonkerasenginetraining.py", line 1599, in predict
    tmp_batch_outputs = predict_function(iterator)
  File "C:UsersJacksonAppDataLocalProgramsPythonPython38libsite-packagestensorflowpythoneagerdef_function.py", line 780, in __call__
    result = self._call(*args, **kwds)
  File "C:UsersJacksonAppDataLocalProgramsPythonPython38libsite-packagestensorflowpythoneagerdef_function.py", line 823, in _call
    self._initialize(args, kwds, add_initializers_to=initializers)
  File "C:UsersJacksonAppDataLocalProgramsPythonPython38libsite-packagestensorflowpythoneagerdef_function.py", line 696, in _initialize
    self._stateful_fn._get_concrete_function_internal_garbage_collected(  # pylint: disable=protected-access
  File "C:UsersJacksonAppDataLocalProgramsPythonPython38libsite-packagestensorflowpythoneagerfunction.py", line 2855, in _get_concrete_function_internal_garbage_collected
    graph_function, _, _ = self._maybe_define_function(args, kwargs)
  File "C:UsersJacksonAppDataLocalProgramsPythonPython38libsite-packagestensorflowpythoneagerfunction.py", line 3213, in _maybe_define_function
    graph_function = self._create_graph_function(args, kwargs)
  File "C:UsersJacksonAppDataLocalProgramsPythonPython38libsite-packagestensorflowpythoneagerfunction.py", line 3065, in _create_graph_function
    func_graph_module.func_graph_from_py_func(
  File "C:UsersJacksonAppDataLocalProgramsPythonPython38libsite-packagestensorflowpythonframeworkfunc_graph.py", line 986, in func_graph_from_py_func
    func_outputs = python_func(*func_args, **func_kwargs)
  File "C:UsersJacksonAppDataLocalProgramsPythonPython38libsite-packagestensorflowpythoneagerdef_function.py", line 600, in wrapped_fn
    return weak_wrapped_fn().__wrapped__(*args, **kwds)
  File "C:UsersJacksonAppDataLocalProgramsPythonPython38libsite-packagestensorflowpythonframeworkfunc_graph.py", line 973, in wrapper
    raise e.ag_error_metadata.to_exception(e)
ValueError: in user code:

    C:UsersJacksonAppDataLocalProgramsPythonPython38libsite-packagestensorflowpythonkerasenginetraining.py:1462 predict_function  *
        return step_function(self, iterator)
    C:UsersJacksonAppDataLocalProgramsPythonPython38libsite-packagestensorflowpythonkerasenginetraining.py:1452 step_function  **
        outputs = model.distribute_strategy.run(run_step, args=(data,))
    C:UsersJacksonAppDataLocalProgramsPythonPython38libsite-packagestensorflowpythondistributedistribute_lib.py:1211 run
        return self._extended.call_for_each_replica(fn, args=args, kwargs=kwargs)
    C:UsersJacksonAppDataLocalProgramsPythonPython38libsite-packagestensorflowpythondistributedistribute_lib.py:2585 call_for_each_replica
        return self._call_for_each_replica(fn, args, kwargs)
    C:UsersJacksonAppDataLocalProgramsPythonPython38libsite-packagestensorflowpythondistributedistribute_lib.py:2945 _call_for_each_replica
        return fn(*args, **kwargs)
    C:UsersJacksonAppDataLocalProgramsPythonPython38libsite-packagestensorflowpythonkerasenginetraining.py:1445 run_step  **
        outputs = model.predict_step(data)
    C:UsersJacksonAppDataLocalProgramsPythonPython38libsite-packagestensorflowpythonkerasenginetraining.py:1418 predict_step
        return self(x, training=False)
    C:UsersJacksonAppDataLocalProgramsPythonPython38libsite-packagestensorflowpythonkerasenginebase_layer.py:975 __call__
        input_spec.assert_input_compatibility(self.input_spec, inputs,
    C:UsersJacksonAppDataLocalProgramsPythonPython38libsite-packagestensorflowpythonkerasengineinput_spec.py:191 assert_input_compatibility
        raise ValueError('Input '   str(input_index)   ' of layer '  

    ValueError: Input 0 of layer sequential is incompatible with the layer: : expected min_ndim=4, found ndim=3. Full shape received: [None, 250, 3]
  

Что я делаю не так или я просто что-то упускаю?
Кроме того, я пробовал то же самое с model.predict_classes() и model.predict_generator() , но появляется та же ошибка.

Ответ №1:

Если вы делаете все правильно в отношении формы ввода изображения, чтобы она соответствовала требуемой форме ввода модели, то, скорее всего, модель ожидает получения пакета изображений размером (250, 250, 3), поэтому, если у вас есть изображение, которое вы хотите протестировать на входеформа должна иметь размер (1, 250, 250, 3) это означает, что вы передаете пакет изображений размером 1.

Ваше сообщение об ошибке означает, что модель ожидает, что входная форма имеет 4 измерения, и была передана входная форма из 3 измерений, вам нужно включить измерение пакета, поэтому я думаю, что добавление этой строки после нормализации изображения должно заставить ее работать.

 pixels = np.expand_dims(pixels, axis=0)
  

При печати линии формы форма пикселей должна быть (1, 250, 250, 3)

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

1. Это сработало, спасибо, но могу я спросить, что на самом деле делает np.expand_dims и что означает указанный вами параметр оси?

2. np.expand_dims увеличивает размеры массива numpy по вертикали или горизонтали на 1 (добавляя размер строки или столбца) axis = 0 здесь означает, что вы добавляете размер к строкам, если вы хотите добавить его в столбец, который вам нужно будет сделать axis = 1, вы можете прочитать большепримерно здесь: numpy.org/doc/stable/reference/generated/numpy.expand_dims.html