Python 克拉斯Kronecker产品的定制Lambda层-批量尺寸保留尺寸的问题

Python 克拉斯Kronecker产品的定制Lambda层-批量尺寸保留尺寸的问题,python,tensorflow,lambda,keras,keras-layer,Python,Tensorflow,Lambda,Keras,Keras Layer,我正在使用Keras2.1.5和Tensorflow后端创建一个图像分类模型。 在我的模型中,我想通过计算卷积层的输入和输出。我已经使用Keras后端函数编写了计算两个3D张量的Kronecker积的函数 def kronecker_product(mat1, mat2): #Computes the Kronecker product of two matrices. m1, n1 = mat1.get_shape().as_list() mat1_rsh = K.re

我正在使用Keras2.1.5和Tensorflow后端创建一个图像分类模型。 在我的模型中,我想通过计算卷积层的输入和输出。我已经使用Keras后端函数编写了计算两个3D张量的Kronecker积的函数

def kronecker_product(mat1, mat2):
    #Computes the Kronecker product of two matrices.
    m1, n1 = mat1.get_shape().as_list()
    mat1_rsh = K.reshape(mat1, [m1, 1, n1, 1])
    m2, n2 = mat2.get_shape().as_list()
    mat2_rsh = K.reshape(mat2, [1, m2, 1, n2])
    return K.reshape(mat1_rsh * mat2_rsh, [m1 * m2, n1 * n2])

def kronecker_product3D(tensors):
    tensor1 = tensors[0]
    tensor2 = tensors[1]
    #Separete slices of tensor and computes appropriate matrice kronecker product
    m1, n1, o1 = tensor1.get_shape().as_list()
    m2, n2, o2 = tensor2.get_shape().as_list()
    x_list = []
    for ind1 in range(o1):
        for ind2 in range(o2):
            x_list.append(DenseNetKTC.kronecker_product(tensor1[:,:,ind1], tensor2[:,:,ind2]))
    return K.reshape(Concatenate()(x_list), [m1 * m2, n1 * n2, o1 * o2])
然后我尝试使用Lambda层将操作包装到Keras层:

cb = Convolution2D(12, (3,3), padding='same')(x)
x = Lambda(kronecker_product3D)([x, cb])
但收到错误“ValueError:太多值无法解包(预期为3)”。我期望输入是3维的张量,但事实上,它有4维-第一维是为Keras中的批量大小保留的。我不知道如何处理这个动态尺寸的第四维度

我搜索了很多,但找不到任何手动处理批次维度的示例函数


我很乐意得到任何提示或帮助。多谢各位

简易解决方案:

只需将批处理维度添加到您的计算中并重新塑造

def kronecker_product(mat1, mat2):
    #Computes the Kronecker product of two matrices.
    batch, m1, n1 = mat1.get_shape().as_list()
    mat1_rsh = K.reshape(mat1, [-1, m1, 1, n1, 1])
    batch, m2, n2 = mat2.get_shape().as_list()
    mat2_rsh = K.reshape(mat2, [-1, 1, m2, 1, n2])
    return K.reshape(mat1_rsh * mat2_rsh, [-1, m1 * m2, n1 * n2])

def kronecker_product3D(tensors):
    tensor1 = tensors[0]
    tensor2 = tensors[1]
    #Separete slices of tensor and computes appropriate matrice kronecker product
    batch, m1, n1, o1 = tensor1.get_shape().as_list()
    batch, m2, n2, o2 = tensor2.get_shape().as_list()
    x_list = []
    for ind1 in range(o1):
        for ind2 in range(o2):
            x_list.append(kronecker_product(tensor1[:,:,:,ind1], tensor2[:,:,:,ind2]))
    return K.reshape(Concatenate()(x_list), [-1, m1 * m2, n1 * n2, o1 * o2])

对于困难的解决方案,我会尝试找出一种避免迭代的方法,但这可能比我想象的要复杂得多……

谢谢你的回答。当我在一个小例子上尝试它时,它是有效的。不幸的是,当我尝试在Keras中使用这个lambda函数构建模型时,它花费了很长时间,然后被终止。可能是我的内存用完了什么的。。。我会在更强大的机器上试试。。。如果没有for循环,我会更好,但是这个解决方案似乎超出了我的想象……是的,你有平方数据大小。我需要对批处理中的每个张量进行更多操作,是否有可能在批处理中以某种方式循环张量?我的想法是计算Kronecker乘积,然后进行一些转换/压缩,使输出再次达到原始大小。我在一些讨论中发现,他们建议使用keras.backend.rnn或tensorflow.scan函数作为循环的等效函数,但我没有找到任何具体的实现示例。