损失在减少,但是keras神经网络模型的准确性也在降低

时间:2019-08-31 11:35:14

标签: python-3.x keras neural-network

(我对神经网络和数据处理相对较新,如果做一些愚蠢的事,抱歉。)

我试图通过尝试在不同的数据集上使用deep_mojis进行概括来评估其能力。我在斯坦福SST-fine上使用它,并尝试使用带有一个隐藏层的简单softmax网络将表情符号分数映射到情感分数。

根据我在斯坦福大学SST上阅读的内容,我应该将得分转换为间隔为0.2的向量。例如0.7应该转到[0,0,0,1,0]。

但是,当我尝试训练时,训练损失和准确性都会下降,而且准确性也会下降。

NN模型

class sst_fine_predictor:
    def build_model(self):
        self.model = tf.keras.Sequential()
        self.model.add(layers.Dense(128,input_shape=(64, ), activation='tanh', kernel_regularizer=tf.keras.regularizers.l2(0.01)))
        self.model.add(
            layers.Dense(128, activation='tanh', kernel_regularizer=tf.keras.regularizers.l2(0.01)))
        self.model.add(layers.Dense(5, activation='softmax', kernel_regularizer=tf.keras.regularizers.l2(0.01)))
        self.model.compile(optimizer=tf.keras.optimizers.Adagrad(lr=0.01),
                           loss='categorical_crossentropy',
                           metrics=['accuracy'])
        return

    def __init__(self):
        self.build_model()
        self.stopper_1 = EarlyStopping(monitor='val_loss', mode='min', verbose=1, patience=50)
        # self.stopper_2 = EarlyStopping(monitor='val_acc', mode='min', verbose=1, patience=200)
        self.checkpointer = ModelCheckpoint(SAVE_PATH, monitor='val_acc', mode='max', save_best_only=True)

    def __call__(self):
        return self.model

    def train(self, train_ins, train_outs, test_ins, test_outs, max_epochs=4000):
        history = self().fit(train_ins, train_outs, validation_data=(test_ins, test_outs), epochs=max_epochs, verbose=1,
                             callbacks=[self.stopper_1, self.checkpointer], batch_size=8117)
        return history

[accuracy graph][1][loss graph][1]

training_code

training_data = pd.read_csv(SST_PATH + "emoji_train.csv", sep="|")
test_data = pd.read_csv(SST_PATH + "emoji_test.csv", sep="|")

train_ins = np.delete(training_data.values, [0,1,2], axis=1)
train_outs = categorize(training_data.values[:, 2], discrete)

correctly classified
test_ins = np.delete(test_data.values, [0,1,2], axis=1)
test_outs = categorize(test_data.values[:, 2], discrete)

model = sst_fine_predictor()


print("training model")
history = model.train(train_ins, train_outs, test_ins, test_outs, max_epochs=4000)

emoji_train.csv并测试我很确定没有问题,并且在加载时具有这些列

Index(['Unnamed: 0', 'sentence', 'sentiment_score', '0', '1', '2', '3', '4',
       '5', '6', '7', '8', '9', '10', '11', '12', '13', '14', '15', '16', '17',
       '18', '19', '20', '21', '22', '23', '24', '25', '26', '27', '28', '29',
       '30', '31', '32', '33', '34', '35', '36', '37', '38', '39', '40', '41',
       '42', '43', '44', '45', '46', '47', '48', '49', '50', '51', '52', '53',
       '54', '55', '56', '57', '58', '59', '60', '61', '62', '63'],
      dtype='object')

0到63代表表情符号分数

精度图 accuracy graph

损耗图 loss graph

谢谢

2 个答案:

答案 0 :(得分:1)

(以防万一将来有人需要),我很确定问题是我将L2正则化设置得太高了,因此它使模型更准确,因为需要输出/标签重量较所有训练标签都不够准确,因此降低了整体准确性并减少了损失。

简单地说,将正则化设置得过高可以使损失函数可以从需要高权重的错误答案中受益,然后专注于需要低权重的正确答案。

(我可能是错的,如果可以的话,请纠正我,但这是我的最佳猜测,我很确定这是正确的)

答案 1 :(得分:0)

当损失减少时,overfitting面临的准确性。

您可以通过增加数据量,do dropout或简化模型等方法来避免这种情况。这是一个很好的帖子:How to prevent Overfitting in your Deep Learning Models