首页 > 解决方案 > 张量流(使用Keras)中“InvalidArgumentError:不兼容的形状:[10,2] vs. [10]”的原因是什么?

问题描述

我正在尝试使用带有 Keras 的 Tensorflow 使用 CNN 进行对象检测。我对此相当陌生,所以我使用教程作为指南,但使用了我自己的设置和其他一些东西。我得到的错误是 Tensorflow 的形状与 [x,2] 与 [x] 不兼容,其中 x 是我拥有的任意数量的训练图像,2 是类的数量。我只使用少量图像进行测试,但我很确定这不是问题?

我尝试了不同倍数的训练图像,但没有成功,我查看了 model.summary() 以查看模型是否完全按照我想要的方式布局。此外,我还打印了我的训练图像的形状和它们的标签,它们看起来是正确的。

图像大小为 28 x 28 像素,平面大小为 784,完整形状为 (28,28,1),1 为通道数(灰度)。我只有两个课程,总共只有 10 个训练图像(如果这被认为是问题,我可以得到更多)。

model = Sequential()

model.add(InputLayer(input_shape=(img_size_flat,)))

model.add(Reshape(img_shape_full))

model.add(Conv2D(kernel_size=5, strides=1, filters=16, padding='same',
                 activation='relu', name='layer_conv1'))
model.add(MaxPooling2D(pool_size=2, strides=2))

model.add(Conv2D(kernel_size=5, strides=1, filters=36, padding='same',
                 activation='relu', name='layer_conv2'))
model.add(MaxPooling2D(pool_size=2, strides=2))

model.add(Flatten())

model.add(Dense(128, activation='relu'))

model.add(Dense(num_classes, activation='softmax'))

from tensorflow.python.keras.optimizers import Adam
optimizer = Adam(lr=1e-3)

model.compile(optimizer=optimizer,
              loss='categorical_crossentropy',
              metrics=['accuracy'])

from tensorflow.python.keras.utils import to_categorical
model.fit(x=data.train,
    y=to_categorical(data.train_labels),
    batch_size=128, epochs=1)

我在标签上使用 to_categorical() 只是因为它们以某种方式被转换为整数。我检查了他们是否保留了正确的值等。

我打印了模型摘要以检查布局:

_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
reshape (Reshape)            (None, 28, 28, 1)         0         
_________________________________________________________________
layer_conv1 (Conv2D)         (None, 28, 28, 16)        416       
_________________________________________________________________
max_pooling2d (MaxPooling2D) (None, 14, 14, 16)        0         
_________________________________________________________________
layer_conv2 (Conv2D)         (None, 14, 14, 36)        14436     
_________________________________________________________________
max_pooling2d_1 (MaxPooling2 (None, 7, 7, 36)          0         
_________________________________________________________________
flatten (Flatten)            (None, 1764)              0         
_________________________________________________________________
dense (Dense)                (None, 128)               225920    
_________________________________________________________________
dense_1 (Dense)              (None, 2)                 258       
=================================================================
Total params: 241,030
Trainable params: 241,030
Non-trainable params: 0
_________________________________________________________________
None

我打印了 numpy 数据的大小:

print(data.train.shape)
print(data.train_labels.shape)

哪个打印

(10, 784) #This is the shape of the images
(10, 2) #This is the shape of the labels

错误:

2019-04-08 10:46:40.239226: I tensorflow/stream_executor/dso_loader.cc:152] successfully opened CUDA library cublas64_100.dll locally
Traceback (most recent call last):
  File "C:/Users/bunja/Dev/testCellDet/project/venv/main.py", line 182, in <module>
    batch_size=128, epochs=1)
  File "C:\Users\bunja\Miniconda3\lib\site-packages\tensorflow\python\keras\engine\training.py", line 880, in fit
    validation_steps=validation_steps)
  File "C:\Users\bunja\Miniconda3\lib\site-packages\tensorflow\python\keras\engine\training_arrays.py", line 329, in model_iteration
    batch_outs = f(ins_batch)
  File "C:\Users\bunja\Miniconda3\lib\site-packages\tensorflow\python\keras\backend.py", line 3076, in __call__
    run_metadata=self.run_metadata)
  File "C:\Users\bunja\Miniconda3\lib\site-packages\tensorflow\python\client\session.py", line 1439, in __call__
    run_metadata_ptr)
  File "C:\Users\bunja\Miniconda3\lib\site-packages\tensorflow\python\framework\errors_impl.py", line 528, in __exit__
    c_api.TF_GetCode(self.status.status))
tensorflow.python.framework.errors_impl.InvalidArgumentError: Incompatible shapes: [10,2] vs. [10]
     [[{{node metrics/acc/Equal}}]]
     [[{{node loss/mul}}]]

可以看出,摘要显示dense_1 的输出形状为(None, 2)。这是我遇到问题的地方吗,因为我有一个不兼容形状的错误:[x,2] vs. [x]?我检查了我最初用来学习这些东西的教程,发现没有重大差异。我还是新手,所以可能有点小,我可能会遗漏一些信息,所以请询问您是否有任何问题。谢谢!!!!!

额外信息:

GPU:GeForce GTX 1080 主要:6 次要:1 memoryClockRate(GHz):1.7335

张量流版本:1.13.1

Python版本:Python 3.7.3

以下是对 to_categorical 形状的注释代码:

print(data.train_labels.shape)
print()
print(to_categorical(data.train_labels).shape)

输出:

(10, 2)

(10, 2, 2)

我有一种感觉,这可能是我错误的根源?但我不确定如何解决它......

标签: python-3.xtensorflowkerascomputer-visionobject-detection

解决方案


to_categorical通常在您拥有列表格式的标签并且需要执行one-hot编码以将其转换为正确的形状以在训练期间将其提供给模型时使用。

但是在您的情况下,您的标签已经与您在模型中定义的形状相同,因此one-hot不需要编码。

您可以查看Noneas batch_size,这将使您更清楚地了解数据是如何从输入转换到输出的。

谢谢!


推荐阅读