python-3.x - tensorflow (使用 Keras)中出现 'InvalidArgumentError: Incompatible shapes: [10,2] vs. [10]' 的原因是什么?

标签 python-3.x tensorflow keras computer-vision object-detection

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

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

图像大小为 28 x 28 像素,平面大小为 784,完整形状为 (28,28,1),1 是 channel 数(灰度)。我只有两个类,总共只有 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 内存时钟频率(GHz):1.7335

tensorflow 版本: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)

我感觉这可能是我错误的根源?但我不知道如何解决它......

最佳答案

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

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

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

谢谢!

关于python-3.x - tensorflow (使用 Keras)中出现 'InvalidArgumentError: Incompatible shapes: [10,2] vs. [10]' 的原因是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55574929/

相关文章:

python - 除了内置属性之外,还有其他方法可以遍历自定义类的属性吗?

python-3.x - 即使在为 AWS EBCLI 成功安装虚拟环境后,ModuleNotFoundError : No module named 'virtualenv' Exiting due to failure,

javascript - 将预测张量转换为图像

python - 将 xml 文件转换为 tfrecord 文件时出错

python - keras图像数据生成器.flow_from_directory(directory)统一/组合类

api - Keras 函数式 API 的语法

python - 如何点击表单中的提交按钮?

python - 运行 Flask 应用程序时没有名为 app 的模块

tensorflow - 无法使用 TensorFlow 0.7.1 在 TensorBoard 中可视化 Inception v3 模型

python - 有没有一种Python方法可以减少卷积神经网络的训练时间?