Суррогатное моделирование (регрессия с нейронной сетью), точность и область доверия - PullRequest
0 голосов
/ 16 апреля 2019

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

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

Я работаю над созданием суррогатной модели для решателя PDE.Решатель PDE выводит некоторые данные, а затем я вычисляю некоторые метрики на основе этих данных.Есть около 2-6 параметров, которые я хочу смоделировать вместе с 4-10 выходами.(Есть много других параметров, но они фиксированы, поэтому я не моделирую их)

Все мои данные генерируются без шума вообще, и при запуске одного и того же входа будет получен идентичный вывод.Обычно я запускаю генетический алгоритм на симуляторе, а затем запускаю на нем MCMC, чтобы получить достоверность параметров.Проблема в том, что это действительно медленно, так как симулятор приходится запускать так много раз (миллионы), и я бы хотел вместо этого вызывать нейронную сеть в областях, где я могу быть уверен в ее выходе.

Как этосейчас стоит моя сеть примерно на 35% (абсолютная ошибка <0,01 с выходами, работающими от 0,0 до 1,0) с точностью, основанной на использовании первых 4% (8K строк) данных и прогнозировании остальных 96% (140K строк). </p>

Это мой текущий дизайн модели

слоев = 10, нейронов = 30, virtual_batch_size = 64, bach_size = 8192, оптимизатор = 'Адам'

def get_model(settings):
    with tf.device('/gpu:0'):
        inputs = tf.keras.Input(shape=(settings.input_dim,))
        outputs = []
        for dim in range(settings.output_dim):
            for layer in range(settings.layers):
                dense = tf.keras.layers.Dense(settings.neurons, 
                    kernel_regularizer=tf.keras.regularizers.l2(0.001), 
                    kernel_initializer='he_normal')

                if layer == 0:
                    x = dense(inputs)
                else:
                    x = dense(x)
                x = tf.keras.layers.PReLU()(x)
                if layer < (settings.layers - 1):
                    x = tf.layers.BatchNormalization(virtual_batch_size=settings.virtual_batch_size)(x)

                outputs.append(tf.keras.layers.Dense(1, activation='linear', 
                    kernel_initializer='he_normal')(x))

        outputs = tf.keras.layers.concatenate(outputs, axis=1)
        model = tf.keras.Model(inputs=inputs, outputs=outputs)
        model.compile(loss='mse',
            optimizer=settings.optimizer,
            metrics=['mse', 'mae'])
        return model
...