【问题标题】:Tensorflow gradients causing contractive autoencoder cost doesn't converge导致收缩自动编码器成本的 TensorFlow 梯度不收敛
【发布时间】:2017-11-30 13:45:06
【问题描述】:

要构造一个收缩自动编码器,可以使用具有成本函数的普通自动编码器

为了使用 MNIST 数据集实现这一点,我使用 tensorflow 定义了成本函数

def cost(X, X_prime):
    grad = tf.gradients(ys=X_prime, xs=X)
    cost = tf.reduce_mean(tf.square(X_prime - X)) + tf.reduce_mean(tf.square(grad))
    return cost

并使用 AdamOptimizer 进行反向传播。但是,成本不会低于 0.067,这很奇怪。我对成本函数的实现不正确吗?

编辑: 在阅读documentation ontf.gradients 之后,上面的实现会计算 代替。所以我的问题是,你如何在 tensorflow 中明智地做导数组件?

【问题讨论】:

    标签: python tensorflow mnist autoencoder


    【解决方案1】:

    解决您的编辑后问题:TensorFlow 没有计算雅可比矩阵的函数。以下引用来自Github discussion,概述了您如何自己计算雅可比行列式:

    目前,您可以通过多次调用梯度来计算向量的雅可比行列式,对原始向量的每个标量分量(通过切片获得)调用梯度,然后重新组合结果。

    【讨论】:

      【解决方案2】:

      所以就像 Akshay 建议的那样,计算雅可比行列式的方法是通过对微分目标进行切片。下面是一个小例子。

      f的雅可比矩阵是

      张量流中的代码

      X = tf.Variable(tf.random_normal(shape=(10, 3)), dtype=tf.float32)
      y = X[:, :-1]
      
      jacobian = tf.stack([tf.gradients(y[:, i], X) for i in range(2)], axis=2)
      
      sess = tf.Session()
      j = sess.run(jacobian)
      print(j[:, 0, :])
      
      array([[1., 0., 0.],
             [0., 1., 0.]], dtype=float32)
      

      这给了

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-01-31
        • 2015-11-21
        • 2015-02-18
        • 2019-07-22
        • 2013-10-04
        • 1970-01-01
        • 2013-06-21
        • 1970-01-01
        相关资源
        最近更新 更多