我每个人都试图实现SAMME,这是一个多级版本的AdaBoost,使用神经网络作为Keras中的弱分类器。该计划有效,但我遇到了一些问题:
我使用Prob
作为我的样本的权重,我以均匀概率开始,然后通过增加先前分类器无法正确分类的样本的权重来更新。一切似乎都很好,但第二个分类器的准确率从90%提高到10%;以下迭代的准确率很低〜15%,甚至更低。
AdaBoost这是正常的吗?我在体重更新或其他方面有一些问题?也许重量变小(重量之和为1,我有~24K样本),所以在训练中它们都被忽略了?
这是我的代码:
Prob = np.ones(mfsc_train.shape[0])/mfsc_train.shape[0]
fv_train = np.expand_dims(mfsc_train, axis=-1)
fv_val = np.expand_dims( mfsc_val, axis=-1)
for i in range(0, FLAGS.iter ,1):
print("\nWeak Classifier: {}".format(i))
#train DNN for this subset
model = load_model(FLAGS.mdir+FLAGS.model)
#model.summary()
sgd = SGD(lr=0.01, momentum=0.8, nesterov=False)
model.compile(loss='categorical_crossentropy',
optimizer=sgd,
metrics=['accuracy'])
history = model.fit(fv_train, label,
batch_size=32, epochs=50,
verbose=2,
callbacks=[EarlyStopping(monitor='val_loss', patience=5), ReduceLROnPlateau(monitor='val_loss', factor=0.1, patience=3)], # adding early stopping
validation_data=(fv_val, label_val),
sample_weight = Prob*fv_train.shape[0]
)
model.save("Boost/"+str(i)+FLAGS.model)
print("\nHold on... Weak Classifier{} is working".format(i))
label_pred = model.predict(fv_train[:,:])
prd = np.argmax(label_pred, axis = -1)
tst = np.argmax(label, axis = -1)
err = error_rate(tst, prd, Prob)
alpha[i] = math.log((1-err)/err)+ math.log(label.shape[1]-1)
for j in range(0, Prob.shape[0], 1):
if tst[j]!=prd[j]:
Prob[j] = Prob[j]*math.exp(alpha[i])
Prob= Prob / np.sum(Prob)