【发布时间】:2018-11-12 21:31:24
【问题描述】:
我对机器学习相当陌生,这是我在 StackOverflow 上的第一篇文章。 我想训练一个 CNN,使它能够将我的脸与其他人区分开来。 我的模型在前 3 个 epoch 之后就停止了改进。
我在机器学习的在线数据库中找到了一些人脸,然后对它们进行居中、灰度和裁剪。我对我的网络摄像头从我脸上拍摄的照片做了同样的事情。
NN 的数据如下所示:
|输入 |输出 | | |---------------------- |-------- |--- | |我的脸| 0 | 1 | |别人的脸| 1 | 0 |到目前为止一切顺利。
然后我尝试使用以下结构训练 CNN:
model= Sequential()
# sort out the input layer later
model.add(Conv2D(32,3,3, activation='relu', input_shape=(100,100,3)))
model.add(MaxPooling2D((2,2)))
model.add(Conv2D(12,3,3, activation='relu'))
model.add(MaxPooling2D((2,2)))
model.add(Flatten())
model.add(Dense(600, activation='relu'))
model.add(Dense(60, activation='relu'))
#model.add(Dropout(p=0.2))
model.add(Dense(2, activation='softmax'))
model.summary()
epochs = 100
lrate = 0.01
decay = lrate/epochs
sgd = SGD(lr=lrate, momentum=0.9, decay=decay, nesterov=False)
#%%
model.compile(loss='categorical_crossentropy', optimizer="adam", metrics=['accuracy'])
我尝试了不同的优化器(sdg、adam、rmsprop),并对 CNN 的其他参数进行了一些尝试,但每次模型在前几个 epoch 之后都停止减少损失。
Epoch 1/100
2176/2176 [==============================] - 55s 25ms/step - loss: 1.8043 - acc: 0.8869
Epoch 2/100
2176/2176 [==============================] - 56s 26ms/step - loss: 1.7037 - acc: 0.8943
Epoch 3/100
2176/2176 [==============================] - 57s 26ms/step - loss: 1.7037 - acc: 0.8943
Epoch 4/100
对于这个例子,在 epoch 2 之后损失没有改善。
你知道为什么会这样吗?
【问题讨论】:
-
每个类有多少个样本?
-
我有 2941 个负样本。这些是多个随机人的多张照片。比如 294 个人,每 10 张照片,以及我自己的 308 张照片
-
除了类不平衡,正如 Merlin1896 所暗示的那样,您可以尝试使用更复杂的非
Sequential模型。 -
所以,给定你的数字,最愚蠢的分类器可以通过总是投票给负样本来达到 90.5% 的准确率。尝试在损失函数中添加一些类权重(这是keras的
fit函数的参数) -
看来你在做某事。我尝试将拆分从 10:90 减少到 50:50。现在每个时期的损失是恒定的 50%。所以没有更新权重,对吧?我现在就试试班级重量的事情
标签: python tensorflow keras face-recognition convolutional-neural-network