ValueError:检查输入时出错:预期 conv2d_input 有 4 个维度,但得到了形状的数组(无,1)

Kim*_*404 5 python machine-learning conv-neural-network keras tensorflow

我完成了由 20 个类别组成的模型的训练,达到了 0.9993 的准确率,目前正在进行测试。我正在遵循本教程,但我收到错误

prediction = model.predict(['test1.jpg'])
Run Code Online (Sandbox Code Playgroud)

训练数据定义为

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

x = np.array(x).reshape(-1, IMG_SIZE, IMG_SIZE,1)
Run Code Online (Sandbox Code Playgroud)

这是我对 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"))
Run Code Online (Sandbox Code Playgroud)

这也是我对模型的总结

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
_________________________________________________________________
Run Code Online (Sandbox Code Playgroud)

我得到的错误是

-------------------------------------------------- ------------------------- ValueError Traceback(最近一次调用最后)在 ----> 1 预测 = model.predict(['test1. jpg'])

~\Anaconda3\envs\tensorflow_cpu\lib\site-packages\tensorflow_core\python\keras\engine\training.py 在预测(自我,x,batch_size,详细,步骤,回调,max_queue_size,工人,use_multiprocessing)907 max_queue_size = max_queue_size , 908 工人=工人, --> 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 中的预测(自我,模型,x,batch_size,详细,步骤,回调,**kwargs)460 返回自我。 _model_iteration( 461 模型,ModeKeys.PREDICT,x=x,batch_size=batch_size,verbose=verbose,--> 462 步骤=步骤,callbacks=回调,**kwargs) 463 464

_model_iteration 中的 ~\Anaconda3\envs\tensorflow_cpu\lib\site-packages\tensorflow_core\python\keras\engine\training_v2.py(自我、模型、模式、x、y、batch_size、详细、sample_weight、步骤、回调,** kwargs)442模式=模式,443训练上下文=训练上下文,-->444total_epochs=1)445cbks.make_logs(模型,epoch_logs,结果,模式)446

~\Anaconda3\envs\tensorflow_cpu\lib\site-packages\tensorflow_core\python\keras\engine\training_v2.py 在 run_one_epoch 中(模型、迭代器、execution_function、dataset_size、batch_size、策略、steps_per_epoch、num_samples、模式、training_context、total_epochs) 121step=step,mode=mode,size=current_batch_size)asbatch_logs:122try:-->123batch_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 inexecution_function(input_fn) 84 #numpy将张量转换为 Eager 模式下的值。85返回nest.map_struct(_non_none_constant_value,---> 86分布式函数(input_fn))87 88返回execution_function

~\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 结果 =第458章 459 第459章

~\Anaconda3\envs\tensorflow_cpu\lib\site-packages\tensorflow_core\python\eager\def_function.py in _call(self, *args, **kwds) 501 # 这是call的第一次调用,所以我们必须初始化。502initializer_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 in _initialize(self, args, kwds, add_initializers_to) 406 self._concrete_stateful_fn = ( 407 self._stateful_fn._get_concrete_function_internal_garbage_collected(

pylint:禁用=受保护的访问

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

〜\Anaconda3\envs\tensorflow_cpu\lib\site-packages\tensorflow_core\python\eager\function.py in _get_concrete_function_internal_garbage_collected(self, *args, **kwargs) 1846 如果 self.input_signature: 1847 args, kwargs = None, None -第1848章 第1849章 第1850章

第2148章 2148不服输
的人
是无: -> 2150 graph_function = self._create_graph_function(args, kwargs) 2151 self._function_cache.primary[cache_key] = graph_function 2152 返回 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_flat_arg_shapes=override_flat_arg_shapes, -> 2041 capture_by_value=self ._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(名称、python_func、args、kwargs、签名、func_graph、签名、autograph_options、add_control_dependency、arg_names、op_return_value、集合、 capture_by_value, override_flat_arg_shapes) 913 conversion_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 inwrapped_fn(*args, **kwds) 356 #wrapped允许AutoGraph 交换转换后的函数。我们给函数357 # 一个对其自身的弱引用以避免引用循环。--> 358 返回weak_wrapped_fn()。359章 360 第360章

〜\Anaconda3\envs\tensorflow_cpu\lib\site-packages\tensorflow_core\python\keras\engine\training_v2_utils.py 在distributed_function(input_iterator)71策略= distribution_strategy_context.get_strategy()72输出=策略.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 在experimental_run_v2(self, fn, args, kwargs) 758 fn = autograph.tf_convert(fn, ag_ctx.control_status_ctx(), 759 Convert_by_default=False) --> 760 返回 self._extended.call_for_each_replica(fn, args=args, kwargs=kwargs) 761 762 def reduce(self, reduce_op, value, axis):

call_for_each_replica(self, fn, args, kwargs) 中的 ~\Anaconda3\envs\tensorflow_cpu\lib\site-packages\tensorflow_core\python\distribute\distribute_lib.py (self, fn, args, kwargs) 1785 kwargs = {} 1786 与 self._container_strategy().scope()第1787章 1788 第1789章

〜\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(),
2131replica_id_in_sync_group=constant_op.constant(0, dtypes.int32)): -> 2132 返回 fn(*args, **kwargs) 2133 2134 def _reduce_to(self, reduce_op, value, 目的地):

~\Anaconda3\envs\tensorflow_cpu\lib\site-packages\tensorflow_core\python\autograph\impl\api.py 包装器(*args,**kwargs)290 def 包装器(*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 in _predict_on_batch(解析参数失败)160 def _predict_on_batch(模型,x,y =无,sample_weights =无):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 in Predict_on_batch(model, x) 357 # 验证和标准化用户数据。358 个输入, _, _ = model._standardize_user_data( --> 359 x, extract_tensors_from_dataset=True) 360 361 # 如果model._distribution_strategy为 True,则我们处于副本上下文中

~\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, validating_split, shuffle, extract_tensors_from_dataset) 2470 feed_input_shapes,
2471 check_batch_axis=False, # 不强制批量大小。-> 2472 exception_prefix='input') 2473 2474 # 获取输入数据的类型规范,并在必要时对其进行清理。

standardize_input_data 中的 ~\Anaconda3\envs\tensorflow_cpu\lib\site-packages\tensorflow_core\python\keras\engine\training_utils.py(数据、名称、形状、check_batch_axis、exception_prefix)

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

--> 565 'with shape ' + str(data_shape)) 566 如果不是 check_batch_axis: 567 data_shape = data_shape[1:]

ValueError:检查输入时出错:预期 conv2d_input 有 4 个维度,但得到了形状的数组(无,1)

Zab*_*azi 2

首先,您第一conv层的 input_shape 似乎是错误的。

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