Я пытаюсь использовать 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 (минимизировать ) сделать шаг градиентного спуска и запустить любую переменную, которую я хочу получить на данном шаге?
Заранее спасибо!