Python TensorFlow:logits和labels必须具有相同的第一维度、Get logits形状[120,4]和labels形状[480]

Python TensorFlow:logits和labels必须具有相同的第一维度、Get logits形状[120,4]和labels形状[480],python,deep-learning,computer-vision,artificial-intelligence,tensorflow2.0,Python,Deep Learning,Computer Vision,Artificial Intelligence,Tensorflow2.0,我用手写数字图像创建了一个目标检测模型,我的模型有两个输出层,第一个是数字之间的分类,第二个是检测/定位数字的边界框坐标 输出=[Output1,Output2] 输出1=[0,1,2,3,4,5,6,7,8,9](10个单位的密集层) Output2=[x,y,w,h](密集层,边界框坐标为4个单位) 我面临着关于登录和标签形状的错误,我不明白为什么会发生这种错误,请帮助我解决 1/5纪元 回溯(最近一次呼叫最后一次): 文件“D:/obj_检测_和_分类/train_model.py”,

我用手写数字图像创建了一个目标检测模型,我的模型有两个输出层,第一个是数字之间的分类,第二个是检测/定位数字的边界框坐标

输出=[Output1,Output2]

输出1=[0,1,2,3,4,5,6,7,8,9](10个单位的密集层)

Output2=[x,y,w,h](密集层,边界框坐标为4个单位)

我面临着关于登录和标签形状的错误,我不明白为什么会发生这种错误,请帮助我解决

1/5纪元
回溯(最近一次呼叫最后一次):
文件“D:/obj_检测_和_分类/train_model.py”,第42行,in
模型拟合(序列,批次大小=120,历次=5,详细=1)
文件“C:\Users\Devanshu\AppData\Local\Programs\Python\Python38\lib\site packages\tensorflow\Python\keras\engine\training.py”,第1100行
tmp_logs=self.train_函数(迭代器)
文件“C:\Users\Devanshu\AppData\Local\Programs\Python\Python38\lib\site packages\tensorflow\Python\eager\def\function.py”,第828行,在\uu调用中__
结果=自身调用(*args,**kwds)
文件“C:\Users\Devanshu\AppData\Local\Programs\Python\Python38\lib\site packages\tensorflow\Python\eager\def_function.py”,第888行,在调用中
返回self.\u无状态\u fn(*args,**kwds)
文件“C:\Users\Devanshu\AppData\Local\Programs\Python\Python38\lib\site packages\tensorflow\Python\eager\function.py”,第2942行,在调用中__
返回图\函数。\调用\平面(
文件“C:\Users\Devanshu\AppData\Local\Programs\Python\Python38\lib\site packages\tensorflow\Python\eager\function.py”,第1918行,位于调用平面中
返回self.\u构建\u调用\u输出(self.\u推断\u函数.call(
调用中第555行的文件“C:\Users\Devanshu\AppData\Local\Programs\Python\Python38\lib\site packages\tensorflow\Python\eager\function.py”
输出=execute.execute(
文件“C:\Users\Devanshu\AppData\Local\Programs\Python\Python38\lib\site packages\tensorflow\Python\eager\execute.py”,第59行,在quick\u execute中
张量=pywrap\u tfe.tfe\u Py\u Execute(ctx.\u句柄、设备名称、操作名称、,
tensorflow.python.framework.errors\u impl.InvalidArgumentError:logits和labels必须具有相同的第一个维度,Get logits形状[120,4]和labels形状[480]
[[node SparseSoftmaxCrossEntropyWithLogits/SparseSoftmaxCrossEntropyWithLogits(定义于D:/obj_detection_和_classification/train_model.py:42)][Op:[Uu推理_train_函数_1524]
函数调用堆栈:
列车功能

将model.compile行从“SparseCategoricalCrossentropy”形式更改为“Category CrossEntropy”形式。如下面的示例代码所示,考虑坐标的不同损失函数

并且,在“验证数据输入形状是否正确”培训中,请参见下面示例代码中的line model.fit(…):

import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'
import tensorflow as tf
import pandas as pd
from tensorflow import keras
from tensorflow.keras import layers

input = tf.keras.Input(shape=(75, 75, 1))
x = tf.keras.layers.Conv2D(32, kernel_size=3, activation='relu')(input)
x = tf.keras.layers.MaxPooling2D((3,3), strides=(1,1), padding='same')(x)
x = tf.keras.layers.BatchNormalization()(x)
x = tf.keras.layers.Conv2D(64, kernel_size=3, activation='relu')(x)
x = tf.keras.layers.MaxPooling2D((3,3), strides=(1,1), padding='same')(x)
x = tf.keras.layers.BatchNormalization()(x)
x = tf.keras.layers.Conv2D(128, kernel_size=3, activation='relu')(x)
x = tf.keras.layers.MaxPooling2D((3,3), strides=(1,1), padding='same')(x)
x = tf.keras.layers.BatchNormalization()(x)
x = tf.keras.layers.Flatten()(x)
x = tf.keras.layers.Dense(128, activation='relu')(x)
output1 = tf.keras.layers.Dense(10, activation='softmax', name="label")(x)
output2 = tf.keras.layers.Dense(4, name="coordinates")(x)

model = tf.keras.Model(inputs=input, outputs=[output1, output2])

model.compile(loss={"label": tf.keras.losses.CategoricalCrossentropy(from_logits=False),"coordinates": tf.keras.losses.MeanSquaredError()},
              optimizer='adam', metrics=['accuracy'])

#model.compile(loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=False),
#              optimizer='adam', metrics=['accuracy'])

#Let's create a simulated data:
x_train=tf.random.uniform((55,75,75,1))
y_train_label=tf.random.uniform((55,10))
y_train_coordinate=tf.random.uniform((55,4))
y_train=[y_train_label,y_train_coordinate]

model.fit(x_train,{"label":y_train_label, "coordinates":y_train_coordinate},batch_size=120, epochs=5, verbose=1)

#model.fit(train, batch_size=120, epochs=5, verbose=1)
…因此,您应该得到如下结果:


这不起作用,显示了其他错误,请看一看答案中显示的结果是按配置进行的:Tensorflow 2.4.1、Keras 2.4.3和Python 3.8.0。您能用同样的方法测试代码吗?
Epoch 1/5
Traceback (most recent call last):
  File "D:/obj_detection_and_classification/train_model.py", line 42, in <module>
    model.fit(train, batch_size=120, epochs=5, verbose=1)
  File "C:\Users\Devanshu\AppData\Local\Programs\Python\Python38\lib\site-packages\tensorflow\python\keras\engine\training.py", line 1100, in fit
    tmp_logs = self.train_function(iterator)
  File "C:\Users\Devanshu\AppData\Local\Programs\Python\Python38\lib\site-packages\tensorflow\python\eager\def_function.py", line 828, in __call__
    result = self._call(*args, **kwds)
  File "C:\Users\Devanshu\AppData\Local\Programs\Python\Python38\lib\site-packages\tensorflow\python\eager\def_function.py", line 888, in _call
    return self._stateless_fn(*args, **kwds)
  File "C:\Users\Devanshu\AppData\Local\Programs\Python\Python38\lib\site-packages\tensorflow\python\eager\function.py", line 2942, in __call__
    return graph_function._call_flat(
  File "C:\Users\Devanshu\AppData\Local\Programs\Python\Python38\lib\site-packages\tensorflow\python\eager\function.py", line 1918, in _call_flat
    return self._build_call_outputs(self._inference_function.call(
  File "C:\Users\Devanshu\AppData\Local\Programs\Python\Python38\lib\site-packages\tensorflow\python\eager\function.py", line 555, in call
    outputs = execute.execute(
  File "C:\Users\Devanshu\AppData\Local\Programs\Python\Python38\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,
tensorflow.python.framework.errors_impl.InvalidArgumentError:  logits and labels must have the same first dimension, got logits shape [120,4] and labels shape [480]
     [[node sparse_categorical_crossentropy_1/SparseSoftmaxCrossEntropyWithLogits/SparseSoftmaxCrossEntropyWithLogits (defined at D:/obj_detection_and_classification/train_model.py:42) ]] [Op:__inference_train_function_1524]

Function call stack:
train_function

import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'
import tensorflow as tf
import pandas as pd
from tensorflow import keras
from tensorflow.keras import layers

input = tf.keras.Input(shape=(75, 75, 1))
x = tf.keras.layers.Conv2D(32, kernel_size=3, activation='relu')(input)
x = tf.keras.layers.MaxPooling2D((3,3), strides=(1,1), padding='same')(x)
x = tf.keras.layers.BatchNormalization()(x)
x = tf.keras.layers.Conv2D(64, kernel_size=3, activation='relu')(x)
x = tf.keras.layers.MaxPooling2D((3,3), strides=(1,1), padding='same')(x)
x = tf.keras.layers.BatchNormalization()(x)
x = tf.keras.layers.Conv2D(128, kernel_size=3, activation='relu')(x)
x = tf.keras.layers.MaxPooling2D((3,3), strides=(1,1), padding='same')(x)
x = tf.keras.layers.BatchNormalization()(x)
x = tf.keras.layers.Flatten()(x)
x = tf.keras.layers.Dense(128, activation='relu')(x)
output1 = tf.keras.layers.Dense(10, activation='softmax', name="label")(x)
output2 = tf.keras.layers.Dense(4, name="coordinates")(x)

model = tf.keras.Model(inputs=input, outputs=[output1, output2])

model.compile(loss={"label": tf.keras.losses.CategoricalCrossentropy(from_logits=False),"coordinates": tf.keras.losses.MeanSquaredError()},
              optimizer='adam', metrics=['accuracy'])

#model.compile(loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=False),
#              optimizer='adam', metrics=['accuracy'])

#Let's create a simulated data:
x_train=tf.random.uniform((55,75,75,1))
y_train_label=tf.random.uniform((55,10))
y_train_coordinate=tf.random.uniform((55,4))
y_train=[y_train_label,y_train_coordinate]

model.fit(x_train,{"label":y_train_label, "coordinates":y_train_coordinate},batch_size=120, epochs=5, verbose=1)

#model.fit(train, batch_size=120, epochs=5, verbose=1)