Python 检查目标时出错:预期softmax_1具有形状(1),但获得了具有形状(2)和#x27;的数组;,凯拉斯

Python 检查目标时出错:预期softmax_1具有形状(1),但获得了具有形状(2)和#x27;的数组;,凯拉斯,python,tensorflow,machine-learning,keras,conv-neural-network,Python,Tensorflow,Machine Learning,Keras,Conv Neural Network,我第一次使用Keras构建Conv-Net。我的图层如下: layers = [ Conv2D(8,kernel_size=(4,4),padding='same',input_shape=( 200, 180,3),kernel_initializer="glorot_normal",data_format="channels_first"), Activation("relu"), MaxPooling2D(pool_size=(8,8),padding='same',data_format

我第一次使用Keras构建Conv-Net。我的图层如下:

layers = [
Conv2D(8,kernel_size=(4,4),padding='same',input_shape=( 200, 180,3),kernel_initializer="glorot_normal",data_format="channels_first"),
Activation("relu"),
MaxPooling2D(pool_size=(8,8),padding='same',data_format='channels_first'),
Conv2D(16,(2,2),padding='same',kernel_initializer="glorot_normal"),
Activation("relu"),
MaxPooling2D(pool_size=(4,4),padding='same',data_format='channels_first'),
Conv2D(4,(3,3),padding='same',kernel_initializer="glorot_normal"),
Activation("relu"),
MaxPooling2D(pool_size=(2,2),padding='same',data_format='channels_first'),
Flatten(),
Dense(2,input_shape=(48,)),
Softmax(axis=-1)
]
#Edit, here is the part for compiling the model and fitting it
model = Sequential(layers)    

model.compile(optimizer="adam",loss="sparse_categorical_crossentropy" 
metrics=["accuracy"])
trainHistory = model.fit(x=X_train,y=Y_train,batch_size=3,epochs=1000)
我的标签数组的形状为
(,2)
。但是当我尝试在模型上使用fit时,它给了我一个错误,即
softmax_1
预期具有形状
(1,)
。但是我已经清楚地提到了密度为2的
单位,softmax返回与输入相同维度的输出


那么1是从哪里来的呢?我尝试使用1维的虚拟标签数组,它运行了。那么我做错了什么?如何使用我拥有的二维数组?

问题是您使用的是
稀疏\u分类\u交叉熵
作为损失函数。当给定标签(即
Y\u列
)被编码为整数(即0、1、2、…)时,使用该损失函数。但是,如果标签是一个热编码的标签(代码中似乎就是这种情况),则需要使用
categorical\u crossentropy
作为损失函数。

问题是您使用
sparse\u categorical\u crossentropy
作为损失函数。当给定标签(即
Y\u列
)被编码为整数(即0、1、2、…)时,使用该损失函数。但是,如果标签是一个热编码的,这在您的代码中似乎是这样,那么您需要使用
分类\u交叉熵
作为损失函数。

您的代码对我来说似乎很好。确保标签数组的形状为
(n_samples,2)
。是的,它的形状为(num of samples,2)。这就是为什么我不明白怎么回事?为什么错误是(1,)而它显然是(2,)我测试了你的代码,它在我的机器上工作。奇怪的是,如果目标形状是正确的,它会给你这个错误。尝试升级Keras,看看它是否已解决。此外,您能否添加构建模型的代码以及
fit
调用?@今天我添加了fit调用。请检查一下,我觉得你的代码很好。确保标签数组的形状为
(n_samples,2)
。是的,它的形状为(num of samples,2)。这就是为什么我不明白怎么回事?为什么错误是(1,)而它显然是(2,)我测试了你的代码,它在我的机器上工作。奇怪的是,如果目标形状是正确的,它会给你这个错误。尝试升级Keras,看看它是否已解决。此外,您能否添加构建模型的代码以及
fit
调用?@今天我添加了fit调用。请检查一下,谢谢。这就是问题所在。keras文档页面没有对损失的正确描述。我正在从tf转换为keras,不知道用哪个来弥补损失。非常感谢。这就是问题所在。keras文档页面没有对损失的正确描述。我正在从tf转换为keras,不知道该用哪个来弥补损失。