矩阵乘法

im2col:将卷积运算转为矩阵相乘

你离开我真会死。 提交于 2019-11-27 22:32:58
im2col:将卷积运算转为矩阵相乘 发表于 2019-04-26 更新于 2019-05-15 分类于 深度学习 阅读次数: 28 本文字数: 2.9k 博客: blog.shinelee.me | 博客园 | CSDN im2col实现 如何将卷积运算转为矩阵相乘?直接看下面这张图,以下图片来自论文 High Performance Convolutional Neural Networks for Document Processing : im2col 上图为3D卷积的传统计算方式与矩阵乘法计算方式的对比,传统卷积运算是将卷积核以滑动窗口的方式在输入图上滑动,当前窗口内对应元素相乘然后求和得到结果,一个窗口一个结果。 相乘然后求和恰好也是向量内积的计算方式 ,所以可以 将每个窗口内的元素拉成向量,通过向量内积进行运算 ,多个窗口的向量放在一起就成了矩阵,每个卷积核也拉成向量,多个卷积核的向量排在一起也成了矩阵,于是,卷积运算转化成了矩阵运算 >>> : 现在是卷积 -> 矩阵乘法?能否尝试各种矩阵乘法,反推卷积形式? deformable conv 对应的是什么矩阵乘法? 下图为转化后的矩阵尺寸,padding为0: EmzaRO.png 代码上怎么实现呢?这里参看一下 SeetaFaceEngine/FaceIdentification/src/conv_net.cpp

AcWing 牛站

梦想的初衷 提交于 2019-11-27 22:31:18
AcWing 牛站 Description 给定一张由T条边构成的无向图,点的编号为1~1000之间的整数。 求从起点S到终点E恰好经过N条边(可以重复经过)的最短路。 Input 第1行:包含四个整数N,T,S,E。 第2..T+1行:每行包含三个整数,描述一条边的边长以及构成边的两个点的编号。 Output 输出一个整数,表示最短路的长度。 Sample Input 2 6 6 4 11 4 6 4 4 8 8 4 9 6 6 8 2 6 9 3 8 9 Sample Output 10 Data Size 10 题解: 矩阵快速幂。 挺妙的一道题。当我们设A(i, j)为i到j经过0条边的最短路。那么显然原图的邻接矩阵就是A矩阵,我们再设B(i, j)为i到j经过1条边的最短路。 那么我们只需要枚举中间点k,然后在A矩阵中进行松弛即可。那么A矩阵枚举一次中转点得到B矩阵。那么我要求经过N条道的矩阵。那么不就是A矩阵枚举N次中转点吗? 即A矩阵的N次方次运算 。但是,矩阵乘法中发生了变动,即变成了 类似Floyd的东西 ,因为要求最短路。你可能会问,为什么快速幂又不用变呢?快速幂只是保证进行运算的次数。 那么枚举中转点后,如果更新呢?举个例子,假设现在有4个点1、2、3、4。现要更新2到1的最短路。我们可以看看dis(2, 1) + dis(1, 1)是否 < dis(1, 2

机器学习之ndarray笔记

删除回忆录丶 提交于 2019-11-27 22:15:20
Numpy的介绍 1. Ndarray:N-dimensional array, N维数组 2. 一种由相同类型的元素组成的多维数组,元素数量是事先指定好的 例:建立Ndarray多维数组 arr = np.array( [ [1,2,3,4], [2,3,4,5] ]) 这是一个二维数组arr.ndim为2 这个数组的形状arr.shape为(2, 4)即2行4列 这个数组的数据类型arr.dtype为int32 3. 元素的数据类型由dtype(data-type)对象来指定,每个ndarray只有一种dtype类型 例: np.array(['Python','cctv','ibeifeng','hello world'],dtype='|S4') 输出结果array([b'Pyth', b'cctv', b'ibei', b'hell'], dtype='|S4') 其中S4中的S表示字符串型,4表示每个字符串长度为4,所以输出结果每个数组只有4个字符 arr3 = np.array(['1','2','3','4'],dtype='int') # 表明arr3为整型 # 输出array([1, 2, 3, 4]) arr3 = np.array(['1','2','3','4'],dtype='float') # 表明arr3为浮点型 # 输出array([1., 2.,

2019年8月19日矩阵

自闭症网瘾萝莉.ら 提交于 2019-11-27 21:07:07
矩阵 相乘最重要的方法是一般矩阵 乘积 。它只有在第一个矩阵的列数(column)和第二个矩阵的行数(row)相同时才有意义 [1] 。一般单指矩阵乘积时,指的便是一般矩阵乘积。一个m×n的矩阵就是m×n个数排成m行n列的一个数阵。由于它把许多数据紧凑的集中到了一起,所以有时候可以简便地表示一些复杂的模型。 定义 设 A 为 的矩阵, B 为 的矩阵,那么称 的矩阵 C 为矩阵 A 与 B 的乘积,记作 ,其中矩阵C中的第 行第 列元素可以表示为: 如下所示: 注意事项 当矩阵A的列数等于矩阵B的行数时,A与B可以相乘。 矩阵C的行数等于矩阵A的行数,C的列数等于B的列数。 乘积C的第m行第n列的元素等于矩阵A的第m行的元素与矩阵B的第n列对应元素乘积之和。 基本性质 乘法结合律: ( AB ) C = A ( BC ). [2] 乘法左分配律:( A + B ) C = AC + BC [2] 乘法右分配律: C ( A + B )= CA + CB [2] 对数乘的结合性 k ( AB )=( kA ) B = A ( kB ). 转置 ( AB ) T= B T A T. 矩阵乘法一般不满足交换律 [3] 。 乘积-哈达马积( hadamard product) 矩阵 与 矩阵 的Hadamard积记为 。其元素定义为两个矩阵对应元素的乘积 的 m×n 矩阵 [2] 。例如,

对卷积的定义和意义的通俗解释

被刻印的时光 ゝ 提交于 2019-11-27 18:56:05
https://blog.csdn.net/palet/article/details/88862647 对卷积的定义和意义的通俗解释 2019年03月31日 10:17:49 东东~ 阅读数 754 标签: 卷积 版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。 本文链接: https://blog.csdn.net/palet/article/details/88862647 对卷积的困惑 卷积这个概念,很早以前就学过,但是一直没有搞懂。教科书上通常会给出定义,给出很多性质,也会用实例和图形进行解释,但究竟为什么要这么设计,这么计算,背后的意义是什么,往往语焉不详。作为一个学物理出身的人,一个公式倘若倘若给不出结合实际的直观的通俗的解释(也就是背后的“物理”意义),就觉得少了点什么,觉得不是真的懂了。 教科书上一般定义函数 的卷积 如下: 连续形式: 并且也解释了,先对g函数进行翻转,相当于在数轴上把g函数从右边褶到左边去,也就是卷积的“卷”的由来。 然后再把g函数平移到n,在这个位置对两个函数的对应点相乘,然后相加,这个过程是卷积的“积”的过程。 这个只是从计算的方式上对公式进行了解释,从数学上讲无可挑剔,但进一步追问,为什么要先翻转再平移,这么设计有何用意?还是有点费解。 好在有万能的互联网,尤其是知乎

冈萨雷斯Matlab版第二章(基本原理)要点记录

こ雲淡風輕ζ 提交于 2019-11-27 16:22:56
标准数组生成 zero(M, N) 生成一个大小是M N的double类矩阵,其元素均为0 ones(M, N) 生成一个大小是M N的double类矩阵,其元素均为1 ture(M, N) 生成一个大小是M N的logical类矩阵,其元素均为1 false(M, N) 生成一个大小是M N的logical类矩阵,其元素均为0 magic(M) 生成一个大小均为M N的“魔方矩阵”,在该矩阵中,每一行的元素之和、每一列的元素之和以及主对角线中的元素之和均相等,易于生成,元素均为整数 rand(M, N) 生成一个大小是M N的矩阵,其元素都是在区间[0,1]中均匀分布的随机数 randn(M, N) 生成一个大小是M*N的矩阵,其元素是正态分布的随机数,随机数均值为0,方差为1 数组和矩阵算术运算符 图像是等价于矩阵的二维数组,因此以下所有运算符均适用于图像 .* 表示数组乘法, times(A, B) 这种乘法的乘积是与A和B大小相同的数组,其每个元素都是A和B中相应元素的乘积 * 表示传统意义的矩阵乘法 mtimes(A, B) ./ 数组右除 rdivide()A, B .\ 数组左除 ldivide(A, B) / 矩阵右除 mrdivide(A, B) \ 矩阵左除 mldivide(A, B) .^ 数组求幂 power(A, B) ^ 矩阵求幂 mpower(A,

Android OpenGLES2.0(三)——等腰直角三角形和彩色的三角形

匆匆过客 提交于 2019-11-27 15:50:27
上一篇博客中我们已经绘制出了一个直角三角形,虽然我们相对于坐标,我们设置的直角三角形的两腰是相等的,但是实际上展示出来的却并不是这样,虽然通过计算,我们可以把三角形的两腰计算一下比例,使它们在坐标上不等,但是现实出来相等,但是当绘制的图形比较复杂的话,这个工作量对我们来说实在太庞大了。那么我们怎么做呢?答案是,使用变换矩阵,把计算交给OpenGL。 矩阵 在数学中,矩阵(Matrix)是一个按照长方阵列排列的复数或实数集合 ,最早来自于方程组的系数及常数所构成的方阵。这一概念由19世纪英国数学家凯利首先提出。 矩阵常被用于图像处理、游戏开发、几何光学、量子态的线性组合及电子学等多种领域。我们现在相当于是在图像处理或者游戏开发的领域来使用矩阵。在大学的高数课中,有学习到矩阵,很多人在大学学习高数、线性代数之类的课程时,总是觉得学习这些东西没什么用(我也是)。实际上,这些这是对于程序员,尤其是需要做游戏开发、图像视频处理的程序员来说是非常重要的。扯偏了。。。 在三维图形学中,一般使用的是4阶矩阵。在DirectX中使用的是行向量,如[xyzw][xyzw],所以与矩阵相乘时,向量在前矩阵在后。OpenGL中使用的是列向量,如[xyzx]T[xyzx]T,所以与矩阵相乘时,矩阵在前,向量在后。关于矩阵的具体知识,博客中不详细讲解,需要了解的同学可以自行查阅。 如果要自己去写变换的矩阵

矩阵运算模板

╄→гoц情女王★ 提交于 2019-11-27 13:58:16
矩阵运算题目(持续更新) \(1.\) 矩阵乘法 \(2.\) 甲苯先生的字符串 矩阵乘法 细节:输出答案前还要取模一次以防爆负。 $View$ $Code$ //省略头文件 using namespace std; inline int read() { int ret=0,f=1; char ch=getchar(); while(ch>'9'||ch='0'&&ch 来源: https://www.cnblogs.com/Peter0701/p/11366659.html

动态规划之矩阵链乘法

淺唱寂寞╮ 提交于 2019-11-27 13:41:04
矩阵链相乘 矩阵链乘法 求解矩阵链相乘问题时动态规划算法的另一个例子。给定一个n个矩阵的序列(矩阵链)<A1,A2,...,An>,我们希望计算它们的乘积 A1A2...An 两个矩阵A和B只有相容(compatible),即A的列数等于B的行数时,才能相乘。如果A是p×q的矩阵,B是q×r的矩阵,那么乘积C是p×r的矩阵。计算C所需要时间由第8行的标量乘法的次数决定的,即pqr。 以矩阵链<A1,A2,A3>为例,来说明不同的加括号方式会导致不同的计算代价。假设三个矩阵的规模分别为10×100、100×5和5×50。 如果按照((A1A2)A3)的顺序计算,为计算A1A2(规模10×5),需要做10×100×5=5000次标量乘法,再与A3相乘又需要做10×5×50=2500次标量乘法,共需7500次标量乘法。 如果按照(A1(A2A3))的顺序计算,为计算A2A3(规模100×50),需100×5×50=25000次标量乘法,再与A1相乘又需10×100×50=50000次标量乘法,共需75000次标量乘法。因此第一种顺序计算要比第二种顺序计算快10倍。 矩阵链乘法问题(matrix-chain multiplication problem)可描述如下:给定n个矩阵的链<A1,A2,...,An>,矩阵Ai的规模为p(i-1)×p(i) (1<=i<=n),求完全括号化方案

[动态dp][矩阵乘法][树链剖分][线段树] Luogu P4719 【模板】动态dp

给你一囗甜甜゛ 提交于 2019-11-27 13:14:28
题解 动态dp模板题,矩阵乘法有所不同C=A*B=max(a[i][j]+b[j][k]) 代码 1 #include <cstdio> 2 #include <iostream> 3 using namespace std; 4 const int N=1e5+1,inf=999999999; 5 struct matrix 6 { 7 int a[3][3]; 8 void init() { for (int i=0;i<2;i++) for (int j=0;j<2;j++) a[i][j]=-inf; } 9 }ans,last,front,T[N*4],val[N]; 10 struct edge{ int to,from; }e[N*2]; 11 struct Tree{ int size,id,fa,top,son,deep,end; }t[N*2]; 12 int n,m,cnt,tot,ldp[N][2],dp[N][2],head[N],a[N],b[N]; 13 void insert(int x,int y) 14 { 15 e[++cnt].to=y,e[cnt].from=head[x],head[x]=cnt; 16 e[++cnt].to=x,e[cnt].from=head[y],head[y]=cnt; 17 } 18 matrix mul