【问题标题】:InvalidArgumentError: 2 root error(s) found. (0) Invalid argument: Incompatible shapes: [4,3] vs. [4,4]InvalidArgumentError:找到 2 个根错误。 (0) 无效参数:不兼容的形状:[4,3] vs. [4,4]
【发布时间】:2020-07-18 03:07:19
【问题描述】:

在尝试为图像数据集训练多类分类模型(4 类)时,我遇到了以下错误。 即使我的输出张量的形状为 4,我也面临以下问题。 请告诉我如何解决此问题。

    Epoch 1/10
---------------------------------------------------------------------------
InvalidArgumentError                      Traceback (most recent call last)
<ipython-input-30-01c6f78f4d4f> in <module>
      4     epochs=epochs,
      5     validation_data=val_data_gen,
----> 6     validation_steps=total_val // batch_size
      7 )

/usr/local/lib/python3.6/dist-packages/tensorflow_core/python/keras/engine/training.py in fit_generator(self, generator, steps_per_epoch, epochs, verbose, callbacks, validation_data, validation_steps, validation_freq, class_weight, max_queue_size, workers, use_multiprocessing, shuffle, initial_epoch)
   1294         shuffle=shuffle,
   1295         initial_epoch=initial_epoch,
-> 1296         steps_name='steps_per_epoch')
   1297 
   1298   def evaluate_generator(self,

/usr/local/lib/python3.6/dist-packages/tensorflow_core/python/keras/engine/training_generator.py in model_iteration(model, data, steps_per_epoch, epochs, verbose, callbacks, validation_data, validation_steps, validation_freq, class_weight, max_queue_size, workers, use_multiprocessing, shuffle, initial_epoch, mode, batch_size, steps_name, **kwargs)
    263 
    264       is_deferred = not model._is_compiled
--> 265       batch_outs = batch_function(*batch_data)
    266       if not isinstance(batch_outs, list):
    267         batch_outs = [batch_outs]

/usr/local/lib/python3.6/dist-packages/tensorflow_core/python/keras/engine/training.py in train_on_batch(self, x, y, sample_weight, class_weight, reset_metrics)
   1015       self._update_sample_weight_modes(sample_weights=sample_weights)
   1016       self._make_train_function()
-> 1017       outputs = self.train_function(ins)  # pylint: disable=not-callable
   1018 
   1019     if reset_metrics:

/usr/local/lib/python3.6/dist-packages/tensorflow_core/python/keras/backend.py in __call__(self, inputs)
   3474 
   3475     fetched = self._callable_fn(*array_vals,
-> 3476                                 run_metadata=self.run_metadata)
   3477     self._call_fetch_callbacks(fetched[-len(self._fetches):])
   3478     output_structure = nest.pack_sequence_as(

/usr/local/lib/python3.6/dist-packages/tensorflow_core/python/client/session.py in __call__(self, *args, **kwargs)
   1470         ret = tf_session.TF_SessionRunCallable(self._session._session,
   1471                                                self._handle, args,
-> 1472                                                run_metadata_ptr)
   1473         if run_metadata:
   1474           proto_data = tf_session.TF_GetBuffer(run_metadata_ptr)

InvalidArgumentError: 2 root error(s) found.
  (0) Invalid argument: Incompatible shapes: [4,3] vs. [4,4]
     [[{{node loss_2/predictions_loss/logistic_loss/mul}}]]
     [[loss_2/mul/_19047]]
  (1) Invalid argument: Incompatible shapes: [4,3] vs. [4,4]
     [[{{node loss_2/predictions_loss/logistic_loss/mul}}]]
0 successful operations.
0 derived errors ignored.

我的批量大小为 4,以下是模型的最后几层。

conv5_block16_2_conv (Conv2D)   (None, 16, 16, 32)   36864       conv5_block16_1_relu[0][0]       
__________________________________________________________________________________________________
conv5_block16_concat (Concatena (None, 16, 16, 1024) 0           conv5_block15_concat[0][0]       
                                                                 conv5_block16_2_conv[0][0]       
__________________________________________________________________________________________________
bn (BatchNormalization)         (None, 16, 16, 1024) 4096        conv5_block16_concat[0][0]       
__________________________________________________________________________________________________
relu (Activation)               (None, 16, 16, 1024) 0           bn[0][0]                         
__________________________________________________________________________________________________
avg_pool (GlobalAveragePooling2 (None, 1024)         0           relu[0][0]                       
__________________________________________________________________________________________________
predictions (Dense)             (None, 4)            4100        avg_pool[0][0]                   
==================================================================================================

损失函数

model.compile(optimizer='adam',
              loss=tf.keras.losses.BinaryCrossentropy(from_logits=True))

【问题讨论】:

  • 你确定你的损失是binaryCrossentropy吗?你有 4 个预测输出,试试SparseCategoricalCrossentropy
  • 如果我使用 SparseCategoricalCrossentropy InvalidArgumentError: 2 root error(s) found。 (0) 无效参数:logits 和标签必须具有相同的第一维,得到 logits 形状 [4,3] 和标签形状 [16] [[{{node loss_4/predictions_loss/SparseSoftmaxCrossEntropyWithLogits/SparseSoftmaxCrossEntropyWithLogits}}]] [[loss_4/ mul/_29295]] (1) 无效参数:logits 和标签必须具有相同的第一维,得到 logits 形状 [4,3] 和标签形状 [16] [[{{node loss_4/predictions_loss/SparseSoftmaxCrossEntropyWithLogits/SparseSoftmaxCrossEntropyWithLogits}}] ]

标签: python tensorflow keras deep-learning multiclass-classification


【解决方案1】:

我认为,形状没有问题,但是您正在尝试使用损失函数。理想情况下,对于多类分类,最后一层必须具有 softmax 激活(使您的 logits 总和为 1),如果您的标签是一个,则使用 CategoricalCrossentropy 作为损失函数hot 和 SparseCategoricalCrossentropy 如果您的标签是整数。 TensorFlow 文档附在下面。 https://www.tensorflow.org/api_docs/python/tf/keras/losses/CategoricalCrossentropy

要对您的代码进行的更改

    # adding softmax activation to final dense layer 
    predictions = Dense(4, activation='softmax')(avg_pool)
    # assuming you have one-hot labels 
    model.compile(optimizer='adam',loss=tf.keras.losses.CategoricalCrossentropy(from_logits=True)) 

【讨论】:

  • 如果我更改为 softmax 并丢失为 categorical,我将低于错误 InvalidArgumentError: 2 root error(s) found. (0) Invalid argument: logits and labels must be broadcastable: logits_size=[4,3] labels_size=[4,4] [[{{node loss_2/predictions_loss/softmax_cross_entropy_with_logits}}]] [[loss_2/mul/_15371]] (1) Invalid argument: logits and labels must be broadcastable: logits_size=[4,3] labels_size=[4,4] [[{{node loss_2/predictions_loss/softmax_cross_entropy_with_logits}}]] 0 successful operations. 0 derived errors ignored.
  • 尝试删除activation='softmax
  • 我不确定你为什么仍然得到 logits_size = [4,3]。您可以发布整个代码或相关代码以重新生成错误吗?
  • 我正在使用预先训练的权重(针对不同的类别进行训练)加载我的模型,这就是问题所在。使用选项 by_name=True 更改最终图层的名称和加载权重修复了该问题。感谢 Sriram 和 Shubham 的帮助
猜你喜欢
  • 1970-01-01
  • 2021-10-01
  • 2020-05-09
  • 2016-05-10
  • 1970-01-01
  • 2019-10-20
  • 2021-12-31
  • 2021-09-18
  • 2021-06-11
相关资源
最近更新 更多