我发现了这个数据集:https://www.kaggle.com/jessicali9530/stanford-dogs-dataset
我想自己尝试用机器学习进行实验,因为我之前在YouTube上尝试了一些指南。我不知道模型应该如何构建。我了解神经元和层的基本概念,但不确定为什么准确率和损失看起来不对。关于模型创建(激活、Conv2D、MaxPooling2D、Flatten、损失、优化器)有没有指南/解释?
我尝试通过试错法改变激活和损失来掌握概念。
我认为我的问题是这些
model = Sequential()model.add(Conv2D(64,(3,3),input_shape=X.shape[1:]))model.add(Activation("relu"))model.add(MaxPooling2D(pool_size=(2,2)))model.add(Conv2D(64,(3,3)))model.add(Activation("relu"))model.add(MaxPooling2D(pool_size=(2,2)))model.add(Flatten())model.add(Dense(64))model.add(Dense(1))model.add(Activation("softmax"))model.compile(loss="mean_squared_error", optimizer="adam", metrics=["accuracy"])
我的Jupyter笔记本文件:我的Jupyter笔记本文件
准确率和损失如您所见,准确率很差,损失值也远超出预期。
回答:
将狗的图像分类到各种类别中是一项分类任务。机器学习中有两种类型的问题:分类和回归。
分类涉及到类别标签,因此需要合适的损失函数。您应该使用categorical_crossentropy
损失函数,如下所示:
model.compile(loss="categorical_crossentropy", optimizer="adam", metrics=["accuracy"])
更多信息请参见这里。
均方误差(MSE)用于回归问题,因为它处理的是连续标签。它用于寻找特定数据集的最佳拟合线,使得MSE最小化。
我认为这应该能解决您的问题。如果问题仍然存在,请尝试以下步骤:
- 将学习率降低到0.0001甚至更小。
- 使用
Dropout
层。 - 使用
LeakyReLU
层。