Как нормализовать нейронную сеть с несколькими входами? - PullRequest
1 голос
/ 28 марта 2019

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

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

Например: у меня есть входные переменные a и b.

имеет шкалу 100-1000

b имеет шкалу 1-10

После нормализации обе переменные имеют шкалу 0-1.

Мои выходные данные теперь должны быть прогнозом на завтра a (a при t + 1) и, следовательно, снова иметь шкалу 100-1000 . Поэтому я буду просто денормализовать в соответствии с тем, как я нормализовал a (нормализацию по обратному a? Или мне нужно рассмотреть что-то еще?

Для нормализации обеих переменных мой код выглядит следующим образом:

from pandas import Series
from sklearn.preprocessing import MinMaxScaler

series1 = Series(df["a"])
series2 = Series(df["b"])

values1 = series1.values
values1 = values1.reshape((len(values1), 1))
values2 = series2.values
values2 = values2.reshape((len(values2), 1))

scaler1 = MinMaxScaler(feature_range=(0, 1))
scaler1 = scaler1.fit(values1)
scaler2 = MinMaxScaler(feature_range=(0, 1))
scaler2 = scaler2.fit(values2)

normalized1 = scaler1.transform(values1)
df["Normalized_a"] = normalized1
normalized2 = scaler2.transform(values2)
df["Normalized_b"] = normalized2

closesnorm1 = df["Normalized_a"]
closesnorm2 = df["Normalized_b"]

### Combine two variables into one NumPy array
normalizeddata = df[["Normalized_a","Normalized_b"]].values

Затем я разделил данные:

### Split the data
X_train = []
y_train = []
for i in range (3, len(normalizeddata) - 3):
    y_train.append(normalizeddata[i,0])
    X_train.append(np.array((normalizeddata[i+1:i+4][::-1])))

X_train = np.array(X_train).reshape(-1,3,2)
y_train = np.array(y_train)

X_test = []
y_test = []
for i in range (0,3):
    y_test.append(normalizeddata[i,0])
    X_test.append(np.array((normalizeddata[i+1:i+4][::-1])))

X_test = np.array(X_test).reshape(-1,3,2)
y_test = np.array(y_test)

Сама модель выглядит следующим образом с учетом двух переменных (см. Форму ввода массива NumPy):

model = Sequential()
model.add(LSTM(100,activation="relu", input_shape = (3, 2),  return_sequences = True))
model.add(Dropout(0.2))
model.add(LSTM(100,activation="relu", return_sequences = False))
model.add(Dropout(0.2))
model.add(LSTM(1,activation ="relu"))
model.compile(optimizer="adam", loss="mse")
model.fit(X_train, y_train, batch_size = 2, epochs = 10)

И последнее, но не менее важное: я денормализовал вывод, используя Scaler1:

### Predicting y_test data
y_pred = model.predict(X_test)
y_pred = y_pred.reshape(-1)
df_pred = df[:3]
df_pred["a_predicted"] = scaler1.inverse_transform(y_pred.reshape(-1, 1))

Большое спасибо!

Ответы [ 2 ]

0 голосов
/ 28 марта 2019

Лучше использовать два скейлера, скажем, скейлер a и скейлер b.

Затем масштабируйте элемент a с помощью скейлера a и b с помощью скейлера b.Затем подготовьте набор данных, используя элементы с задержкой.Если функция b в той, которую вы прогнозируете, сделайте прогноз и обратный масштаб с помощью скейлера b.

0 голосов
/ 28 марта 2019

Это зависит от функции активации в выходном слое и от целевого выхода, который вы используете для обучения. Поскольку вы, похоже, хотите, чтобы выход был того же типа, что и один из входов, мне кажется естественным нормализовать целевой выход так же, как вы нормализуете a, и, когда вы используете сеть для повторного вызова, используйте обратную нормализации a.

Однако рассмотрите возможность редактирования вашего вопроса, чтобы включить некоторые данные и пример кода. См. Как создать минимальный, полный и проверяемый пример .

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