Использовал 3-элементные линейные данные для обучения модели, и я включил данные теста на выбросы. Почему точность теста все еще на 100%? - PullRequest
2 голосов
/ 09 мая 2019

У меня есть вход, который представляет собой массив из 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], # << данные выброса </em>, которая является тестовыми данными, которые не являются линейными.Я классифицировал его как 1. Когда я запускаю модель. Оценить, точность теста составляет 100%, и я ожидаю, что она должна быть меньше 100% (точность 80% из-за ошибки 20% = 1 ошибка из 5 данных теста) какЯ предполагаю, что существует линейное разделение [0,6.5,13].

Я попытался изменить данные выбросов на [0, -50,100], # << данные выбросов </em>, и яполучил точность теста 80%, чего я ожидал от [0,0,100].Я полагаю, что упускаю что-то фундаментальное здесь, но не могу понять, что это такое.

1 Ответ

1 голос
/ 09 мая 2019

Согласно теореме об аппроксимации универсальной функции стандартная нейронная сеть (NN) с определенным числом скрытых единиц может аппроксимировать любую функцию .См. здесь .

Скажем, у вас есть функция f (x, y).NN будет приближать эту функцию, учитывая входы и выходы этой функции.

Следовательно, NN пытается установить связь между своими входами и выходами, а не между своими функциями.

В вашем случае NN не изучил отношениямежду признаками т.е. (0, х, 2х).Вместо этого он научился разбивать набор значений (x1, x2, x3) на класс 1 или класс 0.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...