Я пытаюсь смоделировать данные генной экспрессии. Я провел много экспериментов, и все они пришли к одному и тому же выводу: наиболее эффективный автоэнкодер - это тот, который имеет только 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. Эти значения всегда ниже для мелкой сети. Более глубокие сети дают странные результаты, такие как:
Данные нормализованы, взяты с портала GTEx. Вот как выглядит распределение данных:
Как это может быть, любая помощь приветствуется, я действительно застрял с этим.