ValueError: ошибка при проверке ввода: ожидалось, что conv2d_input будет иметь 4 измерения, но получил массив с формой (None, 1)

Я закончил обучение своей модели, которая состоит из 20 классов и достигает точности 0,9993 и в настоящее время работаю над тестированием. Я следую этому руководству, но получаю ошибку на

prediction = model.predict(['test1.jpg'])

Данные обучения определяются как

for features, label in training_data:
    x.append(features)
    y.append(label)

x = np.array(x).reshape(-1, IMG_SIZE, IMG_SIZE,1)

и это мое определение cnn

x = pickle.load(open("x.pickle", "rb" ))
y = pickle.load(open("y.pickle", "rb"))

x = x/255.0

model = Sequential()
model.add(Conv2D(64,(3,3), input_shape = x.shape[1:IMG_SIZE]))
model.add(Activation("relu"))
model.add(MaxPool2D(pool_size=(2,2)))

model.add(Conv2D(64,(3,3), input_shape  = x.shape[1:IMG_SIZE]))
model.add(Activation("relu"))
model.add(MaxPool2D(pool_size=(2,2)))

model.add(Flatten())
model.add(Dense(64))

model.add(Dense(20))
model.add(Activation("sigmoid"))

здесь также мое резюме для моей модели

Model: "sequential"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
conv2d (Conv2D)              (None, 222, 222, 64)      640       
_________________________________________________________________
activation (Activation)      (None, 222, 222, 64)      0         
_________________________________________________________________
max_pooling2d (MaxPooling2D) (None, 111, 111, 64)      0         
_________________________________________________________________
conv2d_1 (Conv2D)            (None, 109, 109, 64)      36928     
_________________________________________________________________
activation_1 (Activation)    (None, 109, 109, 64)      0         
_________________________________________________________________
max_pooling2d_1 (MaxPooling2 (None, 54, 54, 64)        0         
_________________________________________________________________
flatten (Flatten)            (None, 186624)            0         
_________________________________________________________________
dense (Dense)                (None, 64)                11944000  
_________________________________________________________________
dense_1 (Dense)              (None, 20)                1300      
_________________________________________________________________
activation_2 (Activation)    (None, 20)                0         
=================================================================
Total params: 11,982,868
Trainable params: 11,982,868
Non-trainable params: 0
_________________________________________________________________

Я получаю ошибку

--------------------------------------------------------------------------- ValueError Traceback (последний вызов последним) в ----> 1 prediction = model.predict(['test1.jpg'])

~\Anaconda3\envs\tensorflow_cpu\lib\site-packages\tensorflow_core\python\keras\engine\training.py в прогнозе (self, x, batch_size, verbose, steps, callbacks, max_queue_size, worker, use_multiprocessing) 907 max_queue_size=max_queue_size = max_queue_size, 908 worker=worker, -> 909 use_multiprocessing = use_multiprocessing) 910 911 def reset_metrics(self):

~ \ Anaconda3 \ envs \ tensorflow_cpu \ lib \ site-packages \ tensorflow_core \ python \ keras \ engine \ training_v2.py в прогнозе (self, model, x, batch_size, verbose, steps, callbacks, **kwargs) 460 return self._model_iteration( 461 модель, ModeKeys.PREDICT, x=x, batch_size=batch_size, verbose=verbose, -> 462 шагов = шаги, обратные вызовы = обратные вызовы, ** kwargs) 463 464

~ \ Anaconda3 \ envs \ tensorflow_cpu \ lib \ site-packages \ tensorflow_core \ python \ keras \ engine \ training_v2.py в _model_iteration(self, model, mode, x, y, batch_size, verbose, sample_weight, шаги, обратные вызовы, **kwargs) 442 mode=mode, 443 training_context=training_context, -> 444 total_epochs=1) 445 cbks.make_logs(модель, epoch_logs, результат, режим) 446

~ \ Anaconda3 \ envs \ tensorflow_cpu \ lib \ site-packages \ tensorflow_core \ python \ keras \ engine \ training_v2.py в run_one_epoch(модель, итератор, функция_исполнения, размер_данных, размер_пакета, стратегия, шаги_за_эпох, num_samples, общий_показ_тренировки, режим) 121 step=step, mode=mode, size=current_batch_size) as batch_logs: 122 try:-> 123 batch_outs = execution_function(iterator) 124 except (StopIteration, errors.OutOfRangeError): 125 # TODO(kaftan): Ошибка файла о tf функция и ошибки.OutOfRangeError?

~ \ Anaconda3 \ envs \ tensorflow_cpu \ lib \ site-packages \ tensorflow_core \ python \ keras \ engine \ training_v2_utils.py в функции_исполнения (input_fn) 84 # numpyпереводит тензоры в значения в нетерпеливом режиме. 85 вернуть nest.map_structure(_non_none_constant_value, ---> 86 распределенная_функция (input_fn)) 87 88 вернуть выполнение_функции

~\Anaconda3\envs\tensorflow_cpu\lib\site-packages\tensorflow_core\python\eager\def_function.py в вызове(self, *args, **kwds) 455 456 tracing_count = self._get_tracing_count() -> 457 result = self._call(*args, **kwds) 458, если tracing_count == self._get_tracing_count(): 459 self._call_counter.called_without_tracing()

~\Anaconda3\envs\tensorflow_cpu\lib\site-packages\tensorflow_core\python\eager\def_function.py in _call (self, *args, **kwds) 501 # Это первый вызов вызова, поэтому мы должны инициализировать. 502 initializer_map = object_identity.ObjectIdentityDictionary()-> 503 self._initialize(args, kwds, add_initializers_to=initializer_map) 504 finally: 505 # На этом этапе мы знаем, что инициализация завершена (или меньше)

~\Anaconda3\envs\tensorflow_cpu\lib\site-packages\tensorflow_core\python\eager\def_function.py в _initialize(self, args, kwds, add_initializers_to) 406 self._concrete_stateful_fn = ( 407 self._concrete_concrete_concrete_concrete_concrete_fn

pylint: disable= защищенный доступ

-> 408 * args, **kwds)) 409410 def invalid_creator_scope (* unused_args, ** unused_kwds):

~ \ Anaconda3 \ envs \ tensorflow_cpu \ lib \ site-packages \ tensorflow_core \ python \ eager \ function.py в _get_concrete_function_internal_garbage_collected(self, *args, **kwargs) 1846, если self.input_signature: 1847 args, kwargs = None, None -> 1848 graph_function, _, _ = self._maybe_define_function(args, kwargs) 1849 return graph_function 1850

~ \ Anaconda3 \ envs \ tensorflow_cpu \ lib \ site-packages \ tensorflow_core \ python \ eager \ function.py в _maybe_define_function(self, args, kwargs) 2148
graph_function = self._function_cache.primary.get (cache_key, None)
2149 if graph_function равно None: -> 2150 graph_function = self._create_graph_function(args, kwargs) 2151 self._function_cache.primary[cache_key] = graph_function 2152 return graph_function, args, kwargs

~ \ Anaconda3 \ envs \ tensorflow_cpu \ lib \ site-packages \ tensorflow_core \ python \ eager \ function.py в _create_graph_function(self, args, kwargs, override_flat_arg_shapes) 2039 arg_names = arg_names, 2040_
override_hapes_flat_argride_argride_argride_argride_argride_argride_argride_argride_argride_argride_argride_argride_argride>._capture_by_value), 2042 self._function_attributes, 2043 # Сообщите ConcreteFunction очистить свой график, когда он выйдет из

~\Anaconda3\envs\tensorflow_cpu\lib\site-packages\tensorflow_core\python\framework\func_graph.py в func_graph_from_py_func(name, python_func, args, kwargs, signature, func_graph, autograph, autograph_options, add_control_dependencies, capture_by_value, override_flat_arg_shapes) 913 convert_func) 914 -> 915 func_outputs = python_func(*func_args, **func_kwargs) 916 917 # инвариант: func_outputs содержит только Tensors, CompositeTensors,

~\Anaconda3\envs\tensorflow_cpu\lib\site-packages\tensorflow_core\python\eager\def_function.py in wrapped_fn(*args, **kwds) 356 # wrapped позволяет AutoGraph заменять преобразованную функцию. Мы даем 357 # функции слабую ссылку на себя, чтобы избежать цикла ссылок.-> 358 вернуть weak_wrapped_fn().завернутый(* аргументы, **kwds) 359 weak_wrapped_fn = weakref.ref(wrapped_fn) 360

~ \ Anaconda3 \ envs \ tensorflow_cpu \ lib \ site-packages \ tensorflow_core \ python \ keras \ engine \ training_v2_utils.py в распределенной_функции (input_iterator) 71 strategy = distribution_strategy_context.get_strategy() 72 output = strategy.experimental_run_v2( ---> 73 per_replica_function, args=(model, x, y, sample_weights)) 74 # Из выходных данных PerReplica уменьшите или выберите значения для возврата. 75 all_outputs = dist_utils.unwrap_output_dict(

~ \ Anaconda3 \ envs \ tensorflow_cpu \ lib \ site-packages \ tensorflow_core \ python \ distribute \ distribute_lib.py в экспериментальном_run_v2(self, fn, args, kwargs) 758 fn = autograph.tf_convert(fn, ag_ctx.control_status(), 759 convert_by_default=False)-> 760 return self._extended.call_for_each_replica(fn, args = args, kwargs = kwargs) 761 762 def reduce (self, reduce_op, value, axis):

~ \ Anaconda3 \ envs \ tensorflow_cpu \ lib \ site-packages \ tensorflow_core \ python \ distribute \ distribute_lib.py в call_for_each_replica(self, fn, args, kwargs) 1785 kwargs = {} 1786 с self._container_strategy(). Scope (): -> 1787 return self._call_for_each_replica(fn, args, kwargs) 1788 1789 def _call_for_each_replica(self, fn, args, kwargs):

~ \ Anaconda3 \ envs \ tensorflow_cpu \ lib \ site-packages \ tensorflow_core \ python \ distribute \ distribute_lib.py в _call_for_each_replica(self, fn, args, kwargs) 2130
self._container_strategy (), 2131
replica_op_id_in_syn_sync dtypes.int32)): -> 2132 return fn(*args, **kwargs) 2133 2134 def _reduce_to(self, reduce_op, value, destination):

~ \ Anaconda3 \ envs \ tensorflow_cpu \ lib \ site-packages \ tensorflow_core \ python \ autograph \ impl \ api.py в оболочке (*args, **kwargs) 290 def wrapper(*args, **kwargs): 291 с ag_ctx.ControlStatusCtx(status=ag_ctx.Status.DISABLED): -> 292 return func(*args, **kwargs) 293 294 если inspect.isfunction(func) или inspect.ismethod(func):

~ \ Anaconda3 \ envs \ tensorflow_cpu \ lib \ site-packages \ tensorflow_core \ python \ keras \ engine \ training_v2_utils.py в _predict_on_batch(не удалось разрешить аргументы) 160 def _predict_on_batch(model, x, y=None, sample_weights=None): 161 del y, sample_weights-> 162 return predict_on_batch (model, x) 163 164 func = _predict_on_batch

~ \ Anaconda3 \ envs \ tensorflow_cpu \ lib \ site-packages \ tensorflow_core \ python \ keras \ engine \ training_v2_utils.py в pred_on_batch(model, x) 357 # Проверяйте и стандартизируйте пользовательские данные. 358 входов, _, _ = model._standardize_user_data(-> 359 x, extract_tensors_from_dataset=True) 360 361 # Еслиmodel._distribution_strategy верно, то мы находимся в контексте реплики

~\Anaconda3\envs\tensorflow_cpu\lib\site-packages\tensorflow_core\python\keras\engine\training.py в _standardize_user_data (self, x, y, sample_weight, class_weight, batch_size, check_steps, steps_name, steps, validation_split, shuffle, extract_tensors_from_dataset) 2470 feed_input_shapes,
2471 check_batch_axis = False, # Не устанавливать размер пакета. -> 2472 exception_prefix='input') 2473 2474 # Получить спецификации входных данных и при необходимости очистить их.

~ \ Anaconda3 \ envs \ tensorflow_cpu \ lib \ site-packages \ tensorflow_core \ python \ keras \ engine \ training_utils.py в standardize_input_data(данные, имена, формы, check_batch_axis, exception_prefix)

 563                            ': expected ' + names[i] + ' to have ' +
 564                            str(len(shape)) + ' dimensions, but got array '

-> 565 'with shape ' + str(data_shape)) 566, если не check_batch_axis: 567 data_shape = data_shape[1:]

ValueError: ошибка при проверке ввода: ожидалось, что conv2d_input будет иметь 4 измерения, но получил массив с формой (None, 1)

2 ответа

Решение

Прежде всего, ваш input_shape для первого conv слой кажется неправильным.

input_shape = (IMG_SIZE, IMG_SIZE,1)

model.add(Conv2D(64,(3,3), input_shape = (IMG_SIZE, IMG_SIZE,1))

Во-вторых, не нужно указывать input_shape для любых промежуточных слоев.

model.add(Conv2D(64,(3,3), input_shape = x.shape[1:IMG_SIZE])) должно быть

model.add(Conv2D(64,(3,3))

Вы пытаетесь предсказать по какой-то строке ['test1.jpg'], Почему? Вам необходимо подготовить данные, чтобы они имели ту же форму и распределение, что и при обучении - например, загрузить изображение, изменить его размер / обрезать до нужного размера, нормализовать, чтобы он находился в диапазоне[0,1] (если это то, что вы делали во время тренировки) и т. д.

Другие вопросы по тегам