向量化numpy / tensorflow中具有不同形状的矩阵的乘法

我有一个4x4的输入矩阵,我想将每个2x2的切片乘以3x3的权重矩阵中存储的权重。请参见附件中的示例:

向量化numpy / tensorflow中具有不同形状的矩阵的乘法

在图像中,将4x4输入矩阵的着色部分乘以3x3权重矩阵的相同着色部分,并将其存储在4x4输出矩阵中。当切片重叠时,输出将采用重叠的总和(例如,蓝色+红色)。

我试图在Tensorflow 2.0中使用渴望的张量(可以视为numpy数组)执行此操作。这是我为执行此操作而编写的,它将产生预期的输出。

inputm = np.ones([4,4]) # initialize 4x4 input matrix
weightm = np.ones([3,3]) # initialize 3x3 weight matrix
outputm = np.zeros([4,4]) # initialize blank 4x4 output matrix

# iterate through each weight
for i in range(weightm.shape[0]):
    for j in range(weightm.shape[1]):
        outputm[i:i+2,j:j+2] += weightm[i,j] * inputm[i:i+2,j:j+2]

但是,由于我要逐一遍历权重矩阵,因此我认为这样做效率不高,当我需要在500x500的大型矩阵上执行此操作时,这将非常慢。我很难确定一种矢量化此操作的方法,也许将权重矩阵平铺为与输入矩阵相同的形状,然后执行一次矩阵乘法。我还考虑过将矩阵展平,但是我仍然找不到能够更有效地做到这一点的方法。

任何建议将不胜感激。预先感谢!

mdlyou 回答:向量化numpy / tensorflow中具有不同形状的矩阵的乘法

好的,我想我有一个解决方案,但这涉及到同时使用numpy操作(例如cmake_minimum_required(VERSION 3.14) project(my_project) set(CMAKE_CXX_STANDARD 14) add_executable(my_project main.cpp) )和TensorFlow 2.0操作(即np.repeat)。并警告您,这不是世界上最清晰的优雅解决方案,但这是我能想到的最优雅的解决方案。这样吧。

问题的主要根源是这个权重矩阵。如果您将此权重矩阵操纵为4x4矩阵(每个位置的权重总和正确),则您将拥有一个不错的权重矩阵,可以对输入进行逐元素乘法。那就是我的解决方案。请注意,这是为4x4问题设计的,您应该能够相对容易地将其扩展到500x500矩阵。

tf.segment_sum

PS:在以后的编辑中,我将尝试说明此处的情况。但我认为这将需要一些时间。

,

认识到@ thushv89的技巧后,我意识到您可以通过将权重矩阵与1的矩阵进行卷积来获得相同的结果:

import numpy as np
from scipy.signal import convolve2d

a = np.ones([4,4]) # initialize 4x4 input matrix
w = np.ones([3,3]) # initialize 3x3 weight matrix

b = np.multiply(a,convolve2d(w,np.ones((2,2))))

print(b)
本文链接:https://www.f2er.com/3127491.html

大家都在问