Я хочу использовать интерфейс внешнего оптимизатора в тензорном потоке, чтобы использовать оптимизаторы Ньютона, поскольку в tf.train есть только оптимизаторы градиентного спуска первого порядка.В то же время я хочу построить свою сеть с использованием tf.keras.layers, поскольку это намного проще, чем использование tf.Variables при создании больших и сложных сетей.Я покажу свою проблему на следующем простом примере 1-мерной линейной регрессии:
import tensorflow as tf
from tensorflow.keras import backend as K
import numpy as np
#generate data
no = 100
data_x = np.linspace(0,1,no)
data_y = 2 * data_x + 2 + np.random.uniform(-0.5,0.5,no)
data_y = data_y.reshape(no,1)
data_x = data_x.reshape(no,1)
# Make model using keras layers and train
x = tf.placeholder(dtype=tf.float32, shape=[None,1])
y = tf.placeholder(dtype=tf.float32, shape=[None,1])
output = tf.keras.layers.Dense(1, activation=None)(x)
loss = tf.losses.mean_squared_error(data_y, output)
optimizer = tf.contrib.opt.ScipyOptimizerInterface(loss, method="L-BFGS-B")
sess = K.get_session()
sess.run(tf.global_variables_initializer())
tf_dict = {x : data_x, y : data_y}
optimizer.minimize(sess, feed_dict = tf_dict, fetches=[loss], loss_callback=lambda x: print("Loss:", x))
При выполнении этого убыток просто не меняется вообще.При использовании любого другого оптимизатора из tf.train он работает нормально.Кроме того, при использовании tf.layers.Dense () вместо tf.keras.layers.Dense () он работает с использованием ScipyOptimizerInterface.Поэтому на самом деле вопрос заключается в том, в чем разница между tf.keras.layers.Dense () и tf.layers.Dense ().Я видел, что переменные, созданные с помощью tf.layers.Dense (), имеют тип tf.float32_ref, а переменные, созданные с помощью tf.keras.layers.Dense (), имеют тип tf.float32.Насколько я сейчас, _ref указывает, что этот тензор изменчив.Так может в этом проблема?Но опять же, любой другой оптимизатор из tf.train прекрасно работает со слоями keras.
Спасибо