Python 如何使用maclaurin系列扩展二维阵列?

Python 如何使用maclaurin系列扩展二维阵列?,python,tensorflow,Python,Tensorflow,我试图将像素向量输入到卷积神经网络(CNN),其中像素向量来自图像数据,如cifar-10数据集。在将像素向量输入CNN之前,我需要用maclaurin系列扩展像素向量。重点是,我知道了如何用一维展开张量,但无法用二维展开张量。有谁能告诉我如何将一维张量的麦克劳林级数应用于一维以上的张量?在TensorFlow或Keras中是否有任何启发式方法来实现这一点?有什么想法吗 CNN上的麦克劳林系列节目: 我找到了用麦克劳林级数展开一维张量的方法。下面是如何抓取实现的外观: def cnn_taylo

我试图将像素向量输入到卷积神经网络(CNN),其中像素向量来自图像数据,如cifar-10数据集。在将像素向量输入CNN之前,我需要用maclaurin系列扩展像素向量。重点是,我知道了如何用一维展开张量,但无法用二维展开张量。有谁能告诉我如何将一维张量的麦克劳林级数应用于一维以上的张量?在TensorFlow或Keras中是否有任何启发式方法来实现这一点?有什么想法吗

CNN上的麦克劳林系列节目:

我找到了用麦克劳林级数展开一维张量的方法。下面是如何抓取实现的外观:

def cnn_taylor(input_dim, approx_order=2):
    x = Input((input_dim,))
    def pwr(x, approx_order):
        x = x[..., None] 
        x = tf.tile(x, multiples=[1, 1, approx_order + 1])
        pw = tf.range(0, approx_order + 1, dtype=tf.float32) 
        x_p = tf.pow(x, pw) 
        x_p = x_p[..., None]
        return x_p

    x_p = Lambda(lambda x: pwr(x, approx_order))(x)
    h = Dense(1, use_bias=False)(x_p)  
    def cumu_sum(h):
        h = tf.squeeze(h, axis=-1)  
        s = tf.cumsum(h, axis=-1) 
        s = s[..., None] 
        return s
    S = Lambda(cumu_sum)(h)
所以以上的实现是关于如何用一维张量用泰勒展开来展开CNN的一个草图编码尝试。我想知道如何用多维数组(即dim=3)对张量做同样的事情


如果我想用泰勒展开法以2的近似阶展开CNN,其中输入是来自
RGB
图像的像素向量,我如何在TensorFlow中轻松实现这一点?有什么想法吗?谢谢

如果我理解正确,提供的计算图中的每个
x
都只是一个标量(一个像素的一个通道)。在这种情况下,为了将变换应用于每个像素,您可以:

  • 将来自卷积层的4D
    (b,h,w,c)
    输入展平为形状张量
    (b,h*w*c)
  • 将变换应用于生成的张量
  • 撤消重塑以获得形状为(b,h,w,c)`的4D张量,其“泰勒展开”已按元素应用
  • 这可以通过以下方式实现:

    shape_cnn = h.shape  # Shape=(bs, h, w, c)
    flat_dim = h.shape[1] * h.shape[2] * h.shape[3]
    h = tf.reshape(h, (-1, flat_dim))
    taylor_model = taylor_expansion_network(input_dim=flat_dim, max_pow=approx_order)
    h = taylor_model(h)
    h = tf.reshape(h, (-1, shape_cnn[1], shape_cnn[2], shape_cnn[3]))
    
    注意:我借用了taylor\u expansion\u network的功能


    更新:我仍然不清楚最终目标,但这次更新可能使我们更接近预期的输出。我修改了
    taylor\u扩展\u网络
    ,将管道的第一部分应用于形状
    (宽度、高度,nb\u通道=3)
    ,返回形状
    的张量(宽度、高度,nb\u通道=3,最大功率+1)


    在此修改后的模型中,管道的最后一步,即每个
    i
    w_i*s_i
    之和,不适用。现在,您可以使用生成的形状张量
    (宽度、高度、nb_通道=3,最大功率+1)

    如果我错了,请纠正我的错误,但我们的想法是对每个RGB通道单独应用“泰勒级数展开”吗?也就是说,将每个通道的图像展平,然后应用3个独立的变换(每个通道一个),这是一个可接受的解决方案吗?@rvinas我刚刚用1维张量更新了CNN泰勒展开的计算图,我想知道如果3维张量用于泰勒展开,如何实现。我们将感谢您的宝贵努力和时间。我会为你的好意给予奖励。感谢you@rvinas嗨,Ramon,我认为创建所有RGB像素的平坦输入,然后使用
    taylor\u expansion\u network
    不是我所想到的。我们可以迭代RGB通道进行泰勒展开吗,比如我们将有6个近似阶为2的不同展开神经元,它们肯定会有6个不同的权重,并得到它们的累加和?可能吗?谢谢您好,我认为使用变平变暗到RGB通道不是一个好主意。你认为我们可以在for循环中迭代RGB通道,然后应用taylor_展开网络吗?感谢我所尝试的是,首先我想在每个RGB通道上进行taylor展开(即,大约为2,将输入x_I提高到p_I的幂,乘以alpha系数,为[0,max_pow]中的每个I计算s_I),但在使用泰勒展开迭代RGB通道后,进行累计和w_i*s_i。我们如何完成?我将提供赏金以感谢您的善意帮助。谢谢,雷蒙娜,像素/卷积之间的权重
    w
    alpha
    共享吗?我恐怕meHi Ramon还不清楚这个问题,请澄清,权重和alpha不会在像素/卷积之间共享。例如,每个RGB通道的像素向量的泰勒展开网络(约为2),将有一个不同的系数,权重。非常感谢您的帮助。我将很快为您在这个问题上的努力做一个悬赏评分。@Dan在这种情况下,由于权重不共享,“泰勒展开”使用展平向量应该会产生您想要的结果,不是吗?因为展平向量允许您将变换独立应用于每个“RGB值”另外,当你谈论
    x_i
    w_i
    s_i
    时,它们是标量还是矢量?我仍然在努力理解你想要实现的目标。
    def taylor_expansion_network_2(width, height, nb_channels=3, max_pow=2):
        input_dim = width * height * nb_channels
    
        x = Input((width, height, nb_channels,))
        h = tf.reshape(x, (-1, input_dim))
    
        # Raise input x_i to power p_i for each i in [0, max_pow].
        def raise_power(x, max_pow):
            x_ = x[..., None]  # Shape=(batch_size, input_dim, 1)
            x_ = tf.tile(x_, multiples=[1, 1, max_pow + 1])  # Shape=(batch_size, input_dim, max_pow+1)
            pows = tf.range(0, max_pow + 1, dtype=tf.float32)  # Shape=(max_pow+1,)
            x_p = tf.pow(x_, pows)  # Shape=(batch_size, input_dim, max_pow+1)
            return x_p
    
        h = raise_power(h, max_pow)
    
        # Compute s_i for each i in [0, max_pow]
        h = tf.cumsum(h, axis=-1)  # Shape=(batch_size, input_dim, max_pow+1)
    
        # Get the input format back
        h = tf.reshape(h, (-1, width, height, nb_channels, max_pow+1))  # Shape=(batch_size, w, h, nb_channels, max_pow+1)
    
        # Return Taylor expansion model
        model = Model(inputs=x, outputs=h)
        model.summary()
        return model