标签: convolution

如何使用可变宽度高斯在python中执行卷积?

我需要使用高斯执行卷积,但高斯的宽度需要改变.我不是在做传统的信号处理,而是根据设备的分辨率,我需要采用完美的概率密度函数(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

8
推荐指数
1
解决办法
3666
查看次数

在Python中更快地卷积概率密度函数

假设需要计算一般数量的离散概率密度函数的卷积.对于下面的示例,有四个分布采用具有指定概率的值0,1,2:

import numpy as np
pdfs = np.array([[0.6,0.3,0.1],[0.5,0.4,0.1],[0.3,0.7,0.0],[1.0,0.0,0.0]])
Run Code Online (Sandbox Code Playgroud)

卷积可以这样找到:

pdf = pdfs[0]        
for i in range(1,pdfs.shape[0]):
    pdf = np.convolve(pdfs[i], pdf)
Run Code Online (Sandbox Code Playgroud)

然后给出看到0,1,...,8的概率

array([ 0.09 ,  0.327,  0.342,  0.182,  0.052,  0.007,  0.   ,  0.   ,  0.   ])
Run Code Online (Sandbox Code Playgroud)

这部分是我的代码的瓶颈,似乎必须有一些东西可用于矢量化这个操作.有没有人建议让它更快?

或者,您可以使用的解决方案

pdf1 = np.array([[0.6,0.3,0.1],[0.5,0.4,0.1]])
pdf2 = np.array([[0.3,0.7,0.0],[1.0,0.0,0.0]])
convolve(pd1,pd2) 
Run Code Online (Sandbox Code Playgroud)

得到成对的卷积

 array([[ 0.18,  0.51,  0.24,  0.07,  0.  ], 
        [ 0.5,  0.4,  0.1,  0. ,  0. ]])
Run Code Online (Sandbox Code Playgroud)

也会有很大的帮助.

python numpy vectorization convolution probability-density

8
推荐指数
1
解决办法
3401
查看次数

对象检测和对象分类有什么区别?

这两个任务是卷积神经网络的流行应用.但是,我不明白其中的区别.根据一个Caffe教程,似乎对象检测的任务更难.

对象检测是否定义了对象在图像中的位置,或者显示图像中有多少对象...?

convolution neural-network deep-learning

8
推荐指数
3
解决办法
1万
查看次数

卷积中的伪像

我使用直接卷积算法来计算此图像之间的卷积:

在此输入图像描述

而这个内核:

在此输入图像描述

我正在使用astropy实现直接卷积.

这导致以下卷积,将所有设置(包括边界处理)保留为默认值,即astropy.convolution.convolve(image,kernel):

在此输入图像描述

这个卷积有一些令人费解的文物.特别地,在距边缘约50个像素的偏移处存在"正方形"图案.在我看来,这是由于内核的程度; 即使内核大小正式为249x249,大多数信息显然都包含在大约100个像素的半径内 - 这意味着当内核应用于边缘时,我们可能会遇到麻烦.

这让我想到了我的问题:

  1. 这个假设是否正确 - 它确实是一个边缘问题?
  2. 我该如何解决这个问题?我不知道如何证明使用不同的边缘处理(零填充,插值,包装......)我确定不同的情况需要不同的解决方案,但我不知道如何决定这个...
  3. 只是...试图理解使用直接算法和FFT卷积之间的区别.如果内核和图像大小相同,FT卷积不需要零填充,则不会出现边缘效应.对于直接方法,您将无意中进行一些边缘处理......那么结果是否相等?因为原则上他们的表现应该不同,对吗?

python fft convolution astropy

8
推荐指数
1
解决办法
587
查看次数

Python keras如何将密集层转换为卷积层

我在找到权重的正确映射时遇到问题,以便将密集层转换为卷积层.

这是我正在研究的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)

但它没有正确映射权重.我通过比较两个模型的输出来验证映射是否正确.如果正确完成,我希望输出应该是相同的.

python machine-learning convolution keras

8
推荐指数
1
解决办法
1763
查看次数

对损失增加的可能解释?

我有来自四个不同国家的40k图像数据集.图像包含各种主题:室外场景,城市场景,菜单等.我想使用深度学习来对图像进行地理标记.

我开始使用一个由3个conv-> relu-> pool层组成的小型网络,然后又添加了3个以加深网络,因为学习任务并不简单.

我的损失是这样做的(包括3层和6层网络):在此输入图像描述:

实际上,这种损失开始变得平滑并且几百步下降,但随后开始逐渐上升.

对于我这样增加的损失有什么可能的解释?

我的初始学习率设定得很低:1e-6,但我也试过1e-3 | 4 | 5.我对网络设计进行了理智检查,检查了两个具有类别不同主题的类的小型数据集,并且损失会根据需要不断下降.列车精度徘徊在~40%

convolution deep-learning tensorflow tensorboard cross-entropy

8
推荐指数
1
解决办法
1万
查看次数

scipy convolve2d 输出错误的值

这是我用来检查 convolve2d 正确性的代码

import numpy as np
from scipy.signal import convolve2d

X = np.random.randint(5, size=(10,10))
K = np.random.randint(5, size=(3,3))
print "Input's top-left corner:"
print X[:3,:3]
print 'Kernel:'
print K

print 'Hardcording the calculation of a valid convolution (top-left)'
print (X[:3,:3]*K)
print 'Sums to'
print (X[:3,:3]*K).sum()
print 'However the top-left value of the convolve2d result'
Y = convolve2d(X, K, 'valid')
print Y[0,0]
Run Code Online (Sandbox Code Playgroud)

在我的电脑上,结果如下:

Input's top-left (3x3) corner:
[[0 0 0]
 [1 1 2]
 [1 3 0]]
Kernel:
[[4 1 1]
 [0 …
Run Code Online (Sandbox Code Playgroud)

python debugging numpy convolution scipy

8
推荐指数
2
解决办法
2763
查看次数

如何更新解卷积层的权重?

我正在尝试开发一个反卷积层(或准确的转置卷积层).

在前向传递中,我做了一个完整的卷积(零填充卷积)在后向传递中,我做了一个有效的卷积(没有填充的卷积)将错误传递给前一层

偏差的梯度很容易计算,只需要在多余尺寸上求平均值.

问题是我不知道如何更新卷积滤波器的权重.什么是渐变?我确定这是一个卷积操作,但我不知道如何.我尝试了输入的有效卷积和错误但无济于事.

machine-learning convolution deep-learning deconvolution

8
推荐指数
1
解决办法
697
查看次数

在keras中定义模型(include_top = True)

有人可以告诉我什么include_top = True意味着在keras中定义模型?

我在Keras文档中读到了这一行的含义.它说include_top:是否在网络顶部包含完全连接的层.

我仍然在寻找这行代码的直观解释.

ResNet50(include_top=True)
Run Code Online (Sandbox Code Playgroud)

谢谢!

python convolution neural-network keras

8
推荐指数
2
解决办法
5372
查看次数

KERAS:如何使用与权重所需形状相同的张量显式设置 Conv2D 层的权重?

我想通过显式定义层的权重矩阵来创建 conv2d 层(Conv2D 将 use_bias 参数设置为 False)。我一直在尝试使用 layer.set_weights([K]) 来做到这一点,其中 K 是 (?, 7, 7, 512, 512) 张量。

在简单的 Tensorflow API 中,可以通过将张量传递给 tf.nn.conv2d(input, filter,..) 中的过滤器参数来完成

此外,我还有更多问题,我表明我应该解决 K 张量中的批量维度,因为它是由网络生成的

基本上我想实现一个超网络,其中我从张量 K 中的另一个网络生成了上面指定的 Conv2D 层的权重。权重张量 K 的形状为 [高度、宽度、过滤器、通道]

template= Input(shape=(448,684,3))
hyper_net= VGG16(weights='imagenet', include_top=False, 
input_tensor=None, input_shape=(448,684, 3))

k1= hyper_net(template)

kconv1= hyper_net.get_layer(name='block5_conv1')
config_conv1= kconv1.get_config()
k1conv1 = Conv2D.from_config(config_conv1)(k1)

kconv2= hyper_net.get_layer(name='block5_conv2')
config_conv2= kconv2.get_config()
k1conv2 = Conv2D.from_config(config_conv2)(k1conv1)

k1pool1= MaxPooling2D(pool_size=(2,3))(k1conv2)

k1pool1= Reshape((7,7,512,1))(k1pool1)
print(k1pool1.shape)

K= Conv3D(512, (1,1,1), strides=(1, 1, 1), padding='valid', 
activation=None, use_bias=True, kernel_initializer='he_normal', bias_initializer='zeros', kernel_regularizer=l2(0.01), bias_regularizer=l2(0.01))(k1pool1)


ortho= Input(tensor=tf.convert_to_tensor(O))
base_model …
Run Code Online (Sandbox Code Playgroud)

machine-learning convolution conv-neural-network keras tensorflow

8
推荐指数
1
解决办法
7642
查看次数