我第一次使用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)
。但是,当我尝试在模型上使用拟合时,它给了我softmax_1
预期形状为(1,)
的错误。但是我清楚地提到Dense
的单位为2,并且softmax返回与输入相同维的输出。那么1是哪里来的呢?我尝试使用1维的虚拟标签数组,它可以运行。那我在做什么错?如何使用已有的二维数组?
最佳答案
问题是您正在使用sparse_categorical_crossentropy
作为损失函数。当给定的标签(即Y_train
)被编码为整数(即0、1、2,...)时,将使用此损失函数。但是,如果标签是一键编码的(在您的代码中似乎是这种情况),则需要使用categorical_crossentropy
作为损失函数。
关于python - 检查目标时出错:预期softmax_1的形状为(1,),但数组的形状为(2,)',Keras,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52966765/