Python InvalidArgumentError:loc处所需的可广播形状(未知)

Python InvalidArgumentError:loc处所需的可广播形状(未知),python,tensorflow,neural-network,conv-neural-network,tf.keras,Python,Tensorflow,Neural Network,Conv Neural Network,Tf.keras,背景 我对Python和机器学习完全陌生。我只是试着根据我在互联网上找到的代码设置一个UNet,并想根据我正在一点一点地工作的情况调整它。尝试.fit将UNet调整到训练数据时,我收到以下错误: InvalidArgumentError: required broadcastable shapes at loc(unknown) [[node Equal (defined at <ipython-input-68-f1422c6f17bb>:1) ]] [Op:__inf

背景

我对Python和机器学习完全陌生。我只是试着根据我在互联网上找到的代码设置一个UNet,并想根据我正在一点一点地工作的情况调整它。尝试
.fit
将UNet调整到训练数据时,我收到以下错误:

InvalidArgumentError:  required broadcastable shapes at loc(unknown)
     [[node Equal (defined at <ipython-input-68-f1422c6f17bb>:1) ]] [Op:__inference_train_function_3847]
然后,我根据设置了UNet。在这里,我修改了几个参数以使UNet适应这种情况(多个类),即最后一层中的激活和损失函数:

layer_in = ks.layers.Input(shape = (imgr, imgc, imgdim))
# convert pixel integer values to float
inVals = ks.layers.Lambda(lambda x: x / 255)(layer_in)

# Contraction path
c1 = ks.layers.Conv2D(16, (3, 3), activation = "relu",
                            kernel_initializer = "he_normal", padding = "same")(inVals)
c1 = ks.layers.Dropout(0.1)(c1)
c1 = ks.layers.Conv2D(16, (3, 3), activation = "relu",
                            kernel_initializer = "he_normal", padding = "same")(c1)
p1 = ks.layers.MaxPooling2D((2, 2))(c1)

c2 = ks.layers.Conv2D(32, (3, 3), activation = "relu",
                            kernel_initializer = "he_normal", padding = "same")(p1)
c2 = ks.layers.Dropout(0.1)(c2)
c2 = ks.layers.Conv2D(32, (3, 3), activation = "relu",
                            kernel_initializer = "he_normal", padding = "same")(c2)
p2 = ks.layers.MaxPooling2D((2, 2))(c2)
 
c3 = ks.layers.Conv2D(64, (3, 3), activation = "relu",
                            kernel_initializer = "he_normal", padding = "same")(p2)
c3 = ks.layers.Dropout(0.2)(c3)
c3 = ks.layers.Conv2D(64, (3, 3), activation = "relu",
                            kernel_initializer = "he_normal", padding = "same")(c3)
p3 = ks.layers.MaxPooling2D((2, 2))(c3)
 
c4 = ks.layers.Conv2D(128, (3, 3), activation = "relu",
                            kernel_initializer = "he_normal", padding = "same")(p3)
c4 = ks.layers.Dropout(0.2)(c4)
c4 = ks.layers.Conv2D(128, (3, 3), activation = "relu",
                            kernel_initializer = "he_normal", padding = "same")(c4)
p4 = ks.layers.MaxPooling2D(pool_size = (2, 2))(c4)
 
c5 = ks.layers.Conv2D(256, (3, 3), activation = "relu",
                            kernel_initializer = "he_normal", padding = "same")(p4)
c5 = ks.layers.Dropout(0.3)(c5)
c5 = ks.layers.Conv2D(256, (3, 3), activation = "relu",
                            kernel_initializer = "he_normal", padding = "same")(c5)

# Expansive path 
u6 = ks.layers.Conv2DTranspose(128, (2, 2), strides = (2, 2), padding = "same")(c5)
u6 = ks.layers.concatenate([u6, c4])
c6 = ks.layers.Conv2D(128, (3, 3), activation = "relu",
                            kernel_initializer = "he_normal", padding = "same")(u6)
c6 = ks.layers.Dropout(0.2)(c6)
c6 = ks.layers.Conv2D(128, (3, 3), activation = "relu",
                            kernel_initializer = "he_normal", padding = "same")(c6)
 
u7 = ks.layers.Conv2DTranspose(64, (2, 2), strides = (2, 2), padding = "same")(c6)
u7 = ks.layers.concatenate([u7, c3])
c7 = ks.layers.Conv2D(64, (3, 3), activation = "relu",
                            kernel_initializer = "he_normal", padding = "same")(u7)
c7 = ks.layers.Dropout(0.2)(c7)
c7 = ks.layers.Conv2D(64, (3, 3), activation = "relu",
                            kernel_initializer = "he_normal", padding = "same")(c7)
 
u8 = ks.layers.Conv2DTranspose(32, (2, 2), strides = (2, 2), padding = "same")(c7)
u8 = ks.layers.concatenate([u8, c2])
c8 = ks.layers.Conv2D(32, (3, 3), activation = "relu",
                            kernel_initializer = "he_normal", padding = "same")(u8)
c8 = ks.layers.Dropout(0.1)(c8)
c8 = ks.layers.Conv2D(32, (3, 3), activation = "relu",
                            kernel_initializer = "he_normal", padding = "same")(c8)
 
u9 = ks.layers.Conv2DTranspose(16, (2, 2), strides = (2, 2), padding = "same")(c8)
u9 = ks.layers.concatenate([u9, c1], axis = 3)
c9 = ks.layers.Conv2D(16, (3, 3), activation = "relu",
                            kernel_initializer = "he_normal", padding = "same")(u9)
c9 = ks.layers.Dropout(0.1)(c9)
c9 = ks.layers.Conv2D(16, (3, 3), activation = "relu",
                            kernel_initializer = "he_normal", padding = "same")(c9)
 
out = ks.layers.Conv2D(1, (1, 1), activation = "softmax")(c9)
 
model = ks.Model(inputs = layer_in, outputs = out)
model.compile(optimizer = "adam", loss = "sparse_categorical_crossentropy", metrics = ["accuracy"])
model.summary()
最后,我定义了回调并运行了培训,这产生了错误:

cllbs = [
    ks.callbacks.EarlyStopping(patience = 4),
    ks.callbacks.ModelCheckpoint(dir_out("Checkpoint.h5"), save_best_only = True),
    ks.callbacks.TensorBoard(log_dir = './logs'),# log events for TensorBoard
    ]

model.fit(augGen, epochs = 5, validation_data = val_batches, callbacks = cllbs)
全控制台输出

这是运行最后一行时的完整输出(以防有助于解决问题):

trained=model.fit(augGen,epochs=5,validation\u data=val\u batches,callbacks=cllbs)
纪元1/5
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
trained=model.fit(augGen,epochs=5,validation\u data=val\u batches,callbacks=cllbs)
文件“c:\users\manuel\python\lib\site packages\tensorflow\python\keras\engine\training.py”,第1183行
tmp_logs=self.train_函数(迭代器)
文件“c:\users\manuel\python\lib\site packages\tensorflow\python\eager\def_function.py”,第889行,在调用中__
结果=自身调用(*args,**kwds)
文件“c:\users\manuel\python\lib\site packages\tensorflow\python\eager\def_function.py”,第950行,在调用中
返回self.\u无状态\u fn(*args,**kwds)
文件“c:\users\manuel\python\lib\site packages\tensorflow\python\eager\function.py”,第3023行,在调用中__
返回图\函数。\调用\平面(
文件“c:\users\manuel\python\lib\site packages\tensorflow\python\eager\function.py”,第1960行,位于调用平面中
返回self.\u构建\u调用\u输出(self.\u推断\u函数.call(
文件“c:\users\manuel\python\lib\site packages\tensorflow\python\eager\function.py”,第591行,在调用中
输出=execute.execute(
文件“c:\users\manuel\python\lib\site packages\tensorflow\python\eager\execute.py”,第59行,在quick\u execute中
张量=pywrap\u tfe.tfe\u Py\u Execute(ctx.\u句柄、设备名称、操作名称、,
InvalidArgumentError:loc处所需的可广播形状(未知)
[[node Equal(定义于:1)][Op:uu推理u训练u函数_3847]
函数调用堆栈:
列车功能

尝试检查ks.layers.concatenate层的输入是否具有相同的维度。例如ks.layers.concatenate([u7,c3]),在这里检查u7和c3张量的形状是否相同,除了输入到函数ks.layers.concatenate.axis=-1默认值,这是最后一个维度。为了说明是否给定ks.layers.concatenate([u7,c3],axis=0),那么除了u7和c3的第一个轴之外,所有其他轴的尺寸都应该完全匹配,例如,u7.shape=[3,4,5],c3.shape=[6,4,5]。

我在这里发现了几个问题。该模型旨在用于多个类的语义分段(这就是我将输出层激活更改为
“softmax”的原因)因此,在ImageDataGenerators中,
class\u mode
必须设置为
None
类不提供。相反,我需要将手动分类的图像插入为
y
。我猜初学者会犯很多初学者的错误

cllbs = [
    ks.callbacks.EarlyStopping(patience = 4),
    ks.callbacks.ModelCheckpoint(dir_out("Checkpoint.h5"), save_best_only = True),
    ks.callbacks.TensorBoard(log_dir = './logs'),# log events for TensorBoard
    ]

model.fit(augGen, epochs = 5, validation_data = val_batches, callbacks = cllbs)
trained = model.fit(augGen, epochs = 5, validation_data = val_batches, callbacks = cllbs)
Epoch 1/5
Traceback (most recent call last):

  File "<ipython-input-68-f1422c6f17bb>", line 1, in <module>
    trained = model.fit(augGen, epochs = 5, validation_data = val_batches, callbacks = cllbs)

  File "c:\users\manuel\python\lib\site-packages\tensorflow\python\keras\engine\training.py", line 1183, in fit
    tmp_logs = self.train_function(iterator)

  File "c:\users\manuel\python\lib\site-packages\tensorflow\python\eager\def_function.py", line 889, in __call__
    result = self._call(*args, **kwds)

  File "c:\users\manuel\python\lib\site-packages\tensorflow\python\eager\def_function.py", line 950, in _call
    return self._stateless_fn(*args, **kwds)

  File "c:\users\manuel\python\lib\site-packages\tensorflow\python\eager\function.py", line 3023, in __call__
    return graph_function._call_flat(

  File "c:\users\manuel\python\lib\site-packages\tensorflow\python\eager\function.py", line 1960, in _call_flat
    return self._build_call_outputs(self._inference_function.call(

  File "c:\users\manuel\python\lib\site-packages\tensorflow\python\eager\function.py", line 591, in call
    outputs = execute.execute(

  File "c:\users\manuel\python\lib\site-packages\tensorflow\python\eager\execute.py", line 59, in quick_execute
    tensors = pywrap_tfe.TFE_Py_Execute(ctx._handle, device_name, op_name,

InvalidArgumentError:  required broadcastable shapes at loc(unknown)
     [[node Equal (defined at <ipython-input-68-f1422c6f17bb>:1) ]] [Op:__inference_train_function_3847]

Function call stack:
train_function