【问题标题】:Error when checking target: expected softmax_1 to have shape (1,) but got array with shape (2,)', Keras检查目标时出错:预期 softmax_1 的形状为 (1,),但得到的数组的形状为 (2,)',Keras
【发布时间】:2019-03-28 17:41:49
【问题描述】:

我第一次使用 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,) 的错误。但我已经明确提到了Dense 的单位为 2,softmax 返回与输入相同维度的输出。

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

【问题讨论】:

  • 您的代码对我来说似乎很好。确保标签数组的形状为(n_samples, 2)
  • 是的,它有形状(样本数,2)。这就是为什么我没有得到什么是错的?为什么错误是(1,),而它显然是(2,)
  • 我测试了你的代码,它可以在我的机器上运行。奇怪的是,如果目标形状正确,它会给你这个错误。尝试升级 Keras,看看是否解决。此外,您能否添加构建模型的代码以及fit 调用?
  • @今天我添加了 fit 电话。请检查一下

标签: python tensorflow machine-learning keras conv-neural-network


【解决方案1】:

问题是您使用sparse_categorical_crossentropy 作为损失函数。当给定标签(即Y_train)被编码为整数(即​​0、1、2、...)时,使用此损失函数。但是,如果标签是 one-hot 编码的,您的代码中似乎就是这种情况,您需要使用 categorical_crossentropy 作为损失函数。

【讨论】:

  • 非常感谢。这就是问题所在。 keras 文档页面没有正确描述损失。我正在从 tf 转换为 keras,不知道使用哪个来丢失。
猜你喜欢
  • 2020-06-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-07
  • 2019-01-16
  • 1970-01-01
  • 2021-06-30
  • 2020-12-10
相关资源
最近更新 更多