Tensorflow 2.0 - пользовательский оптимизатор для приближения функций - PullRequest
0 голосов
/ 09 марта 2020

Я пытаюсь использовать Tensorflow 2, основать нейронную сеть, которая помогает мне получить набор значений, которые минимизируют функцию, такую ​​как невязки. Я использую следующую структуру:

input X -> N layers of M neurons -> output Y (same size as X)

И что я хочу, чтобы нейрон пытался получить функцию f (Y) как можно меньше. В данном случае в качестве примера можно привести решение уравнения диффузии с функцией F, являющейся суммой остатков уравнения и граничных условий (градиенты остатков уравнения строятся с использованием tf.gradients (Y, X)).

Я не вставляю здесь полный код в случае, если объяснения достаточно, так как я считаю, что моя ошибка может заключаться скорее в концепции, чем в синтаксисе. Код, который я использовал, основан на коде, который я нашел в inte rnet.

Я сделал следующее:

  • Инициируйте переменную X как необучаемую переменную .

    *X = tf.Variable(tf.random.uniform([(l+L)*density_boundary,1],minval=- 
    l,maxval=L),trainable=False)*
    
  • Для каждого слоя создайте матрицы W и B в качестве переменных, как показано ниже.

    *w=tf.Variable(tf.random.normal([output_size, size]),tf.float64)
    b=tf.Variable(tf.random.normal([output_size, 1]),tf.float64)*
    

, а затем вычислите yi = tanh(batch_norm(wi*xi + bi)) (все операции с использованием tf. (Математика или linalg) .XXX.

  • Функция стоимости определяется такой функцией, как. (I_min i_max, который используется для вынуть только соответствующую часть вектора Y (граничные условия применяются только по сторонам). Я также создал другую функцию стоимости, которая не принимает входные данные, но не заставляет ее работать (см. позже)

    *def Cost(x,y,i_min,i_max): 
        return tf.reduce_mean(tf.pow(tf.slice(y,[i_min,0],[i_max-i_min+1,1]), 2))*
    
  • Я создал сеанс, используя функцию режима совместимости с tenorflow 1. (Не понимал, как заставить вещи работать без sess).

с tf. compat.v1.Session () as sess:

  • Инициализировать переменные, используя:

    *init = tf.compat.v1.global_variables_initializer()*
    
    *sess.run(init)*
    
  • Создана нейронная сеть с функцией нейронной сборки net, которая вызывает еще один, добавляя слой, используя сначала вектор X, а затем выводит предыдущий слой.

    *Y = _build_Neural_Net(X=,SizeX,N_hidden_Layers,N_nodes,sess)*
    

И именно здесь начинается проблема. Теперь мне нужно создать оптимизатор и функцию минимизации. Я использовал это:

    *optimizer = tf.keras.optimizers.Adam(learning_rate=0.1)*

Для функции минимизации я использовал несколько вещей, ничего не работает, вот три из них. compute_loss - это функция без входных данных, дающая вектор, который содержит остатки в каждой позиции X (необходимо перетащить в 0)

    *minimize = optimizer.minimize(tf.nn.l2_loss(Compute_loss), var_list=[Y])*

    *minimize = optimizer.minimize(Compute_loss, 
     var_list=tf.compat.v1.trainable_variables())*

    *minimize = optimizer.minimize(Compute_loss)*

Всегда выдает ошибку, сообщающую мне, что мне нужен var_list, но, очевидно, нет этот.

Можете ли вы сказать мне, что эта функция минимизации должна принимать за вход? функция, номер вектора? И этот var_list, что это значит в моем случае? У меня нет библиотеки вещей для изучения, я только хочу улучшить предыдущий шаг. Я видел в литературе, что это возможно.

Что-то не так в том, как я все это построил?

Правильно ли, что потом мне нужно будет только выполнить sess.run (минимизировать ) сделать шаг градиентного спуска и запустить любую переменную, которую я хочу получить на данном шаге?

Заранее спасибо!

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