- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在阅读 implementation of im2col来自一本深度学习书(第 7 章,CNN),其目的是将 4 维数组转换为 2 维数组。我不知道为什么在实现中有一个6维数组。我对作者使用的算法背后的想法很感兴趣。
我尝试搜索了很多关于 im2col 实现的论文,但没有一篇像这样使用高维数组。目前我发现对 im2col 过程可视化有用的 Material 是 this paper - HAL Id: inria-00112631 的图片。
def im2col(input_data, filter_h, filter_w, stride=1, pad=0):
"""
Parameters
----------
input_data : (batch size, channel, height, width), or (N,C,H,W) at below
filter_h : kernel height
filter_w : kernel width
stride : size of stride
pad : size of padding
Returns
-------
col : two dimensional array
"""
N, C, H, W = input_data.shape
out_h = (H + 2*pad - filter_h)//stride + 1
out_w = (W + 2*pad - filter_w)//stride + 1
img = np.pad(input_data, [(0,0), (0,0), (pad, pad), (pad, pad)], 'constant')
col = np.zeros((N, C, filter_h, filter_w, out_h, out_w))
for y in range(filter_h):
y_max = y + stride*out_h
for x in range(filter_w):
x_max = x + stride*out_w
col[:, :, y, x, :, :] = img[:, :, y:y_max:stride, x:x_max:stride]
col = col.transpose(0, 4, 5, 1, 2, 3).reshape(N*out_h*out_w, -1)
return col
最佳答案
让我们尝试想象一下 im2col
做了什么。它以一堆彩色图像作为输入,该堆栈具有图像 ID、颜色 channel 、垂直位置、水平位置等维度。为简单起见,假设我们只有一张图片:
它做的第一件事是填充:
接下来,它将它切割成窗口。窗口的大小由 filter_h/w
控制,重叠由 strides
控制。
这是六个维度的来源:图像 ID(示例中缺少,因为我们只有一张图像)、网格高度/宽度、颜色 channel 。窗口高度/宽度。
目前的算法有点笨拙,它以错误的维度顺序组装输出,然后必须使用 transpose
进行纠正。
最好一开始就把它做好:
def im2col_better(input_data, filter_h, filter_w, stride=1, pad=0):
img = np.pad(input_data, [(0,0), (0,0), (pad, pad), (pad, pad)], 'constant')
N, C, H, W = img.shape
out_h = (H - filter_h)//stride + 1
out_w = (W - filter_w)//stride + 1
col = np.zeros((N, out_h, out_w, C, filter_h, filter_w))
for y in range(out_h):
for x in range(out_w):
col[:, y, x] = img[
..., y*stride:y*stride+filter_h, x*stride:x*stride+filter_w]
return col.reshape(np.multiply.reduceat(col.shape, (0, 3)))
作为旁注:我们可以使用 stride_tricks
并避免嵌套的 for
循环做得更好:
def im2col_best(input_data, filter_h, filter_w, stride=1, pad=0):
img = np.pad(input_data, [(0,0), (0,0), (pad, pad), (pad, pad)], 'constant')
N, C, H, W = img.shape
NN, CC, HH, WW = img.strides
out_h = (H - filter_h)//stride + 1
out_w = (W - filter_w)//stride + 1
col = np.lib.stride_tricks.as_strided(img, (N, out_h, out_w, C, filter_h, filter_w), (NN, stride * HH, stride * WW, CC, HH, WW)).astype(float)
return col.reshape(np.multiply.reduceat(col.shape, (0, 3)))
算法做的最后一件事是 reshape ,合并前三个维度(在我们的示例中同样只有两个,因为只有一个图像)。红色箭头显示各个窗口如何排列到第一个新维度:
将最后三个维度的颜色 channel 、窗口中的y坐标、窗口中的x坐标合并到第二个输出维度中。各个像素按黄色箭头所示排列:
关于Python:im2col 的实现利用了 6 维数组的优势?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50292750/
首先对WCF与WebService的定义进行概括,接着介绍了WCF的优势,最后就是对WCF与WebService两者的根本区别进行比较,具体内容如下 1、定义 1.WebService:严格来
关闭。这个问题是opinion-based .它目前不接受答案。 想改善这个问题吗?更新问题,以便可以通过 editing this post 用事实和引文回答问题. 5年前关闭。 Improve t
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题? 更新问题,以便 editing this post 可以用事实和引用来回答它. 关闭 8 年前。 Improve
谁能告诉我将下一个脚本标记放在 元素之后和将它放在 元素之前有什么好处? (function (){ var script = document.createElement("script"); s
我最近遇到了一个 JavaScript 脚本,其中作者似乎试图避免在代码中使用字符串并将所有内容都分配给一个变量。 所以代替 document.addEventListener('click', (e
Scott Meyers 在“Effective Modern C++”中说表达式 Matrix sum = m1 + m2 + m3 + m4 (其中所有对象的类型均为 Matrix)“如果 ope
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
免责声明:我是网络开发的新手,所以请多多包涵... 堆栈:Angular 前端,后端的 Tornado(基于 python)网络服务器 我一直在使用 RxJs 和 WebSocket 成功地与后端通信
我一直在调查我的 Flutter 应用程序的 JSON 解析,并且有一个关于我无法解决的工厂构造函数的问题。我试图了解使用工厂构造函数与普通构造函数的优势。例如,我看到很多 JSON 解析示例,它们使
添加 SQL 后尝试打开 TadsQuery 时出现 5400 AE_INTERNAL_ERROR。当我将相同的 SQL 直接放在 TadsQuery 中时,没有错误。您的帮助文件指示我联系 Adva
关闭。这个问题是opinion-based .它目前不接受答案。 想改进这个问题?更新问题,以便 editing this post 可以用事实和引用来回答它. 8年前关闭。 Improve this
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题? 更新问题,以便 editing this post 可以用事实和引用来回答它. 关闭 9 年前。 Improv
我想定义一个函数,当给定一个整数时,它将返回一个字符串。像这样: # Pseudocode function get_string(i) return my_string_array[i] end
我曾尝试在 Linux 和 Windows 上使用 DBD::Advantage,但没有成功。 Windows 版本附带了一个看似完整的安装程序,但它留下了 DBD-Advantage-8.10.ta
为什么说 NoSQL 在结构上比某些 SQL 数据库更快?假设我在某个 SQL 表的列上添加了一些索引。有人可以提供某种更快的查询吗? 我正在阅读有关 redis 的内容。 class User <
我的问题很简单:如果接口(interface)由单个类实现,那么使用接口(interface)有什么好处吗? 我一直认为只有当该接口(interface)有多个实现时,接口(interface)才是好
考虑这些(或多或少)等价的类型签名: f1 :: [a] -> Int -> a f2 :: Integral b => [a] -> b -> a f2 比 f1 更通用,这是一个很大的优势,但是
我们在 Scala 中部分应用了函数- def sum(a:Int,b:Int,c:Int) = a+b+c val partial1 = sum(1,_:Int,8) 我想知道使用部分应用函数的优点
你看下面的代码,我是如何使用 session 变量的;所以这三个问题是: 它们存放在哪里? (服务器或客户端) 它们对于每个网页访问者来说都是独一无二的吗? 我可以在完成工作后使用 ajax 或简单的
我知道这是一个常见问题,互联网上有关于此主题的资源,但我想从这个社区了解每个人在部署博客时对子域与子文件夹的想法(SEO 优势)。 谢谢。 最佳答案 我研究过一次,根据社区反馈以及权衡利弊,我会说去一
我是一名优秀的程序员,十分优秀!