我有两个具有相同第一轴尺寸的二维阵列.在python中,我想仅沿第二轴卷积两个矩阵.我想C在不计算沿第一轴的卷积的情况下进入下方.
import numpy as np
import scipy.signal as sg
M, N, P = 4, 10, 20
A = np.random.randn(M, N)
B = np.random.randn(M, P)
C = sg.convolve(A, B, 'full')[(2*M-1)/2]
Run Code Online (Sandbox Code Playgroud)
有快速的方法吗?
我试图将一个框模糊应用于透明图像,并且我在边缘周围得到一个"暗晕".
Jerry Huxtable 简要提到了这个问题,并且展示了问题的一个非常好的演示:

但是,对于我的生活,我无法理解" 预乘alpha "是如何解决这个问题的.现在举一个非常简单的例子.我有一个3x3图像,包含一个红色和一个绿色像素:

实际上剩下的像素是透明的:

现在我们将对图像应用3x3 Box Blur.为简单起见,我们只计算中心像素的新值.盒子模糊的工作方式是,由于我们有一个9个位置的正方形(3x3,称为内核),我们占用内核中每个像素的1/9,并将其加起来:

所以
finalRed = 1/9 * red1 + 1/9 * red2 + 1/9 * red3+ ... + 1/9 * red9
finalGreen = 1/9*green1 + 1/9*green2 + 1/9*green3+ ... + 1/9*green9
finalBlue = 1/9* blue1 + 1/9* blue2 + 1/9* blue3+ ... + 1/9* blue9
finalAlpha = 1/9*alpha1 + 1/9*alpha2 + 1/9*alpha3+ ... + 1/9*alpha9
Run Code Online (Sandbox Code Playgroud)
在这个非常简单的例子中,计算变得非常简单:
finalRed = 1/9 * 255
finalGreen = 1/9 * 255
finalBlue = 0
finalAlpha …Run Code Online (Sandbox Code Playgroud) alphablending image-processing convolution premultiplied-alpha
我一直在试验CUDA内核几天来在500x500图像之间执行快速2D卷积(但我也可以改变尺寸)和一个非常小的2D内核(laplacian 2d内核,所以它是一个3x3内核..太小了使用所有cuda线程获得巨大优势).
我创建了一个CPU经典实现(两个for循环,就像你想象的那样简单),然后我开始创建CUDA内核.
经过一些令人失望的尝试来执行更快的卷积后,我最终得到了这个代码:http: //www.evl.uic.edu/sjames/cs525/final.html(参见共享内存部分),它基本上让16x16线程阻止加载共享内存中所需的所有卷积数据,然后执行卷积.
没什么,CPU仍然快得多.我没有尝试FFT方法,因为CUDA SDK声明它对于大内核大小是有效的.
无论你是否阅读我写的所有内容,我的问题是:
如何使用CUDA在相对较大的图像和非常小的内核(3x3)之间执行快速2D卷积?
我有源和结果图像.我知道,在源上使用了一些卷积矩阵来得到结果.可以计算这个卷积矩阵吗?或者至少不完全一个,但非常相似.
在caffe中,该convolution图层采用一个底部blob,并将其与学习过滤器(使用权重类型初始化 - "Xavier","MSRA"等)进行卷积.但是,我的问题是我们是否可以简单地卷入两个底部blob并产生一个顶部blob.这样做最优雅的方式是什么?这样做的目的是:其中一个底部blob将是data另一个将是一个动态过滤器(根据data前所未有的变化)(我正在尝试实现动态卷积).
我的尝试:
我想到的一种方法是修改filler.hpp并将底部blob指定为filler矩阵本身(而不是"Xavier","MSRA"等).然后我认为卷积层会从那里拾取.我们可以设置lr = 0为表示不应更改由我们的自定义填充程序初始化的权重.但是,在我查看源代码后,我仍然不知道该怎么做.另一方面,我不想打破caffe的工作流程.如果我想要它们,我仍然希望转换层正常运行.
显然,一个比较繁琐的方法是使用的组合Slice,tile和/或Scale层字面上实施卷积.我认为它会起作用,但结果会很混乱.还有其他想法吗?
编辑1:
我通过修改caffe的卷积层写了一个新图层.特别地src/caffe/layers/conv_layer.cpp,在第27行,它采用由其定义的权重filler并将其与底部blob卷积.因此filler,我修改了图层,使其现在需要两个底部,而不是从中填充该blob .其中一个底部直接分配给填充符.现在我不得不做一些其他改动,例如:
weightblob对于所有样本具有相同的值.对于不同的样本,它将具有不同的值.所以我改变了第32行:this->forward_cpu_gemm(
bottom_data + n * this->bottom_dim_,
weight,
top_data + n * this->top_dim_);
Run Code Online (Sandbox Code Playgroud)
至:
this->forward_cpu_gemm(
bottom_data + n * bottom[1]->count(1),
bottom[0]->cpu_data() + n * bottom[0]->count(1),
top_data + n * this->top_dim_);
Run Code Online (Sandbox Code Playgroud)
为了方便起见,我假设没有涉及偏见项,步幅总是1,填充总是0,组总是1等等.但是,当我测试前向传球时,它给了我一些奇怪的答案(带一个简单的卷积内核= np.ones((1,1,3,3)).这个内核的学习率设置为零,这样它就不会改变.但是,我无法得到正确答案.任何建议都将受到赞赏.
请不要使用现有的层来提出解决方案Slice, Eltwise, Crop.我已经实现了 - 它的工作原理 - 但它复杂且内存效率低得令人难以置信.
我刚刚开始我的ML之旅并做了一些教程.有一点不清楚(对我来说)是如何为Keras Conv2D确定'过滤器'参数.
我读过的大多数资源都只是将参数设置为32而没有解释.这只是一个经验法则还是输入图像的尺寸起作用?例如,CIFAR-10中的图像是32x32
特别:
model = Sequential()
filters = 32
model.add(Conv2D(filters, (3, 3), padding='same', input_shape=x_train.shape[1:]))
model.add(Activation('relu'))
model.add(Conv2D(filters, (3, 3)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))
Run Code Online (Sandbox Code Playgroud)
下一层的过滤器参数为filter*2或64.再次,这是如何计算的?
TX.
乔
machine-learning convolution neural-network conv-neural-network keras
我试图在空间域中使用线性卷积来复制此链接的结果.
首先将图像转换为2d double阵列然后进行卷积.图像和内核大小相同.在卷积之前填充图像并在卷积之后相应地裁剪.
与基于FFT的卷积相比,输出很奇怪且不正确.
我该如何解决这个问题?
请注意,我从Matlab获得了以下图像输出,该输出与我的C#FFT输出匹配:
.
更新-1:继@ 奔福格特的评论,我改变了Rescale()功能,以取代255.0用1,从而输出被显着改进.但是,输出仍然与FFT输出(这是正确的输出)不匹配.
.
更新2:继@ Cris Luengo的评论后,我通过拼接填充图像,然后执行空间卷积.结果如下:

因此,输出比前一个更差.但是,这与链接答案的第二个输出具有相似性,这意味着循环卷积不是解决方案.
.
更新3:我使用了Sum()@ Cris Luengo的回答提出的功能.结果是更加改进的版本**Update-1**:
但是,它仍然不是与FFT版本100%相似.
.
更新4:继@ Cris Luengo的评论之后,我已经减去了两个结果,看到了差异:
, 
1.空间负频域
2.频率减去空间域
看起来,差异很大,这意味着空间卷积没有正确完成.
.
源代码:
(如果您需要更多源代码,请通知我.)
public static double[,] LinearConvolutionSpatial(double[,] image, double[,] mask)
{
int maskWidth = mask.GetLength(0);
int maskHeight = mask.GetLength(1);
double[,] paddedImage = ImagePadder.Pad(image, maskWidth); …Run Code Online (Sandbox Code Playgroud) 我一直在研究一个使用时间序列数据与天气数据相结合来估计交通流量的项目。我的时间序列使用了 30 个值的窗口,并且使用了 20 个与天气相关的特征。我已经使用函数式 API 来实现此目的,但我不断收到相同的错误,并且我不知道如何解决它。我查看了其他类似的线程,例如层 conv1d_1 的输入 0 与该层不兼容:预期 ndim=3,发现 ndim=2。收到的完整形状:[无,200],但没有帮助。
这是我的模型,
series_input = Input(shape = (series_input_train.shape[1], ), name = 'series_input')
x = Conv1D(filters=32, kernel_size=5, strides=1, padding="causal", activation="relu")(series_input)
x = LSTM(32, return_sequences = True)(x)
x = LSTM(32, return_sequences = True)(x)
x = Dense(1, activation = 'relu')(x)
series_output = Lambda(lambda w: w * 200)(x)
weather_input = Input(shape = (weather_input_train.shape[1], ), name = 'weather_input')
x = Dense(32, activation = 'relu')(weather_input)
x = Dense(32, activation = 'relu')(x)
weather_output = …Run Code Online (Sandbox Code Playgroud) Conv2dTranspose 中 Output_padding 的作用是什么?请帮助我理解这一点?
Conv2dTranspose(1024, 512, kernel_size=3, stride=2, padding=1, output_padding=1)
Run Code Online (Sandbox Code Playgroud) 我想知道是否有人可以将我推荐给ANSI C中的一维线性卷积代码片段而不是重新发明轮子?我在谷歌搜索和堆栈溢出,但在CI中找不到任何东西可以使用.
例如,对于阵列A,B,和C中,所有双精度,其中A和B是输入端,C是输出,具有长度len_A,len_B和len_C = len_A + len_B - 1分别.
我的阵列尺寸很小,因此不需要通过FFT实现快速卷积的任何速度增加.寻找直接的计算.