我想用Keras训练一个简单的多层感知器。我的输入(x_train)是一个np.array,每个数据点由一个300维向量表示。我的输出应该是一个0、1或2的类别。形状如下:x_train: (5708, 300)y_train: (5708,)形状: (300,)
shape = x_train[0].shapemodel = Sequential()model.add(Dense(32, input_shape=shape))model.add(Activation('relu'))model.add(Dropout(0.5))model.add(Dense(16))model.add(Activation('relu'))model.add(Dense(num_classes))model.add(Activation('softmax'))model.compile(optimizer='sgd', loss='categorical_crossentropy', metrics=['accuracy'])history = model.fit(x_train, y_train, epochs=5)
在调用 model.fit 之后,我得到了以下错误:
ValueError: Error when checking target: expected activation_3 to have shape (None, 3) but got array with shape (5708, 1)
哪里出错了?activation_3 是哪一层?
回答:
错误发生在比较你的网络输出(形状为5708 x 3)和你提供的y_train(形状为5708 x 1)时。
你的网络输出形状为批量大小 x 类别数,即5708 x 3(三个输出类别的概率分布),因此真实标签应该进行独热编码,以便能够使用分类交叉熵损失函数。
因此,对于任何300维的输入样本向量,真实标签应该为以下之一:[1, 0, 0], [0, 1, 0] 或 [0, 0, 1]。