矩阵乘法实现卷积运算

这篇具有很好参考价值的文章主要介绍了矩阵乘法实现卷积运算。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1. 对于普通卷积运算,是使用滑动窗口实现卷积运算:

        矩阵根据卷积核的大小进行,从左到右、从上到i的移动,对应数据相乘再相加得到的数据为该区域的值。

卷积的矩阵实现,矩阵,python,算法​​​​​​​

​​​​​​​卷积的矩阵实现,矩阵,python,算法

 2.矩阵乘法实现卷积

        原理:根据对于相乘相加的机制,发现通过对卷积核填零构成和输入矩阵大小一致的矩阵,然后展平拼接起来,并且与输入矩阵展平后进行矩阵乘法运算,最后得到的结果和滑动窗口得到的结果一致.

卷积的矩阵实现,矩阵,python,算法

卷积的矩阵实现,矩阵,python,算法卷积的矩阵实现,矩阵,python,算法

3.两种方式代码进行对比

3.1 滑动窗口卷积

def hua_conv2d(image: np, kernel:np):
    new_image = np.zeros((image.shape[0]-kernel.shape[0]+1,image.shape[1]-kernel.shape[1]+1))
    for i in range(new_image.shape[0]):
        for j in range(new_image.shape[1]):
            new_image[i,j] = np.sum(image[i:i+kernel.shape[0],j:j+kernel.shape[1]]*kernel)
    return new_image

if __name__ == '__main__':
    img = np.array([[1,2,3,4,5,6],
                    [7,8,9,10,11,12],
                    [13,14,15,16,17,18],
                    [19,20,21,22,23,24],
                    [25,26,27,28,29,30],
                    [31,32,33,34,35,36]])
    kernel = np.array([[1,2,3],
                       [4,5,6],
                       [7,8,9]])

    result = hua_conv2d(img,kernel)
    print("result:\n",result)

卷积的矩阵实现,矩阵,python,算法

3.2 矩阵乘法卷积

import numpy as np

# ============ conv2d =======================
def conv2d_(image: np, kernel:np):
    # 将输入矩阵进行横向展平处理
    image_ = np.reshape(image,-1)
    print("image_形状:",image_.shape)

    # 用于存储卷积核填零展平拼接后的矩阵
    dd_ = None
    # 填充零这里使用的是,直接替换全零矩阵的值实现
    '''
        首先需要计算卷积后的到的矩阵大小(w,h)
        通过模仿滑动窗口的样子,依次填充卷积核,最后将它们拼接起来就是一个卷积核矩阵
    '''
    for i in range(image.shape[0]-kernel.shape[0]+1):
        for j in range(image.shape[1]-kernel.shape[1]+1):
            dd = np.zeros(image.shape)  # 根据输入矩阵的大小,来建立全零矩阵
            dd[i:i + kernel.shape[0], j:j + kernel.shape[1]]=kernel # 全零矩阵对应位置被卷积核替换
            if i==0 and j==0:   # 第一个卷积核记录为起点
                dd_ = dd.reshape(-1)[None,:]
            else:
                # 从第二个卷积核开始,进行按行的堆叠
                dd_ = np.concatenate((dd_, dd.reshape(-1)[None,:]),axis=0)
    print("kernels形状:",dd_.shape)
    print("image_的形状:",image_.shape)
    return dd_ @ image_

if __name__ == '__main__':
    img = np.array([[1,2,3,4,5,6],
                    [7,8,9,10,11,12],
                    [13,14,15,16,17,18],
                    [19,20,21,22,23,24],
                    [25,26,27,28,29,30],
                    [31,32,33,34,35,36]])
    kernel = np.array([[1,2,3],
                       [4,5,6],
                       [7,8,9]])

    num = conv2d_(img,kernel)
    # 按照最后的卷积的大小,进行还原
    result = num.reshape(img.shape[0]-kernel.shape[0]+1,img.shape[1]-kernel.shape[1]+1)
    print("result:\n",result)

展示:

卷积的矩阵实现,矩阵,python,算法

 3.3 总结:

        根据这里代码最终的结果,可以看出来,它们的效果是一致的。也就是可以说,我们可以使用矩阵乘法来代替滑动窗口的方式,进而加快运算的效率。  

4.小问题   

        最后代码中,由于卷积核矩阵的构造是用for循环,从而导致最终矩阵乘法这种方式还是很耗时,不过后期小编继续改进的,如果对你有用,请点个赞,谢谢          文章来源地址https://www.toymoban.com/news/detail-517425.html

到了这里,关于矩阵乘法实现卷积运算的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • [C++/PTA] 矩阵的乘法运算

    线性代数中的矩阵可以表示为一个row*column的二维数组,当row和column均为1时,退化为一个数,当row为1时,为一个行向量,当column为1时,为一个列向量。 建立一个整数矩阵类matrix,其私有数据成员如下: 建立该整数矩阵类matrix构造函数; 建立一个 *(乘号)的运算符重载,

    2024年02月04日
    浏览(39)
  • 矩阵与向量的运算:矩阵的加法、数乘与乘法

    作者:禅与计算机程序设计艺术 \\\"矩阵与向量的运算\\\"是机器学习领域的一个基础课。在实际应用中,许多算法都需要涉及到矩阵运算。理解并掌握这种运算对于解决复杂的问题和优化模型性能至关重要。本文将带您快速了解矩阵的概念,以及如何进行矩阵运算。 \\\"行列式\\\"是指

    2024年02月11日
    浏览(42)
  • 矩阵乘法,python简易实现

    1.首先,先了解下矩阵乘法最基本的工作原理,可简易得理解成 C矩阵(i, j)的值是 由A矩阵 i 行依次与B矩阵 j 列相乘的求和,即:  2.demo实现 3、基于矩阵结果是行和列的对应相乘的累和迭代,所以选择依次增加,核心算法:      其中,选取 i、j、k进行循环与迭代,k作为中

    2024年02月11日
    浏览(39)
  • MATLAB数值计算——矩阵运算乘法、除法、乘方

    矩阵是线性代数的基本单元 矩阵含有M行N列数值 矩阵中的元素可以是实数或复数 矩阵相关的基本运算:加、减、内积、逆矩阵、转置、线性方程式、特征值、特征向量、矩阵分解 运算符: 注:矩阵的乘法运算中没有乘法交换律 运算符: * 注: x=B/A是方程x A=B的解。即x=A的逆

    2024年01月16日
    浏览(37)
  • 在simulink中进行矩阵的乘法运算

    双击 product 选择为 Matirx 要使用 Reshape 将矩阵排列成矩阵模式 Matlab 的是按列读取向量,按列放置向量 1*4 向量或者 4*1 向量,MATLAB 都只认为是 4 维向量,而不是分别的行向量或者列向量 使用矩阵乘法,必须 reshape 重塑矩阵维度

    2024年02月11日
    浏览(43)
  • 【Python】矩阵乘法3种实现方案

    结论: 1、@ 符在numpy里就是矩阵乘法的意思,也是dot()的意思。 2、用这个 @ 运算符可以不用再使用matmult方法 3、一般来说,@ 比.dot()方法要慢一点点。dot是numpy里的函数,主要用于求向量相乘,矩阵乘法,矩阵与向量乘法。   内积,点积,乘法, 点积 对于元素相乘并相加,

    2024年02月12日
    浏览(46)
  • 线性代数:矩阵运算(加减、数乘、乘法、幂、除、转置)

    目录 加减 数乘  矩阵与矩阵相乘  矩阵的幂 矩阵转置  方阵的行列式  方阵的行列式,证明:|AB| = |A| |B|        

    2024年01月22日
    浏览(50)
  • 矩阵的乘法运算与css的3d变换(transform)

    引言:你有没好奇过,在一个使用了transform变换的元素上使用window.getComputedStyle(htmlElement)[\\\'transform\\\'] 查询出来的值代表什么? 为什么硬件加速要使用transform,以及为什么硬件加速会快? 小科普:关于矩阵的乘法 由此,可以看到两个矩阵相乘就是拿第一个的每一行,乘以第二个

    2024年02月08日
    浏览(41)
  • 高性能计算的矩阵乘法优化 - Python + OpenMP实现

    关于上一节读者某些疑问 :为什么你用进程并行不是线程并行? 回答 :由于Python解释器有GIL(全局解释器锁),在单进程的解释器上有线程安全锁,也就是说每次只能一个线程访问解释器,因此Python在语法上的多线程(multithreads)实现是不会提高并行性能的。 这一点和C

    2024年02月15日
    浏览(66)
  • 高性能计算的矩阵乘法优化 - Python +MPI的实现

    本次实验的目的是使用MPI的并行性来进行矩阵乘法优化,本人使用 Python 实现 实验硬件: CPU :AMD Ryzen 7 5800H(3.20 GHz) 内存 :32GB (3200MHz) 要求 :使用一个矩阵,一个向量相乘,分别用单进程和多进程的mpi接口实现。 全局的规模参数是 Scale 数据示例 : 当 Scale=5 时,数据示例如

    2023年04月22日
    浏览(100)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包