+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

暂无数据

张量流双射器构造

发布于2020-08-04 18:37     阅读(518)     评论(0)     点赞(21)     收藏(1)


我是张量流分布和双射器的新手。我知道当他们设计张量流分发包时,他们将张量的形状分为三类:[样本形状,batch_shape,event_shape]。但是我很难理解为什么我们在定义新的bijector类时总是将父类的事件维定义为1。例如,以下代码是Real-NVP bijector类,并且在其init函数中:

super(NVPCoupling, self).__init__(
                event_ndims=1, validate_args=validate_args, name=name)

但是据我所知,这个真正的NVP类作用于事件维为D的张量,对吗?

def net(x, out_size):
        return layers.stack(x, layers.fully_connected, [512, 512, out_size])

    # Affine Coupling layer for Real-NVP


    class NVPCoupling(tfb.Bijector):
        """NVP affine coupling layer for 2D units.
        """

        def __init__(self, D, d, layer_id=0, validate_args=False, name="NVPCoupling"):
            """
            Args:
              d: First d units are pass-thru units.
            """
            # first d numbers decide scaling/shift factor for remaining D-d numbers.
            super(NVPCoupling, self).__init__(
                event_ndims=1, validate_args=validate_args, name=name)
            self.D, self.d = D, d
            self.id = layer_id
            # create variables here
            tmp = tf.placeholder(dtype=DTYPE, shape=[1, self.d])
            self.s(tmp)
            self.t(tmp)

        def s(self, xd):
            with tf.variable_scope('s%d' % self.id, reuse=tf.AUTO_REUSE):
                return net(xd, self.D - self.d)

        def t(self, xd):
            with tf.variable_scope('t%d' % self.id, reuse=tf.AUTO_REUSE):
                return net(xd, self.D - self.d)

        def _forward(self, x):
            xd, xD = x[:, :self.d], x[:, self.d:]
            yD = xD * tf.exp(self.s(xd)) + self.t(xd)  # [batch, D-d]
            return tf.concat([xd, yD], axis=1)

        def _inverse(self, y):
            yd, yD = y[:, :self.d], y[:, self.d:]
            xD = (yD - self.t(yd)) * tf.exp(-self.s(yd))
            return tf.concat([yd, xD], axis=1)

        def _forward_log_det_jacobian(self, x):
            event_dims = self._event_dims_tensor(x)
            xd = x[:, :self.d]
            return tf.reduce_sum(self.s(xd), axis=event_dims)

同样,当我们使用样本张量训练它时,该张量的形状为[batch_size,D]。但是tmp占位符的形状为[1,self.d],而不是[Batch_size,self.d]。这是什么原因。希望一些专家可以澄清这一点。谢谢。


解决方案


event_ndims事件维度数量,而不是输入的大小。因此event_ndims=1对向量,event_ndims=2矩阵等等进行运算请参阅该类__init__文档字符串Bijector



所属网站分类: 技术文章 > 问答

作者:黑洞官方问答小能手

链接: https://www.pythonheidong.com/blog/article/471390/

来源: python黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

21 0
收藏该文
已收藏

评论内容:(最多支持255个字符)