Глубокий автоэнкодер всегда хуже чем мелкий - PullRequest
1 голос
/ 09 марта 2020

Я пытаюсь смоделировать данные генной экспрессии. Я провел много экспериментов, и все они пришли к одному и тому же выводу: наиболее эффективный автоэнкодер - это тот, который имеет только 1 слой в качестве кодера, 1 слой в качестве декодера. Теоретически это не имеет никакого смысла. Вот как я определяю мелкую сеть:


#Leaky-Parametric-RelU
#Encoder
encoded = Dense(num_genes,activation = 'linear')(input_data)
encoded = PReLU()(encoded)

#Bottleneck layer
encoded = Dense(128,activation = 'linear')(encoded)
encoded = PReLU()(encoded)

#Decoder
decoded = Dense(num_genes,activation = 'linear')(encoded)
decoded = PReLU()(decoded)

decoded = Dense(num_genes,activation = 'linear')(decoded)

А вот как я определяю более глубокую сеть:


#Leaky-Parametric-RelU
#Encoder
encoded = Dense(num_genes,activation = 'linear')(input_data)
encoded = PReLU()(encoded)
encoded = Dense(int(num_genes/2),activation = 'linear')(encoded)
encoded = PReLU()(encoded)


#Bottleneck layer
encoded = Dense(128,activation = 'linear')(encoded)
encoded = PReLU()(encoded)

#Decoder
decoded = Dense(int(num_genes/2),activation = 'linear')(encoded)
decoded = PReLU()(decoded)
decoded = Dense(num_genes,activation = 'linear')(decoded)
decoded = PReLU()(decoded)

decoded = Dense(num_genes,activation = 'linear')(decoded)

Затем я компилирую модель с помощью:

autoencoder = Model(input_data, decoded)
#Model = Sequential()
autoencoder.compile(loss='mean_squared_error', optimizer = 'adam') 
autoencoder.summary()

history = autoencoder.fit(x_train,x_train, 
                           epochs =500, verbose = 2, 
                           callbacks = [MyCustomCallback()])

Я пробовал разные функции активации. Я бегу в течение 100 или 500 эпох и сохраняю лучшее значение MAE. Эти значения всегда ниже для мелкой сети. Более глубокие сети дают странные результаты, такие как:

Performance of deep autoencoder

Данные нормализованы, взяты с портала GTEx. Вот как выглядит распределение данных:

Data distribution:

Как это может быть, любая помощь приветствуется, я действительно застрял с этим.

Ответы [ 2 ]

3 голосов
/ 09 марта 2020

Это может быть нормально, если ваши данные не очень большие. Существует концепция глубокого двойного спуска (здесь Open Ai blogpost ). По существу, до определенного момента более простая модель будет работать лучше, чем более сложная, и сложность модели окупается, когда у вас значительно больше данных или вы можете позволить себе большее время обучения (это объясняется гораздо лучше в блоге, на который я ссылался, а также здесь .

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

1 голос
/ 09 марта 2020

Я предлагаю вам попробовать kernel_initializer='he_uniform' для каждого Dense, который имеет активацию ReLU. (PReLU похож на ReLU, поэтому этот инициализатор может быть лучше других).

Вы также должны позаботиться о размере num_genes. Если num_genes / 2 < 128, возможно, вы создаете больше узких мест, особенно во второй модели, где количество единиц в слоях кажется инвертированным.

Предложение будет num_genes -> 128 + (num_genes - 128) / 2 -> 128 (bottleneck). Затем, поднимаясь, сделайте точный обратный порядок

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