Python | Keras:ValueError:检查目标时出错:预期conv2d_3有4个维度,但得到了具有形状的数组(1006,5)

Python | Keras:ValueError:检查目标时出错:预期conv2d_3有4个维度,但得到了具有形状的数组(1006,5),python,python-3.x,neural-network,keras,conv-neural-network,Python,Python 3.x,Neural Network,Keras,Conv Neural Network,Keras在这个简单的例子中抛出了一条错误消息。我需要帮助。此外,是否有文档说明它对Conv2D和Input所期望的张量尺寸?花了太多的时间试图找到解决方案,并改变/旋转张量每一个方向 我的规格:Windows10x64、Python3.6(来自Anaconda3x64)、Keras2.09、TensorFlow 1.4.0 import numpy as np from keras.models import Model from keras.layers import Conv2D, Inp

Keras在这个简单的例子中抛出了一条错误消息。我需要帮助。此外,是否有文档说明它对
Conv2D
Input
所期望的张量尺寸?花了太多的时间试图找到解决方案,并改变/旋转张量每一个方向

我的规格:Windows10x64、Python3.6(来自Anaconda3x64)、Keras2.09、TensorFlow 1.4.0

import numpy as np
from keras.models import Model
from keras.layers import Conv2D, Input
from keras.utils.np_utils import to_categorical

n_samples, n_row, n_col, n_channels = 1006, 99, 81, 1

tX = np.random.rand(n_samples, n_row, n_col, n_channels)
tY = np.random.randint(0,5,n_samples)
inp = Input(shape=(n_row, n_col, n_channels))
lr = Conv2D(16, kernel_size=2, padding='same')(inp)
M = Model(inputs=inp, outputs=lr)
M.compile(optimizer='Adam',loss='categorical_crossentropy')
M.fit(tX, to_categorical(tY, num_classes=None))
给出错误消息:

Traceback (most recent call last):
  File "C:\Program Files (x86)\Microsoft Visual Studio\Shared\Anaconda3_64\lib\site-packages\IPython\core\interactiveshell.py", line 2862, in run_code
    exec(code_obj, self.user_global_ns, self.user_ns)
  File "<ipython-input-11-27bd9e59639d>", line 14, in <module>
    M.fit(tX, to_categorical(tY, num_classes=None))
  File "C:\Program Files (x86)\Microsoft Visual Studio\Shared\Anaconda3_64\lib\site-packages\keras\engine\training.py", line 1581, in fit
    batch_size=batch_size)
  File "C:\Program Files (x86)\Microsoft Visual Studio\Shared\Anaconda3_64\lib\site-packages\keras\engine\training.py", line 1418, in _standardize_user_data
    exception_prefix='target')
  File "C:\Program Files (x86)\Microsoft Visual Studio\Shared\Anaconda3_64\lib\site-packages\keras\engine\training.py", line 141, in _standardize_input_data
    str(array.shape))
ValueError: Error when checking target: expected conv2d_3 to have 4 dimensions, but got array with shape (1006, 5)
回溯(最近一次呼叫最后一次):
文件“C:\Program Files(x86)\Microsoft Visual Studio\Shared\Anaconda3\u 64\lib\site packages\IPython\core\interactiveshell.py”,第2862行,运行代码
exec(代码对象、self.user\u全局、self.user\n)
文件“”,第14行,在
M.fit(tX,to_分类(tY,num_类=无))
文件“C:\Program Files(x86)\Microsoft Visual Studio\Shared\Anaconda3\u 64\lib\site packages\keras\engine\training.py”,第1581行
批次大小=批次大小)
文件“C:\Program Files(x86)\Microsoft Visual Studio\Shared\Anaconda3\u 64\lib\site packages\keras\engine\training.py”,第1418行,在用户数据中
异常(前缀='target')
文件“C:\Program Files(x86)\Microsoft Visual Studio\Shared\Anaconda3\u 64\lib\site packages\keras\engine\training.py”,第141行,输入数据
str(array.shape))
ValueError:检查目标时出错:预期conv2d_3有4个维度,但得到了具有形状的数组(1006,5)

问题是你的模型毫无意义。卷积的输出具有形状(1006、99、81、16),因为您使用此输出构建了一个模型,所以它也是模型的输出。您的标签具有形状(1006,5)。为了计算损失函数,两个形状都必须匹配,但由于它们不匹配,因此Keras会由于输出形状意外而引发错误


修复它的一个简单方法是在卷积后添加一个
Dense(5,activation=“softmax”)
层,并将其作为模型输出,然后输出形状将是(1006,5)。该层只是作为卷积输出上的分类器。

您在损失函数中使用了
分类交叉熵
,而您只生成了一个带有
ty
的标签。这就是它抛出这个错误的原因。或者在你的标签中有许多类别,并对它们进行一个热编码,或者根据Lynain更改你的损失函数,谢谢注意。在这个简短的例子中,这是我的打字错误。我纠正了它,但同样的错误仍然存在。有什么想法吗?你把标签改成分类了吗?是的,我用Keras的
改成了\u category
,但没有用。仍然抛出相同的错误。我还更新了最新的所有关键软件包(tensorflow,keras,…)嗨,Matias,谢谢你的回答。请把你的密码寄出去好吗?它在你的机器上工作吗?当我将您的建议作为
lr=Dense(5,activation=“softmax”)(lr)
应用时,我仍然有相同的错误。我开始认为python环境出了问题,而不是代码本身。@OlegMelnikov我认为您没有收到相同的错误消息,它可能不同,所以请将其包括在这里。Matias,我认为您还想在
Dense()之前添加
flatte()
:)当我添加两个变换时,它会工作
fit
。还在检查一些东西。