如何解决ValueError:sequence_9层的输入0与该层不兼容::预期的min_ndim = 4,找到的ndim = 3收到的完整图形:[无,无,无]
ValueError: Input 0 of layer sequential_9 is incompatible with the layer: : expected min_ndim=4,found ndim=3. Full shape received: [None,None,None]
这是主要代码:
model = createModel()
filesPath=getFilesPathWithoutSeizure(i,indexPat)
history=model.fit_generator(generate_arrays_for_training(indexPat,filesPath,end=75)##problem here
def createModel():
input_shape=(1,11,3840)
model = Sequential()
#C1
model.add(Conv2D(16,(5,5),strides=( 2,2),padding='same',activation='relu',data_format= "channels_first",input_shape=input_shape))
model.add(keras.layers.MaxPooling2D(pool_size=( 2,padding='same'))
model.add(Batchnormalization())
#C2
model.add(Conv2D(32,( 3,3),strides=(1,1),activation='relu'))#incertezza se togliere padding
model.add(keras.layers.MaxPooling2D(pool_size=(2,padding='same'))
model.add(Batchnormalization())
#c3
model.add(Conv2D(64,(3,strides=( 1,padding='same'))
model.add(Batchnormalization())
model.add(Flatten())
model.add(Dropout(0.5))
model.add(Dense(256,activation='sigmoid'))
model.add(Dropout(0.5))
model.add(Dense(2,activation='softmax'))
opt_adam = keras.optimizers.Adam(lr=0.00001,beta_1=0.9,beta_2=0.999,epsilon=1e-08,decay=0.0)
model.compile(loss='categorical_crossentropy',optimizer=opt_adam,metrics=['accuracy'])
return model
错误:
history=model.fit_generator(generate_arrays_for_training(indexPat,end=75),#end=75),#It take the first 75%
File "/home/user1/.local/lib/python3.8/site-packages/tensorflow/python/util/deprecation.py",line 324,in new_func
return func(*args,**kwargs)
File "/home/user1/.local/lib/python3.8/site-packages/tensorflow/python/keras/engine/training.py",line 1815,in fit_generator
return self.fit(
File "/home/user1/.local/lib/python3.8/site-packages/tensorflow/python/keras/engine/training.py",line 108,in _method_wrapper
return method(self,*args,line 1098,in fit
tmp_logs = train_function(iterator)
File "/home/user1/.local/lib/python3.8/site-packages/tensorflow/python/eager/def_function.py",line 780,in __call__
result = self._call(*args,**kwds)
File "/home/user1/.local/lib/python3.8/site-packages/tensorflow/python/eager/def_function.py",line 823,in _call
self._initialize(args,kwds,add_initializers_to=initializers)
File "/home/user1/.local/lib/python3.8/site-packages/tensorflow/python/eager/def_function.py",line 696,in _initialize
self._stateful_fn._get_concrete_function_internal_garbage_collected( # pylint: disable=protected-access
File "/home/user1/.local/lib/python3.8/site-packages/tensorflow/python/eager/function.py",line 2855,in _get_concrete_function_internal_garbage_collected
graph_function,_,_ = self._maybe_define_function(args,kwargs)
File "/home/user1/.local/lib/python3.8/site-packages/tensorflow/python/eager/function.py",line 3213,in _maybe_define_function
graph_function = self._create_graph_function(args,line 3065,in _create_graph_function
func_graph_module.func_graph_from_py_func(
File "/home/user1/.local/lib/python3.8/site-packages/tensorflow/python/framework/func_graph.py",line 986,in func_graph_from_py_func
func_outputs = python_func(*func_args,**func_kwargs)
File "/home/user1/.local/lib/python3.8/site-packages/tensorflow/python/eager/def_function.py",line 600,in wrapped_fn
return weak_wrapped_fn().__wrapped__(*args,**kwds)
File "/home/user1/.local/lib/python3.8/site-packages/tensorflow/python/framework/func_graph.py",line 973,in wrapper
raise e.ag_error_Metadata.to_exception(e)
ValueError: in user code:
/home/user1/.local/lib/python3.8/site-packages/tensorflow/python/keras/engine/training.py:806 train_function *
return step_function(self,iterator)
/home/user1/.local/lib/python3.8/site-packages/tensorflow/python/keras/engine/training.py:796 step_function **
outputs = model.distribute_strategy.run(run_step,args=(data,))
/home/user1/.local/lib/python3.8/site-packages/tensorflow/python/distribute/distribute_lib.py:1211 run
return self._extended.call_for_each_replica(fn,args=args,kwargs=kwargs)
/home/user1/.local/lib/python3.8/site-packages/tensorflow/python/distribute/distribute_lib.py:2585 call_for_each_replica
return self._call_for_each_replica(fn,args,kwargs)
/home/user1/.local/lib/python3.8/site-packages/tensorflow/python/distribute/distribute_lib.py:2945 _call_for_each_replica
return fn(*args,**kwargs)
/home/user1/.local/lib/python3.8/site-packages/tensorflow/python/keras/engine/training.py:789 run_step **
outputs = model.train_step(data)
/home/user1/.local/lib/python3.8/site-packages/tensorflow/python/keras/engine/training.py:747 train_step
y_pred = self(x,training=True)
/home/user1/.local/lib/python3.8/site-packages/tensorflow/python/keras/engine/base_layer.py:975 __call__
input_spec.assert_input_compatibility(self.input_spec,inputs,/home/user1/.local/lib/python3.8/site-packages/tensorflow/python/keras/engine/input_spec.py:191 assert_input_compatibility
raise ValueError('Input ' + str(input_index) + ' of layer ' +
ValueError: Input 0 of layer sequential_9 is incompatible with the layer: : expected min_ndim=4,None]
解决方法
Keras实际上总是隐藏0-th
维度,也称为batch
维度。实际上,在您放置input_shape = (A,B,C)
的所有位置均不应该提及批次尺寸,(A,C)
应该是一个对象的形状(在您的情况下为图像)。例如,如果您说input_shape = (1,11,3840)
,则实际上意味着用于训练或预测的数据应该是一个类似(7,1,3840)
的形状的numpy数组,即,训练中有7
个对象。因此,7
是批处理的大小,是要并行训练的对象数。
因此,如果您的一个对象(例如图像)的形状为(11,3840)
,那么您就必须在各处写上input_shape = (11,3840)
,而不必提及批量大小。
为什么Keras隐藏0-th
批次尺寸?由于keras期望批量大小不同,因此今天您可以提供7个对象,明天提供9个对象,并且相同的网络将同时适用于这两个对象。但是(11,3840)
的一个对象的形状永远不会改变,并且由函数generate_arrays_for_training()
生成的训练数据必须始终为(BatchSize,3840)
,其中BatchSize
可以变化,您可以生成一批1
或7
或9
对象-每个形状为(11,3840)
的图像。
如果所有图层的图像都应是3维的1通道,则必须扩展生成的训练数据的暗淡程度,请使用this function进行X = np.expand_dims(X,0)
,以使训练X数据为形状(1,3840)
,例如批处理1个对象,只有这样,您才能拥有input_shape = (1,3840)
。
我还看到您正在data_format= "channels_first"
处编写代码,默认情况下所有功能都是channels_last
,为了不到处编写此代码,您可以一次修改generate_arrays_for_training()
数据生成的数据,如果形状为X
的{{1}},则您进行(1,3840)
。您的频道将成为最后的维度。
转置将一个尺寸移动到另一位置。但是对于您的情况,因为您只有X = X.transpose(0,2,3,1)
个频道,而不是移调,您可以重塑例如形状为1
的{{1}}可以通过X
重塑形状,并且形状为(1,3840)
。仅当您不想在任何地方都写X = X.reshape(1,3840,1)
时才需要这样做,但是如果您不想美化代码而根本不需要转置/重塑,就不需要这样做!
我记得我过去的Keras不喜欢大小为1的尺寸,它基本上是尝试通过几种不同的功能将其移除,即,如果keras看到形状为(1,1)
的阵列,则几乎总是尝试对其进行整形成为"channels_first"
。因此(1,4)
实际上被忽略了。在这种情况下,可能唯一的解决方案是至少生成一批大小为2的图像。
您也可以阅读我的long answer,尽管它一点儿无关,但可以帮助您了解Keras中的训练/预测如何工作,尤其是您可以阅读编号为(2,4)
的最后一段。 / p>
更新:似乎是由于下一个修改的帮助而解决了该问题:
-
在数据生成功能中,需要进行两次变暗,即
np.expand_dims()
。 -
在数据生成功能中,还需要另一个
1-12
。 -
将网络输入形状的代码设置为
X = np.expand_dims(np.expand_dims(X,0),0)
。 -
在网络代码中,所有子串
X = X.transpose(0,1)
均被删除。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。