我使用 tf.keras 构建了一个全连接的 ANN,“my_model”。然后,我尝试使用 TensorFlow 中的 Adam 优化器最小化函数 f(x) = my_model.predict(x) - 0.5 + g(x)。我尝试了以下代码:
x = tf.get_variable('x', initializer = np.array([1.5, 2.6]))
f = my_model.predict(x) - 0.5 + g(x)
optimizer = tf.train.AdamOptimizer(learning_rate=.001).minimize(f)
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
for i in range(50):
print(sess.run([x,f]))
sess.run(optimizer)
但是,在执行 my_model.predict(x) 时出现以下错误:
If your data is in the form of symbolic tensors, you should specify the
stepsargument (instead of thebatch_sizeargument)
我明白错误是什么,但我无法弄清楚如何使 my_model.predict(x) 在存在符号张量的情况下工作。如果 my_model.predict(x) 从函数 f(x) 中移除,代码运行时不会出现任何错误。
我检查了以下 link , link其中 TensorFlow 优化器用于最小化任意函数,但我认为我的问题是底层 keras model.predict() 函数的使用。我感谢任何帮助。提前致谢!
请您参考如下方法:
我找到答案了!
基本上,我试图优化一个函数,该函数涉及经过训练的 ANN w.r.t ANN 的输入变量。所以,我只想知道如何调用 my_model 并将其放入 f(x)。在此处深入了解 Keras 文档:https://keras.io/getting-started/functional-api-guide/ ,我发现所有的 Keras 模型都是可调用的,就像模型的层一样!引用链接中的信息,
..you can treat any model as if it were a layer, by calling it on a tensor. Note that by calling a model you aren't just reusing the architecture of the model, you are also reusing its weights.
与此同时,model.predict(x) 部分期望 x 是 numpy 数组或评估的张量,并且不会将 tensorflow 变量作为输入 (https://www.tensorflow.org/api_docs/python/tf/keras/Model#predict)。
所以下面的代码有效:
## initializations
sess = tf.InteractiveSession()
x_init_value = np.array([1.5, 2.6])
x_placeholder = tf.placeholder(tf.float32)
x_var = tf.Variable(x_init_value, dtype=tf.float32)
# Check calling my_model
assign_step = tf.assign(x_var, x_placeholder)
sess.run(assign_step, feed_dict={x_placeholder: x_init_value})
model_output = my_model(x_var) # This simple step is all I wanted!
sess.run(model_output) # This outputs my_model's predicted value for input x_init_value
# Now, define the objective function that has to be minimized
f = my_model(x_var) - 0.5 + g(x_var) # g(x_var) is some function of x_var
# Define the optimizer
optimizer = tf.train.AdamOptimizer(learning_rate=.001).minimize(f)
# Run the optimization steps
for i in range(50): # for 50 steps
_,loss = optimizer.minimize(f, var_list=[x_var])
print("step: ", i+1, ", loss: ", loss, ", X: ", x_var.eval()))
