使用了3个元素的线性数据来训练模型,我添加了一个异常测试数据。为什么测试准确度仍为100%?

时间:2019-05-09 01:10:16

标签: tensorflow machine-learning keras neural-network deep-learning

我的输入是一个由3个元素组成的数组,并且我使用的是二进制分类。

Linear Data

这是我的代码:

import numpy as np
import os
from keras.models import Sequential
from keras.layers import Dense
from keras.optimizers import Adam

os.environ["TF_CPP_MIN_LOG_LEVEL"]="2"



X_train = [
    [0,1,2],
    [0,2,4],
    [0,6,12],

    [0,7,14],
    [0,8,16],
    [0,11,22]
    ]

X_train = np.array(X_train)

y_train = [
    0,
    0,
    0,
    1,
    1,
    1
]
y_train = np.array(y_train)


X_test= [
    [0,3,6],
    [0,5,10],
    [0,10,20],
    [0,9,18],
    [0,0,100], # << outlier data
    ]
X_test = np.array(X_test)


y_test = [
    0,0,1,1,1
]
y_test = np.array(y_test)



model = Sequential()
model.add(Dense(1, input_shape=(3,), activation="sigmoid"))
model.compile(Adam(lr=0.05), 'binary_crossentropy', metrics=['accuracy'])
model.fit(X_train, y_train, epochs=500, verbose=1)
eval_result = model.evaluate(X_test, y_test)
print("Test loss:", eval_result[0], "Test accuracy:", eval_result[1])

我添加了一行 [0,0,100],#<<离群数据,它是非线性的测试数据。我将其归类为1。运行model.evaluate时,测试准确度为100%,我希望这应小于100%(由于5%的测试数据中有20%的错误= 1个错误,因此其准确度为80%)我假设[0,6.5,13]上存在线性间隔。

我尝试将异常值数据更改为 [0,-50,100],#<<异常值数据,并且我获得了80%的测试准确度,这也是我期望在[ 0,0,100]。我相信我在这里错过了一些基本的东西,但无法弄清楚它是什么。

1 个答案:

答案 0 :(得分:1)

根据通用函数逼近定理,具有一定数量隐藏单元的标准神经网络(NN)可以近似任何函数。参见here

假设您有一个函数f(x,y)。给定此函数的输入和输出,NN将对该函数进行近似。

  因此,NN尝试在其输入与   输出,而不是其功能。

在您的情况下,NN无法学习特征之间的关系,即(0,x,2x)。相反,它学会了将一组值(x1,x2,x3)分类为1类或0类。