在Tensorflow中使用急切执行的问题

时间:2019-07-25 16:53:37

标签: python matlab tensorflow minimization eager-execution

我正试图根据Minimize a function of one variable in Tensorflow中发布的内容,使用Tensorflow最小化给定的得分函数。

此类得分函数的值是通过调用Matlab脚本获得的,该脚本只需提供一个参数(与输入变量张量有关)即可。我猜这里就是问题所在:有没有办法提供张量作为Matlab函数的参数?

作为第一次尝试,我打算创建一个tf.session()来获取该张量的值,然后再将其作为参数传递给我的Matlab脚本。但是,这样做会弹出以下错误消息:

ValueError: No gradients provided for any variable, check your graph for ops that do not support gradients, between variables

实际上,似乎会在成本函数主体内创建新会话会“破坏”图形连接,从而可以计算变量之间的梯度(https://github.com/tensorflow/tensorflow/issues/1511#issuecomment-255323361)。因此,解决方案可能来自其他任何地方。但是,据我所知,不运行图形就不可能检索z的值...

请在附件中找到我的代码片段:

def costFunction(x):
    sess = tf.Session()
    sess.run(tf.initializers.global_variables()) #Here I would need to initialize x variable to use it below
    z = sess.run(tf.add(x,y)) # y is another tensor of same dimension than x
    sess.close()
    H = np.asarray(eng.matlabfunction(matlab.double(z.tolist()),...)) # There are other parameters (Python lists) to be passed as arguments to my Matlab script alongside them, not included for the sake of simplicity
    return tf.convert_to_tensor(...)  #Output of my Matlab function

x = tf.Variable(initial_value=tf.zeros([6,N], tf.float64))
target = costFunction(x)
opt = tf.train.AdamOptimizer(learning_rate=1e-5, beta1=0.9, beta2=0.999, epsilon=1e-8).minimize(target)

with tf.session() as sess:
    sess.run(tf.initializers.global_variables()) 
    for _ in range(NUM_STEPS):
        sess.run(opt)
        path_kappas = calckappa(x)

    print(sess.run(x))
    print(sess.run(target))

更新:我通过使用Tensorflow中一个众所周知的功能,即渴望执行,找到了解决我问题的可能方法。通过使用它,可以访问图中的每个张量的内容,而无需运行任何会话。使用它,我现在有了这个版本的代码:

import tensorflow as tf
import numpy as np
import matlab.engine
tf.compat.v1.enable_eager_execution
eng = matlab.engine.start_matlab()

def costFunction():
    z = tf.add(x,y).numpy()
    H = np.asarray(eng.matlabfunction(matlab.double(z.tolist()),...)) # There are other parameters (Python lists) to be passed as arguments to my Matlab script alongside them, not included for the sake of simplicity
    return tf.convert_to_tensor(...) # Output of my Matlab function, which makes use of H previously calculated

x = tf.Variable(initial_value=tf.zeros([6,N], tf.float64))
opt = tf.train.AdamOptimizer(learning_rate=1e-5, beta1=0.9, beta2=0.999, epsilon=1e-8)
opt_op = opt.minimize(costFunction, var_list=x)
iters = 1000
for i in range(iters):
    opt_op.run()
    if i % 100 == 0:
        print("Iteration {}, loss: {}".format(i+1, costFunction(tunedPhases))) 

但是,这仍然无法解决,并且在调用“ opt.minimize”函数时收到以下错误消息作为输出:

TypeError: zip argument #1 must support iteration

据我所知,在启用急切执行的情况下,使用opt.minimize必须包含不带参数且不再张量(https://github.com/tensorflow/tensorflow/blob/r1.14/tensorflow/python/training/optimizer.py#L217-L1242)的函数作为参数。我不知道的是,该函数的输出是否仍然必须是张量或可以是其他任何值(对我来说这没有多大意义)。无论如何,如果我不将costFunction的返回值转换为张量,我的代码仍将无法工作,并输出以下消息:

AttributeError: 'numpy.dtype' object has no attribute 'is_floating'

你们中的任何人对可能出什么问题有任何见识吗?

在此先感谢您,祝您周末愉快!

0 个答案:

没有答案