Skip to main content
 首页 » 编程设计

python之使用 TensorFlow 优化器优化涉及 tf.keras 的 "model.predict()"的函数

2024年12月31日31over140

我使用 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 steps argument (instead of the batch_size argument)

我明白错误是什么,但我无法弄清楚如何使 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()))