我用Tensorflow
编写了一个人脸分类程序。在这个项目中,起初我只有两张脸,所以我使用了binary_crossentropy
作为损失函数。当我决定添加更多人脸时,我从binary_crossentropy
切换到了categorical_crossentropy
。
我的代码:
以下是我的训练日志:
Epoch 1/201728/1728 [==============================] - 30s 13ms/step - loss: 0.0000e+00 - accuracy: 0.4833 - val_loss: 0.0000e+00 - val_accuracy: 0.4826Epoch 2/201728/1728 [==============================] - 22s 13ms/step - loss: 0.0000e+00 - accuracy: 0.4847 - val_loss: 0.0000e+00 - val_accuracy: 0.4826Epoch 3/201728/1728 [==============================] - 22s 13ms/step - loss: 0.0000e+00 - accuracy: 0.4827 - val_loss: 0.0000e+00 - val_accuracy: 0.4826
如你所见,我的val_loss
和val_accuracy
没有变化。我的代码有什么问题?我该如何修复?
回答:
如果提供了更多关于数据的信息,回答会更准确。
首先,你使用了分类交叉熵作为损失函数,同时最后层的激活函数使用了Sigmoid,这两者是矛盾的(Sigmoid意味着你在进行两类分类,而分类交叉熵是用于多类分类的情况)。要么将损失函数改为二元交叉熵,如果你想使用Sigmoid(这意味着你有两类),要么将Sigmoid改为Softmax函数,如果你想对多于两类进行分类。
此外,你需要在最后一个CNN层之后和第一个全连接层之前使用Flatten(它将特征图(一个矩阵)转换为一个向量,这是全连接层正确的输入形状)。
最后,完成上述修改后,你可以尝试调整你的超参数(学习率、批量大小等),看看是否能提高一些准确率。