在TensorFlow中手动指定op和gradient(希望仅使用Python)

时间:2016-06-11 22:12:30

标签: tensorflow

我正在尝试使用TensorFlow来最小化L以下的损失函数(u)。有3个变量ux_optL,具有以下依赖关系图:

u ---(f) - > x_opt ---(g) - > L

具有由函数fg控制的依赖的确切形式。

def f(u):

    def f_helper(u,x):
        # with u held fixed, f_helper is a convex function of x
        # the exact form of f_helper does not matter
        return np.linalg.norm(x-u)

    curried_f_helper = lambda x: f_helper(u,x)
    x_opt = scipy.optimize(curried_f_helper,np.random.uniform(5))['x']
    return x_opt

def g(x_opt):
    # the exact form of g does not matter
    return np.ones(x_opt.shape).dot(x_opt)

def L(u):
    # want to optimize L over u
    x_opt = f(u)
    return g(x_opt)

# use TensorFlow to minimize L over u...

复杂性是f()没有分析函数形式 - u参数化解决方案为x_opt的优化问题。因此,TensorFlow无法计算f相对于u的渐变。但是,我可以使用隐式微分来手动计算此渐变。理想情况下,我可以定义一个代表f的新操作,并注册其渐变(我手动计算)。

我的问题是:我应该如何实现代表f的op并指定其渐变?是否可以仅使用Python定义f的操作,如果是,我是否必须使用tf.pyfunc

0 个答案:

没有答案