Keras样品重量

时间:2018-02-13 10:15:12

标签: python machine-learning keras adaboost

我每个人都试图实现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)

0 个答案:

没有答案