2016-06-02 2 views
2

Это более концептуальный вопрос, но я должен признаться, что с ним какое-то время занимался.Как восстановить исходные значения после предсказания модели в keras?

Предположим, вы хотите обучить нейронную сеть (NN), используя, например, keras. Как рекомендуется выполнить предыдущий на обучение нормализацию или стандартизацию данных, так, например, при стандартизации:

x_new = (x_old - mean)/standarddev 

Затем продолжить обучение (model.fit в keras) и свести к минимуму потери функция, все очень приятно.

Редактировать: В моем случае у меня есть набор значений от 200 до 400. Это NN с 1 входным, 1 выходным. Я стандартизую, как сказано, входные значения И ожидаемые значения, поэтому NN изучает веса и смещения в стандарте .

Теперь представьте, что у меня есть совершенно новый набор данных значений от 200 до 400, и я хочу предсказать выход, используя NN с предыдущей тренировкой. Вы можете использовать model.predict(x) в keras, с x совершенно новый набор значений, которые я получил, стандартизованный (или нормализованный), потому что ваш NN был обучен таким образом. Но тогда, что я получаю после predict, это массив значений, стандартизированных, , но я хочу сопоставить их с обычным диапазоном от 200 до 400. И я не знаю, как это сделать.

Я знаю, что вы можете продолжить обучение без нормализации или стандартизации, но я прочитал, что если вы стандартизируете (или нормализуете) значения со значениями в единицах вывода единиц (нейронов) (например, между 0 и 1 для сигмоида), тренировка улучшается.

спасибо.

+0

Хорошо - давайте посмотрим, понял ли я: вы получили свои данные, которые вы вкладываете в нейронную сеть, в нормализованной форме - и вы хотите восстановить первоначальные значения? Или вы хотите уничтожить свой выход? И - кстати. каков результат вашей функции? Некоторый код может быть полезен. –

+0

Да, у меня есть массив 'x' и массив' y' выходов со значениями от 200 до 400. Оба они нормализованы и выполняются тренировки. После этого у меня есть новый массив, 'x_2', со значениями от 200 до 400, и я хочу предсказать результат, используя' pred' в keras. Проблема в том, что NN прошли обучение нормализованным образом. Если я нормализую этот новый массив 'x_2', что я получу, назовем его,' y_2' нормализуется, и я хочу _denormalize_, чтобы получить значения между 200 и 400. – David

ответ

2

Хорошо, я думаю, что я получил то, что ваша проблема правильно, поэтому я попытаюсь объяснить вам, как иметь дело с нормализацией данных:

1. Предположение о distribiution входов и выходов: обычно в нейронной сети что ваши данные (как входные, так и выходные) исходят из некоторых вероятностных распределений: назовем это X для ввода и Y вывода. Есть несколько причин сделать это распределение нулевым средним и с единицей стандартного отклонения во время тренировочной фазы.

2. Статистическая часть нормализации и восстановления данных: из-за этого - вам необходимо решить другую задачу во время обучения вашей сети. Эта задача состоит в том, чтобы оценить среднего и стандартного отклонения обоихов распределения входного Х и распределения выходных Y. Вы делаете это, просто применяя эмпирическое среднее и стандартное отклонение к вашим данным обучения.

3. Применение фаза - входы: при применении вашей модели на новый вход, вы также при условии, что ваш вход поступает из distribiution X так что вы также должны standarize его быть нулевых средним и блока стандартное отклонение, и вот забавная часть - вы можете использовать как набор тренировок, так и набор новых данных, чтобы получить еще лучшую оценку среднего и стандартного отклонения X, но чтобы избежать переобучения в случае проверки - вы обычно используете среднее и стандартное отклонение, полученное на этапе обучения, чтобы сделать новые данные стандартизованными.

4. Фазового Применения - выходы: эта часть сложнее, потому что, когда вы применяете свою сеть к новым стандартизированы входам вы получаете новые выходы из Y * ~ (Y - среднее «(Y))/сд» (Y), где среднее «(Y) и сд» (Y) являются оценкой среднего и стандартного отклонения, полученного опытным путем из вашего обучения установить и Y является оригинальным distribiution вашего выхода. Это связано с тем, что во время тренировки вы подаете свой оптимизатор с выходными данными из этого распределения. Поэтому для того, чтобы ваши реестры были восстановлены, вам необходимо применить преобразование: Y * * sd '(Y) + mean' (Y). что обратное к преобразованию стандартизации.

РЕЗЮМЕ:

тренировки и фаза приложения выглядит следующим образом:

  1. Вы получение статистических данных, необходимые как для обучения фазы и фазы применения пути вычисления эмпирического среднего и стандартного отклонения ваших учебных материалов (среднее значение '(X) и sd' (X) и эмпирическое среднее и стандартное отклонение выходов (среднее значение '(Y) и sd '(Y)).Важно хранить их, потому что они понадобятся на этапе приложения.
  2. Вы устанавливаете как ваши входные, так и выходные данные как нулевые средние и единичное стандартное отклонение и обучите вашу модель на них.
  3. Во время фазы приложения вы standarize вашего вклада путем вычитания его хранящегося среднего «(X) и деления на хранящемся SD» (X), чтобы получить новый выход Y *
  4. Вы destandarize ваших выходов с помощью хранимого среднее '(Y) и сд' (Y) - полученные во время обучения фазы. - путем преобразования (Y * сд '(Y) + означают' (Y)

Я надеюсь, чтоэтот ответ решает вашу проблему и не оставляет никаких сомнений в деталях стандартизации и деандаризации ваших данных :)

+0

Хорошо, Марцин, я думаю, это решает мою проблему, спасибо. Я знаю, как его применять, но я думаю, что у меня все еще есть концептуальные сомнения: почему я всегда должен использовать среднее значение «(X) и среднее значение« (Y) (и то же самое для std) фазы обучения? То есть мне кажется странным, потому что вы можете использовать среднее значение нового набора данных для прогнозирования (скажем, mean '' (X_new)), который ближе к фактическому значению входного набора данных предсказания. – David

+1

Существует по крайней мере три причины: 1. Как новые, так и старые значения должны поступать из одного и того же дистрибутива - так что это не имеет значения. 2. Ваша модель была изучена по старым данным. 3. Вы знаете производительность своей модели со старой нормализацией. Взятие статистики из новых данных может быть рискованным из-за смещения в вашем новом наборе данных, который вы не можете распознать. –

+0

Хорошо, Марсин. Я думаю, что понял. Спасибо тебе за все. – David

1

В зависимости от того, если вы standarize ваших выходов или нет:

1. Если нет то ваши выходных значения не стандартизированы, и вам не придется беспокоиться об этом.

2. Если да: тогда вы держите средних/SD и unstadarize вашего выхода просто (output * sd) + mean.

+0

Marcin, спасибо за ваш ответ, но я боюсь Я не совсем понимаю вас. Я собираюсь изменить свой вопрос, чтобы сделать его более ясным. – David

1

Вы стандартизировано свои входные/выходные значения по следующей формуле:

X_s = (X - mean)/std 

Для destandarize, вы должны иметь средние и StD значения для входов и выходов. Сохраните их где-нибудь, а затем использовать следующее уравнение:

X = X_s * std + mean 

Например, допустим, что для [200, 400] диапазона, среднее значение 300 и стандартное отклонение 100. Тогда говорят, для нормированного значения 0.5, ненормализованное значение:

X = 0.5 * 100 + 300 = 350 

Если вы не сохранили среднее/зЬй, то вы не имеете никакого способа восстановить исходные значения.

+0

Да, я это знаю. Вы можете сделать это, чтобы уничтожить после фазы обучения. Проблема в том, что с помощью нового набора данных для прогнозирования вам нужно использовать новое среднее значение и новое стандартное отклонение, или, возможно, старые? Это было мое сомнение. Но спасибо за ваш ответ. – David

+1

@ Если вы используете те, которые использовались при обучении сети, это то, что вы называете старыми. –

Смежные вопросы