ValueError:检查输入时出错:预期 conv2d_input 有 4 个维度,但得到的数组具有形状(无,1)
Posted
技术标签:
【中文标题】ValueError:检查输入时出错:预期 conv2d_input 有 4 个维度,但得到的数组具有形状(无,1)【英文标题】:ValueError: Error when checking input: expected conv2d_input to have 4 dimensions, but got array with shape (None, 1) 【发布时间】:2020-09-06 08:01:26 【问题描述】:我完成了包含 20 个类并达到 0.9993 准确度的模型的训练,目前正在进行测试。我正在关注this tutorial,但我遇到了错误
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 个预测 = model.predict(['test1.jpg'])
~\Anaconda3\envs\tensorflow_cpu\lib\site-packages\tensorflow_core\python\keras\engine\training.py in predict(self, x, batch_size, verbose, steps, callbacks, max_queue_size、workers、use_multiprocessing) 第907章 908名工人=工人, --> 909 使用_多处理=使用_多处理) 910 911 def reset_metrics(自我):
~\Anaconda3\envs\tensorflow_cpu\lib\site-packages\tensorflow_core\python\keras\engine\training_v2.py 在预测(自我,模型,x,batch_size,详细,步骤,回调, **kwargs) 460返回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(自我,模型,模式,x,y,batch_size,详细, sample_weight, 步骤, 回调, **kwargs) 442模式=模式, 第443章 --> 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(模型,迭代器,execution_function,dataset_size, batch_size,策略,steps_per_epoch,num_samples,模式, training_context,total_epochs) 121 step=step, mode=mode, size=current_batch_size) 作为batch_logs: 122 尝试: --> 123 batch_outs = execution_function(迭代器) 124 除了(StopIteration,errors.OutOfRangeError): 125 # TODO(kaftan): File bug about tf function and errors.OutOfRangeError?
~\Anaconda3\envs\tensorflow_cpu\lib\site-packages\tensorflow_core\python\keras\engine\training_v2_utils.py 在 execution_function(input_fn) 84 #
numpy
在 Eager 模式下将张量转换为值。 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 在调用(自我,*args,**kwds) 455 第456章 --> 457 结果 = self._call(*args, **kwds) 458如果tracing_count == self._get_tracing_count(): 第459章
~\Anaconda3\envs\tensorflow_cpu\lib\site-packages\tensorflow_core\python\eager\def_function.py 在 _call(self, *args, **kwds) 501 # 这是call的第一次调用,所以我们要初始化。 第502章 --> 503 self._initialize(args, kwds, add_initializers_to=initializer_map) 504最后: 505 # 至此我们知道初始化完成(或更少
~\Anaconda3\envs\tensorflow_cpu\lib\site-packages\tensorflow_core\python\eager\def_function.py 在 _initialize(self, args, kwds, add_initializers_to) 第406章 407 self._stateful_fn._get_concrete_function_internal_garbage_collected(
pylint: disable=protected-access
--> 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 在 _get_concrete_function_internal_garbage_collected(self, *args, **kwargs) 1846 if self.input_signature: 1847 args, kwargs = None, None -> 1848 图形函数,_,_ = self._maybe_define_function(args,kwargs)1849 返回图形函数 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 如果 graph_function 为无: -> 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章 -> 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_dependencies, arg_names、op_return_value、集合、capture_by_value、 override_flat_arg_shapes) 第913章 914 --> 915 func_outputs = python_func(*func_args, **func_kwargs) 916 917 # 不变量:
func_outputs
只包含张量,复合张量,~\Anaconda3\envs\tensorflow_cpu\lib\site-packages\tensorflow_core\python\eager\def_function.py 在 Wrapped_fn(*args, **kwds) 356 # wrapped 允许 AutoGraph 交换转换后的函数。我们给予 357 # 函数弱引用自身,避免引用循环。 --> 358 return weak_wrapped_fn().wrapped(*args, **kwds) 第359章 360度
~\Anaconda3\envs\tensorflow_cpu\lib\site-packages\tensorflow_core\python\keras\engine\training_v2_utils.py 在分布式函数(输入迭代器) 71 策略 = distribution_strategy_context.get_strategy() 72 个输出 = strategy.experimental_run_v2( ---> 73 per_replica_function, args=(model, x, y, sample_weights)) 74 # Out of 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章 第759章 --> 760 返回 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_id_in_sync_group=constant_op.constant(0, dtypes.int32)): -> 2132 return fn(*args, **kwargs) 2133 2134 def _reduce_to(self, reduce_op, value, destinations):
~\Anaconda3\envs\tensorflow_cpu\lib\site-packages\tensorflow_core\python\autograph\impl\api.py 在包装器中(*args,**kwargs) 290 def 包装器(*args,**kwargs): 291 与 ag_ctx.ControlStatusCtx(状态=ag_ctx.Status.DISABLED): --> 292 返回函数(*args,**kwargs) 293 294 if inspect.isfunction(func) 或 inspect.ismmethod(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=None,sample_weights=None): 第161章 --> 162 返回 predict_on_batch(model, x) 163 164 功能=_predict_on_batch
~\Anaconda3\envs\tensorflow_cpu\lib\site-packages\tensorflow_core\python\keras\engine\training_v2_utils.py 在 predict_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 in _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, 异常前缀)
563 ': expected ' + names[i] + ' to have ' + 564 str(len(shape)) + ' dimensions, but got array '
--> 565 '带形状' + str(data_shape)) 566 如果不是 check_batch_axis: 第567章
ValueError:检查输入时出错:预期 conv2d_input 有 4 尺寸,但得到了形状为 (None, 1) 的数组
【问题讨论】:
【参考方案1】:你试图预测某个字符串['test1.jpg']
,为什么?您需要将数据准备为与训练所用相同的形状和分布 - 例如 - 加载图像,将其调整大小/裁剪为相关大小,将其标准化为在[0,1]
范围内(如果这是你所做的在训练期间)等......
【讨论】:
是的,我刚刚意识到我没有像你说的那样准备数据,谢谢你帮我看看!【参考方案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))
【讨论】:
我按照您的建议进行了更改,但仍然出现相同的错误以上是关于ValueError:检查输入时出错:预期 conv2d_input 有 4 个维度,但得到的数组具有形状(无,1)的主要内容,如果未能解决你的问题,请参考以下文章
ValueError:检查输入时出错:预期的dense_26_input具有形状(45781,)但得到的数组具有形状(2,)
ValueError:检查输入时出错:预期 input_1 有 4 个维度,但得到的数组具有形状(无、无、无)
model.fit 给出 ValueError :检查输入时出错:预期的 conv2d 得到了形状为 () 的数组
ValueError:检查输入时出错:预期dense_11_input 具有3 维,但得到了形状为(0, 1) 的数组
ValueError:检查输入时出错:预期 lstm_1_input 具有 3 个维度,但得到的数组具有形状 (393613, 50)
ValueError:检查输入时出错:预期 permute_input 有 4 个维度,但得到了形状为 (1, 4) 的数组