【问题标题】:Multiply a series of matrices将一系列矩阵相乘
【发布时间】:2025-11-24 14:45:01
【问题描述】:

我有一个如下矩阵:

[0 0 1 1]
[0 0 1 1]
[0 0 0 0]
[0 0 0 0]

我需要从左上到右将它分成多个3x3 矩阵。这有点像3x3 在矩阵上的滑动。在此示例中,我们将有 4 3x3 矩阵,如下所示:

    [0 0 1]     [0 1 1]
1 = [0 0 1] 2 = [0 1 1]
    [0 0 0]     [0 0 0]

    [0 0 1]     [0 1 1]
3 = [0 0 0] 4 = [0 0 0]
    [0 0 0]     [0 0 0]

我已经使用tf.extract_image_patch 进行了尝试,得到了 4 个矩阵,但我仍然不确定如何在 Tensorflow 中为这些矩阵做某种运行产品。或者,更好地实现运行产品,而无需预先计算单独的矩阵。

对于正在运行的产品,我的意思是:我需要按元素对 1-4 个以上的矩阵进行多重处理,并且需要得到 1 3x3 矩阵。例如,1&2 矩阵将相乘,结果将与矩阵3 相乘,结果将再次与矩阵4 相乘。这个操作应该让我开始补丁([[1 1], [1 1]]) 在我的原始矩阵中,如下所示:

       [0 0 1]   
res =  [0 0 0] 
       [0 0 0]

完成后,我需要将此操作作为我网络的一部分,也许是一个 Tensorflow 层。

如果有人可以帮助我实现这一目标,我将不胜感激。谢谢。

编辑 这似乎是在列表中将矩阵相乘的一种方法,但我仍在寻找1) 将矩阵分割成多个部分并以更好的方式将它们相乘,2) 将其作为一个层添加到网络中:

tf.scan(lambda a, b: tf.multiply(tf.squeeze(a), tf.squeeze(b)), original)

【问题讨论】:

    标签: python-3.x tensorflow


    【解决方案1】:

    你可以使用 tf.nn.conv2d,像这样操作矩阵称为卷积

    参见 tensorflow.org/api_docs/python/tf/nn/conv2d

    【讨论】:

    • 是的,我知道 conv2d,但不幸的是它并不能完全满足我的需求。我需要逐元素乘法单独
    【解决方案2】:

    你可以使用 numpy 数组切片

    import numpy as np
    
    A = np.array([[0, 0, 1, 1],
                  [0, 0, 1, 1],
                  [0, 0, 0, 0],
                  [0, 0, 0, 0]])
    
    res = A[:-1, :-1] * A[:-1, 1:] * A[1:, :-1] * A[1:, 1:]
    

    然后,也许,将 numpy 数组转换为 Tensor 对象

    tf.convert_to_tensor(res)
    

    【讨论】:

    • 谢谢,但是我对 Tensorflow 比较陌生,请您告诉我如何将此操作添加到我的 TF 网络中,以便在每次训练期间都执行?