Какие параметры не позволяют автоэнкодеру узнать правильное распределение? - PullRequest
0 голосов
/ 26 сентября 2019

У меня есть очень минимальный пример автоэнкодера:

from tensorflow.keras.models import Model
from tensorflow.keras.layers import Input, Dense
import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
%matplotlib inline

Сначала я создаю набор данных с сильно коррелированными переменными A и B (которые уже нормализованы)

X = pd.DataFrame( (np.random.randn(1000,2)), columns=["A", "B"] )
X["B"] = X["A"] + X["B"]/4

Затем я настраиваю автоэнкодер и обучаю его

aeInput = Input(2)
encode = Dense(2, activation='relu')(aeInput)
aeOutput = Dense(2, activation='relu')(encode)

AE = Model(aeInput, aeOutput, name="autoencoder")
AE.compile(optimizer='adam', loss="mean_squared_error", )
TrainAE = AE.fit( x=X, y=X, epochs=100, batch_size=2**5,)

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

f, ax = plt.subplots(figsize=(8, 8))
sns.kdeplot( X, shade=False, axis=ax)
sns.kdeplot( AE.predict(X), shade=False, axis=ax)

Blue is the original distribution, orange the autoencoded one

Это кажется мне очень странным, потому что уровень кодирования такой же большой, как и вход, поэтому тривиальное решение без потерьБыло бы просто подключить первый нейрон A напрямую, с активацией 1 и такой же для второго нейрона, кодирующего B. Почему этого не происходит?Есть ли какой-либо параметр, который я использую неверно?

1 Ответ

1 голос
/ 26 сентября 2019

Одна проблема заключается в том, что ваш последний слой имеет активацию relu, которая имеет минимум 0. Если вы хотите прогнозировать числа меньше 0 на последнем слое, вы можете изменить активацию на «линейную», какэто

aeOutput = Dense(2, activation='linear')(encode)

...