简短摘要:如何快速计算两个数组的有限卷积?
我试图获得由两个函数f(x),g(x)定义的有限卷积

为了实现这一点,我已经采用了离散的函数样本并将它们转换为长度数组steps:
xarray = [x * i / steps for i in range(steps)]
farray = [f(x) for x in xarray]
garray = [g(x) for x in xarray]
Run Code Online (Sandbox Code Playgroud)
然后我尝试使用该scipy.signal.convolve函数计算卷积.此函数提供与此处conv建议的算法相同的结果.但是,结果与分析解决方案有很大不同.修改算法以使用梯形规则可得到所需的结果.conv
为了说明这一点,我让
f(x) = exp(-x)
g(x) = 2 * exp(-2 * x)
Run Code Online (Sandbox Code Playgroud)
结果是:

这里Riemann代表一个简单的黎曼和,trapezoidal是一个使用梯形法则的黎曼算法的修改版本,scipy.signal.convolve是scipy函数,analytical是分析卷积.
现在让g(x) = x^2 * exp(-x)结果变成:

这里'比'是从scipy到分析值得到的值的比率.以上表明通过对积分进行重整化不能解决问题.
是否可以使用scipy的速度但保留梯形规则的更好结果,或者我是否必须编写C扩展来实现所需的结果?
只需复制并粘贴下面的代码即可查看我遇到的问题.通过增加steps变量可以使两个结果更加一致.我认为问题是由于右手黎曼和的假象,因为当积分增加时积分被高估并且随着它逐渐减小而再次接近解析解.
编辑:我现在已经包含了原始算法2作为比较,它给出了与scipy.signal.convolve函数相同的结果. …
我需要使用高斯执行卷积,但高斯的宽度需要改变.我不是在做传统的信号处理,而是根据设备的分辨率,我需要采用完美的概率密度函数(PDF)和"涂抹"它.
例如,假设我的PDF作为尖峰/增量函数开始.我将其建模为非常窄的高斯.在通过我的设备运行后,它将根据一些高斯分辨率被涂抹掉.我可以使用scipy.signal卷积函数来计算它.
import numpy as np
import matplotlib.pylab as plt
import scipy.signal as signal
import scipy.stats as stats
# Create the initial function. I model a spike
# as an arbitrarily narrow Gaussian
mu = 1.0 # Centroid
sig=0.001 # Width
original_pdf = stats.norm(mu,sig)
x = np.linspace(0.0,2.0,1000)
y = original_pdf.pdf(x)
plt.plot(x,y,label='original')
# Create the ``smearing" function to convolve with the
# original function.
# I use a Gaussian, centered at 0.0 (no bias) and
# width of 0.5
mu_conv = …Run Code Online (Sandbox Code Playgroud) python signal-processing resolution convolution probability-density
这两个任务是卷积神经网络的流行应用.但是,我不明白其中的区别.根据一个Caffe教程,似乎对象检测的任务更难.
对象检测是否定义了对象在图像中的位置,或者显示图像中有多少对象...?
我在找到权重的正确映射时遇到问题,以便将密集层转换为卷积层.
这是我正在研究的ConvNet的摘录:
model.add(Convolution2D(512, 3, 3, activation='relu'))
model.add(MaxPooling2D((2,2), strides=(2,2)))
model.add(Flatten())
model.add(Dense(4096, activation='relu'))
Run Code Online (Sandbox Code Playgroud)
在MaxPooling之后,输入的形状(512,7,7).我想将密集层转换为卷积层,使其看起来像这样:
model.add(Convolution2D(512, 3, 3, activation='relu'))
model.add(MaxPooling2D((2,2), strides=(2,2)))
model.add(Convolution2D(4096, 7, 7, activation='relu'))
Run Code Online (Sandbox Code Playgroud)
但是,我不知道如何重新塑造权重以便将扁平权重正确映射到卷积层所需的(4096,512,7,7)结构?现在,致密层的重量具有尺寸(25088,4096).我需要以某种方式将这些25088元素映射到(512,7,7)维度,同时保留权重到神经元的正确映射.到目前为止,我已经尝试了多种重塑方式然后进行转置,但我无法找到正确的映射.
我一直在尝试的一个例子是:
weights[0] = np.transpose(np.reshape(weights[0],(512,7,7,4096)),(3,0,1,2))
Run Code Online (Sandbox Code Playgroud)
但它没有正确映射权重.我通过比较两个模型的输出来验证映射是否正确.如果正确完成,我希望输出应该是相同的.
我正在尝试开发一个反卷积层(或准确的转置卷积层).
在前向传递中,我做了一个完整的卷积(零填充卷积)在后向传递中,我做了一个有效的卷积(没有填充的卷积)将错误传递给前一层
偏差的梯度很容易计算,只需要在多余尺寸上求平均值.
问题是我不知道如何更新卷积滤波器的权重.什么是渐变?我确定这是一个卷积操作,但我不知道如何.我尝试了输入的有效卷积和错误但无济于事.
我想拍摄两张图像并使用2D FFT在Matlab中将它们一起卷积,而无需使用该conv2函数.但是,我不确定如何正确填充矩阵并为卷积做好准备.
数学运算如下:
A*B = C.
在上面,*是卷积运算符(维基百科链接).
以下Matlab程序显示了填充和不填充矩阵之间的区别.我怀疑不填充矩阵导致循环卷积,但我想执行线性卷积而没有混叠.
如果我填充两个矩阵,那么如何截断卷积的输出以使C与A和B的大小相同?
A = rgb2gray(im2double(imread('1.png'))); % input A
B = rgb2gray(im2double(imread('2.png'))); % kernel B
figure;
imagesc(A); colormap gray;
title ('A')
figure;
imagesc(B); colormap gray;
title ('B')
[m,n] = size(A);
mm = 2*m - 1;
nn = 2*n - 1;
C = (ifft2(fft2(A,mm,nn).* fft2(B,mm,nn)));
figure;
imagesc(C); colormap gray;
title ('C with padding')
C0 = (ifft2(fft2(A).* fft2(B)));
figure;
imagesc(C0); colormap gray; …Run Code Online (Sandbox Code Playgroud) 我正在尝试为 1D 卷积创建模型,但我似乎无法获得正确的输入形状。这是我所拥有的:
#this is actually shape (6826, 9000) but I am shortening it
train_dataset_x = np.array([[0, 1, 5, 1, 10], [0, 2, 4, 1, 3]])
#this is actually shape (6826, 1)
train_dataset_y = np.array([[0], [1]])
model.add(Conv1D(32, 11, padding='valid', activation='relu', strides=1, input_shape=( len(train_dataset_x[0]), train_dataset_x.shape[1]) ))
model.add(Conv1D(32, 3, padding='valid', activation='relu', strides=1) )
model.add(MaxPooling1D())
model.add(Conv1D(64, 3, padding='valid', activation='relu', strides=1) )
model.add(Conv1D(64, 3, padding='valid', activation='relu', strides=1) )
model.add(MaxPooling1D())
model.add(Flatten())
model.add(Dense(256, activation='relu'))
model.add(Dense(1, activation='sigmoid'))
Run Code Online (Sandbox Code Playgroud)
我收到此错误:
ValueError: Error when checking input: expected conv1d_1_input to have …Run Code Online (Sandbox Code Playgroud) 我想手动编码一个 1D 卷积,因为我正在使用内核进行时间序列分类,我决定制作著名的 Wikipedia 卷积图像,如图所示。
import numpy as np
import matplotlib.pyplot as plt
import scipy.ndimage
plt.style.use('ggplot')
def convolve1d(signal, ir):
"""
we use the 'same' / 'constant' method for zero padding.
"""
n = len(signal)
m = len(ir)
output = np.zeros(n)
for i in range(n):
for j in range(m):
if i - j < 0: continue
output[i] += signal[i - j] * ir[j]
return output
def make_square_and_saw_waves(height, start, end, n):
single_square_wave = []
single_saw_wave = [] …Run Code Online (Sandbox Code Playgroud) 看起来tf.nn.convolution应该能够进行 4D 卷积,但是我还没有能够成功创建一个 Keras 层来使用这个函数。
我尝试过使用 KerasLambda层来包装该tf.nn.convolution函数,但也许其他人有更好的主意?
我想利用数据的高维结构,因此重塑可能无法捕获数据集的性质。
我目前正在使用 Tensorflow 2 和 Keras 构建 GAN,并注意到许多现有的生成器和鉴别器神经网络在 Keras 中使用 Conv2D 和 Conv2DTranspose。
我正在努力寻找从功能上解释两者之间差异的东西。谁能解释一下在 Keras 中制作神经网络的这两个不同选项意味着什么?
convolution conv-neural-network keras tensorflow deconvolution
convolution ×10
keras ×4
python ×4
tensorflow ×3
scipy ×2
matlab ×1
matplotlib ×1
numpy ×1
resolution ×1