我的输入是一个由3个元素组成的数组,并且我使用的是二进制分类。
这是我的代码:
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]。我相信我在这里错过了一些基本的东西,但无法弄清楚它是什么。
答案 0 :(得分:1)
根据通用函数逼近定理,具有一定数量隐藏单元的标准神经网络(NN)可以近似任何函数。参见here。
假设您有一个函数f(x,y)。给定此函数的输入和输出,NN将对该函数进行近似。
因此,NN尝试在其输入与 输出,而不是其功能。
在您的情况下,NN无法学习特征之间的关系,即(0,x,2x)。相反,它学会了将一组值(x1,x2,x3)分类为1类或0类。