我想实现一些旨在在beagleboard上运行的图像处理算法.这些算法广泛使用卷积.我正在尝试为2D卷积找到一个好的C实现(可能使用快速傅立叶变换).我还希望算法能够在beagleboard的DSP上运行,因为我听说DSP针对这些类型的操作进行了优化(使用乘法累加指令).
我没有该领域的背景,所以我认为自己实施卷积不是一个好主意(我可能不会像了解其背后的所有数学一样好).我相信DSP的一个很好的C卷积实现存在于某个地方,但我找不到它?
有人可以帮忙吗?
编辑:原来内核很小.其尺寸为2X2或3X3.所以我想我不是在寻找基于FFT的实现.我正在网上搜索卷积来查看它的定义,所以我可以直接实现它(我真的不知道卷积是什么).我发现的所有东西都是乘法积分,我不知道如何用矩阵来做.有人可以给我一段2X2内核案例的代码(或伪代码)吗?
我想比较单个Intel CPU核心的速度和单个nVidia GPU核心的速度(即:单个CUDA代码,单个线程).我确实实现了以下天真的2d图像卷积算法:
void convolution_cpu(uint8_t* res, uint8_t* img, uint32_t img_width, uint32_t img_height, uint8_t* krl, uint32_t krl_width, uint32_t krl_height)
{
int32_t center_x = krl_width / 2;
int32_t center_y = krl_height / 2;
int32_t sum;
int32_t fkx,fky;
int32_t xx,yy;
float krl_sum = 0;
for(uint32_t i = 0; i < krl_width*krl_height; ++i)
krl_sum += krl[i];
float nc = 1.0f/krl_sum;
for(int32_t y = 0; y < (int32_t)img_height; ++y)
{
for(int32_t x = 0; x < (int32_t)img_width; ++x)
{
sum = 0;
for(int32_t ky = …Run Code Online (Sandbox Code Playgroud) 我试图用矢量做任意N维表面的"卷积".更具体地说,我试图得到一个N阶Volterra内核的输出(参见http://www.scholarpedia.org/article/Volterra_and_Wiener_series,eq.1)
因此,对于1维内核,输出是1阶内核与过去输入时期的简单滑动卷积.它基本上将过去输入时期中的每个值与系数相乘/加权.
二阶内核输出是带有信号的二维矩阵的"卷积".该内核将过去每对点的乘积与系数进行加权.
三阶内核,一个3d矩阵,衡量了过去记忆时代中每一点的三重点.
另外,我之前不知道内核的维度/顺序.这是一个输入参数..
我知道我可以通过逐个循环执行几个for循环来非常非常缓慢地做这个,但我想知道是否有一种方法可以在matlab中快速而优雅地完成这项工作?
谢谢
我必须在MATLAB中求一个线性方程组A*x=B,其中A对称且其元素取决于指数的差异:Aij=f(i-j).
我使用迭代求解器,因为它的大小A是40000x40000.迭代求解器需要确定产品A*x在哪里x是测试解决方案.对该产品的评估结果证明是卷积,因此可以通过快速傅里叶变换(cputime~ Nlog(N)而不是N^2)来完成.我对这个问题有以下问题:
这是卷积通告吗?因为如果它是循环的,我认为我必须使用新矩阵的特定索引来获取fft.是对的吗?
我发现难以为fft编写例程,因为我无法理解我应该使用的索引.是否有任何现成的例程,我可以用fft直接评估产品A*x而不是卷积?实际上,矩阵A由3×3块构成并且是对称的.产品的现成例程A*x对我来说是最好的解决方案.
先感谢您,
帕诺斯
我有一个网络(https://github.com/TheAbhiKumar/tensorflow-value-iteration-networks),我试图在pytorch中实现(我对pytorch很新,但是,根本不是机器学习的新手) .
简而言之,我似乎无法弄清楚如何在pytorch中实现"纯"卷积.在张量流中,它可以像这样完成:
def conv2d_flipkernel(x, k, name=None):
return tf.nn.conv2d(x, flipkernel(k), name=name,
strides=(1, 1, 1, 1), padding='SAME')
Run Code Online (Sandbox Code Playgroud)
使用flipkernel函数:
def flipkernel(kern):
return kern[(slice(None, None, -1),) * 2 + (slice(None), slice(None))]
Run Code Online (Sandbox Code Playgroud)
如何在pytorch中完成类似的事情?
convolution neural-network torch conv-neural-network pytorch
动画来自这里.我想知道为什么要求扩张卷积保持分辨率.显然,蓝色输入为7x7,绿色输出为3x3.
编辑:
解决分辨率损失的一种方法是将输入填充大约当前感受区域大小的一半,但是
今天早上花了一些时间寻找一个广义的问题来指出重复问题as_strided和/或如何制作通用窗口函数.关于如何(安全地)创建补丁,滑动窗口,滚动窗口,平铺或视图到阵列以进行机器学习,卷积,图像处理和/或数值积分,似乎存在很多问题.
我在寻找一个通用功能,可以接受window,step而且axis参数和返回一个as_strided超过任意维度视图.我将在下面给出我的答案,但我很感兴趣,如果有人能够制作更有效的方法,因为我不确定使用np.squeeze()是最好的方法,我不确定我的assert语句使函数足够安全以写入结果查看,我不知道如何处理axis不按升序排列的边缘情况.
尽职调查
我能找到的最通用的函数是sklearn.feature_extraction.image.extract_patches由@eickenberg编写的(以及显然是等价的skimage.util.view_as_windows),但是那些在网上没有很好地记录,并且不能在比原始数组中更少的轴上执行窗口(例如,这个问题要求在一个轴上有一定大小的窗口).通常,问题numpy只需要答案.
@Divakar在这里numpy为1-d输入创建了一个通用函数,但是更高维度的输入需要更多的关注.我在3d输入法上制作了一个裸骨2D窗口,但它不是很可扩展.
因此通常使用四个for循环来实现通常且非常低效的最小/最大过滤器.
for( index1 < dy ) { // y loop
for( index2 < dx ) { // x loop
for( index3 < StructuringElement.dy() ) { // kernel y
for( index4 < StructuringElement.dx() ) { // kernel x
pixel = src(index3+index4);
val = (pixel > val) ? pixel : val; // max
}
}
dst(index2, index1) = val;
}
}
Run Code Online (Sandbox Code Playgroud)
然而,这种方法效率很低,因为它再次检查先前检查的值.所以我想知道在下一次迭代中使用先前检查的值来实现这个的方法是什么?
可以对结构元素大小/原点进行任何假设.
更新:我特别渴望了解这种或某种实现的任何见解:http://dl.acm.org/citation.cfm?id = 2114689
我想建立一个卷积自动编码器,其中输入的大小不是恒定的.我这样做是通过堆叠conv-pool层直到我到达编码层,然后使用upsample-conv层进行反向操作.问题是无论我使用什么设置,我都无法在输出层中获得与输入层完全相同的大小.原因是UpSampling层(比如说(2,2)大小),输入的大小加倍,所以我不能得到奇怪的维度.有没有办法将给定图层的输出维度与单个样本的前一层的输入维度联系起来(正如我所说,变量中max-pool图层的输入大小)?
我想将预先训练好的caffe模型转换为keras,然后我需要逐层初始化图层.我将权重和偏差保存在mat文件中,然后将它们加载到python工作区.我知道"权重"参数得到numpy数组但不怎么样?谢谢
convolution ×10
fft ×2
keras ×2
matlab ×2
algorithm ×1
arrays ×1
autoencoder ×1
beagleboard ×1
c ×1
cuda ×1
filtering ×1
gpgpu ×1
math ×1
numpy ×1
performance ×1
pytorch ×1
torch ×1