我想预测图像的类别。这些类别存储在一个标签数组中:array([0., 0., 1., ..., 2., 2., 0.], dtype=float32)
我有3个类别(0、1和2)
我的模型看起来像这样:
model = Sequential([Conv2D(16, 3, padding='same', activation='relu', input_shape=(64, 64 ,3)),MaxPooling2D(),Dropout(0.5),Conv2D(32, 3, padding='same', activation='relu'),MaxPooling2D(),Conv2D(64, 3, padding='same', activation='relu'),MaxPooling2D(),Dropout(0.5),Flatten(),Dense(512, activation='relu'),Dense(256),Dense(3, activation = 'relu')])
当我将最后一个Dense层的形状设置为3时,训练过程中损失和准确率完全没有变化。当我将最后一个Dense层的形状增加到5时,训练过程正常进行。为什么形状为三时不起作用呢?我毕竟有三个类别啊。
model.compile(optimizer='adam', loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True), metrics=['sparse_categorical_accuracy'])history = model.fit(train_images, train_labels, epochs=num_epochs, validation_data=(val_images, val_labels), callbacks = [tensorboard])
我也测试了sgd优化器,结果相同
回答:
你似乎在进行多类分类,但你在输出层的激活函数使用了relu
。对于多类分类,你应该在最后一层使用softmax
,并确保该层的神经元数量等于你要分类的类别数量。