当前位置: 首页 > news >正文

做旅游网站需要的背景申请免费域名空间

做旅游网站需要的背景,申请免费域名空间,中山网站制作网页,wp_localize_script wordpress【详细图解】再次理解im2col 转自#xff1a;https://mp.weixin.qq.com/s/GPDYKQlIOq6Su0Ta9ipzig 一句话#xff1a;im2col是将一个[C,H,W]矩阵变成一个[H,W]矩阵的一个方法#xff0c;其原理是利用了行列式进行等价转换。 为什么要做im2col? 减少调用gemm的次数。 重要…【详细图解】再次理解im2col 转自https://mp.weixin.qq.com/s/GPDYKQlIOq6Su0Ta9ipzig 一句话im2col是将一个[C,H,W]矩阵变成一个[H,W]矩阵的一个方法其原理是利用了行列式进行等价转换。 为什么要做im2col? 减少调用gemm的次数。 重要本次的代码只是为了方便理解im2col不是用来做加速所以代码写的很简单且没有做任何优化。 一、卷积的可视化 例子是一个[1, 6, 6]的输入卷积核是[1, 3, 3]stride等于1padding等于0。那么卷积的过程可视化如下图一共需要做16次卷积计算每次卷积计算有9次乘法和8次加法。 输出的公式如下即Output_height (6 - 3 2*0)/1 1 4 Output_width 二、行列式 乘号左边的横条跟乘号右边的竖条进行点乘(即每个元素对应相乘后再全部加起来)。 关于行列式大家都清楚的一点一根横条的元素个数要等于一根竖条的元素个数(这样才可以让做点乘的时候能一一对应起来不会让小方块落单)。竖条有多少条出来的结果就有多少个小方块(在横条的个数为1的情况下)。 出来的结果(等号的右边)的行数等于乘号左边的横条的行数出来的结果(等号的右边)的列数等于乘号右边的横条的列数公式表示就是[row, x] * [x, col] [row, col]。举个例子[3, 8] * [8, 4] [3, 4] 三、[1, H, W]的im2col 展开后就可以直接做两个数组的矩阵乘积了 import numpy as npscr np.array(np.arange(0,7**2).reshape(7, 7)) intH, intW scr.shapekernel np.array([-0.2589, 0.2106, -0.1583, -0.0107, 0.1177, 0.1693, -0.1582, -0.3048, -0.1946]).reshape(3,3) KHeight, KWeight kernel.shaperow_num intH - KHeight 1 col_num intW - KWeight 1 OutScrIm2Col np.zeros([row_num*col_num,KHeight*KWeight]) ii, jj 0, 0 col_cnt, row_cnt 0, 0 for i in range(0, row_num):for j in range(0, col_num): # 这俩个for是为了遍历列即乘了多少次这里完全可以merge成一个for循环只需要提前计算好就行ii ijj jfor iii in range(0, KHeight): # 这俩个for是为了取出一次 一横 * 一竖 的 行列式这里完全可以mege成一个for循环只需要提前计算好就行for jjj in range(0, KHeight):OutScrIm2Col[row_cnt][col_cnt] scr[ii][jj]jj 1col_cnt 1ii 1jj jcol_cnt 0row_cnt 1im2col_kernel im2col_kernel.reshape(-1,9) OutScrIm2Col OutScrIm2Col.T out np.matmul(im2col_kernel,OutScrIm2Col) # 这步就是做两个数组的矩阵乘积中间俩个for循环是来填满展开的数组/矩阵的每一列即卷积核对应的元素其个数等于卷积核的元素个数举个例子[1, 3, 3]的卷积核那么该卷积核的元素个数等于9最外层的两个for循环是用来填满展开的数组/矩阵的每一行即列数也就是卷积核在输入滑动了多少次 pytorch来做验证 import torch from torch import nn import numpy as np torch.manual_seed(100)net nn.Conv2d(1, 1, 3, padding0, biasFalse)scr np.array(np.arange(0, 7**2).reshape(1, 1, 7, 7)).astype(np.float32) scr torch.from_numpy(scr)print(net.weight.data) # 把这里的weight的值复制到上面numpy的代码来做验证 print(net(scr))# print的信息 tensor([[[[-0.2589, 0.2106, -0.1583],[-0.0107, 0.1177, 0.1693],[-0.1582, -0.3048, -0.1946]]]]) tensor([[[[ -7.6173, -8.2053, -8.7934, -9.3815, -9.9695],[-11.7337, -12.3217, -12.9098, -13.4978, -14.0859],[-15.8500, -16.4381, -17.0261, -17.6142, -18.2022],[-19.9664, -20.5545, -21.1425, -21.7306, -22.3186],[-24.0828, -24.6708, -25.2589, -25.8469, -26.4350]]]],grad_fnThnnConv2DBackward)四、[C, H, W]的im2col 前面一堆图是我故意不写文字希望大家能够通过图能够看明白。前面卷积核只有一行的情况跟[1, H, W]的情况基本一摸一样只是这一行的元素个数等于卷积核的元素个数即可5x3x345展开的特征图的每一个竖条也是45。 当卷积核函数等于3的时候就是对应的只要增加卷积核的横条数即可展开的特征图没有改变。这里希望大家用行列式的计算和普通卷积的过程联想起来你会发现是一摸一样的计算过程。 代码其实跟[1,H, W]只有一初不同就是从特征图里面取数据的时候多了个维度需要取对应的通道。这里为什么要取对应的通道数呢原因是行列式的计算中横条和竖条是元素一一对应做乘法。 import numpy as np np.set_printoptions(thresholdnp.inf)src np.array(np.arange(0, 9**3))[0:5*9*9] src np.tile(src, 5) src src.reshape(-1, 5, 9, 9) kernel np.array([[[[-0.1158, 0.0942, -0.0708],[-0.0048, 0.0526, 0.0757],[-0.0708, -0.1363, -0.0870]],[[-0.1139, -0.1128, 0.0702],[ 0.0631, 0.0857, -0.0244],[ 0.1197, 0.1481, 0.0765]],[[-0.0823, -0.0589, -0.0959],[ 0.0966, 0.0166, 0.1422],[-0.0167, 0.1335, 0.0729]],[[-0.0032, -0.0768, 0.0597],[ 0.0083, -0.0754, 0.0867],[-0.0228, -0.1440, -0.0832]],[[ 0.1352, 0.0615, -0.1005],[ 0.1163, 0.0049, -0.1384],[ 0.0440, -0.0468, -0.0542]]]])scrN, srcChannel, intH, intW src.shape KoutChannel, KinChannel, kernel_H, kernel_W kernel.shape im2col_kernel kernel.reshape(KoutChannel, -1)outChannel, outH, outW KoutChannel, (intH - kernel_H 1) , (intW - kernel_W 1) OutScrIm2Col np.zeros( [ kernel_H*kernel_W*KinChannel, outH*outW ] ) row_num, col_num OutScrIm2Col.shapeii, jj, cnt_row, cnt_col 0, 0, 0, 0# 卷积核的reshape准备 outchannel, k*k*inchannel im2col_kernel kernel.reshape(KoutChannel, -1) # 输入的reshape准备 outH (intH - k 2*pading)/stride 1 outChannel, outH, outW KoutChannel, (intH - kernel_H 1) , (intW - kernel_W 1)i_id -1 cnt_col -1 cnr 0 for Outim2colCol_H in range(0, outH):i_id 1j_id -1cnt_row -1for Outim2colCol_W in range(0, outW):j_id, cnt_col 1, 1cnt_row 0for c in range(0, srcChannel): # 取一次卷积的数据放到一列for iii in range(0, kernel_H):i_number iii i_idfor jjj in range(0, kernel_W):j_number jjj j_idOutScrIm2Col[cnt_row][cnt_col] src[bs][c][i_number][j_number]cnr 1cnt_row 1Out np.matmul(im2col_kernel, OutScrIm2Col) Out.reshape(outChannel, outH, outW) print(Out.shape) print(outChannel, outH, outW)pytorch代码的验证 import torch from torch import nn import numpy as np torch.manual_seed(100)net nn.Conv2d(in_channels5, out_channels1, kernel_size3, padding0, biasFalse) print(net.weight.data.shape) print(net.weight.data)scr np.array(np.arange(0, 9**3))[:9*9*5].reshape(1, -1, 9, 9).astype(np.float32)scr torch.from_numpy(src) print(data:, scr.shape) scr torch.from_numpy(scr) print(data:, scr.shape)Out net(scr) print(Our:, Out.shape) print(Out)五、[B, C, H, W]的im2col 问题如何bs9的情况呢要怎么做im2colgemm呢方法 1把filter摊平的shape变成[3,5339],把input摊平的shape变成[5339,16] – output的shape就为[3,16]了 - ❌ 方法 2把filter摊平的shape变成[39,533],把input摊平的shape变成[533,16],output的shape就为[39,16]了 – 隐患如何filter数量是51233这种数量那么非常占用显存/内存 方法 3im2colgemm外面加一层关于bs的for循环 – 隐患加一层for循环嵌套非常耗时 经过简单分析发现采取for循环的方式来进行im2col是相对合适的情况。我向msnh2012的作者穆士凝魂请教得到的答案是是用加一层for循环的方式居多而且由于可以并发多一层循环的开销比想象中小一些。如果是推理框架的话有部分情况bs是等于1的所以可以规避这个问题。
http://www.huolong8.cn/news/424809/

相关文章:

  • 没有经验可以做网站编辑吗wordpress 采集主题
  • 物流网站模板seo工具有哪些
  • html商业网站模板网络工程干什么的
  • 排名好的网站建设企业开发工具是什么意思
  • 做自动化设备哪个网站江都网站建设
  • 南通做网络网站东莞做网站需要避免这些因素
  • 营销型网站的重要特点世界政务网站绩效评估指标体系建设
  • 建设银行住房公积金卡网站商场设计图片
  • 服务器可以自己的网站吗小学学校网站建设计划
  • 焊枪公司网站怎么做跨境电商哪个平台比较好做
  • 敦化网站开发中装建设股吧
  • 那里可以免费做网站海外分销平台
  • 交友最好的网站建设湖北建设信息网官网
  • 南昌网站排名优化价格网站推广排名最新报价
  • 微信网页宣传网站怎么做企业网站建设的收获
  • 做一个推广网站多少钱长春高铁建站
  • idc科技公司网站模板做网站的框架结构
  • 佛山顺德容桂网站制作seo课程总结怎么写
  • 钟表企业网站管理系统中国常用网站
  • 我要建房子去什么网站找人做购物网站大全
  • 公司是做网站建设的怎么开票华为荣耀手机官网
  • 泉州手机网站开发app开发软件有哪些软件
  • 如何制作简易个人网站河南省建设协会网站
  • 做数据的网站有哪些内容高水平高职建设网站
  • 烹饪考试试卷哪个网站可以做网站开发收
  • 做影视网站违法无锡手机网站建设报价
  • 信息型企业网站有哪些山西seo排名
  • 金融企业网站php源码网站的开发包括什么东西
  • 做科研有什么好的网站做网站是数据库应该放在哪里
  • 做国际贸易做什么网站大公司 wordpress