我需要使用高斯执行卷积,但高斯的宽度需要改变.我不是在做传统的信号处理,而是根据设备的分辨率,我需要采用完美的概率密度函数(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
假设需要计算一般数量的离散概率密度函数的卷积.对于下面的示例,有四个分布采用具有指定概率的值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)
也会有很大的帮助.
这两个任务是卷积神经网络的流行应用.但是,我不明白其中的区别.根据一个Caffe教程,似乎对象检测的任务更难.
对象检测是否定义了对象在图像中的位置,或者显示图像中有多少对象...?
我使用直接卷积算法来计算此图像之间的卷积:
而这个内核:
我正在使用astropy实现直接卷积.
这导致以下卷积,将所有设置(包括边界处理)保留为默认值,即astropy.convolution.convolve(image,kernel):
这个卷积有一些令人费解的文物.特别地,在距边缘约50个像素的偏移处存在"正方形"图案.在我看来,这是由于内核的程度; 即使内核大小正式为249x249,大多数信息显然都包含在大约100个像素的半径内 - 这意味着当内核应用于边缘时,我们可能会遇到麻烦.
这让我想到了我的问题:
我在找到权重的正确映射时遇到问题,以便将密集层转换为卷积层.
这是我正在研究的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)
但它没有正确映射权重.我通过比较两个模型的输出来验证映射是否正确.如果正确完成,我希望输出应该是相同的.
我有来自四个不同国家的40k图像数据集.图像包含各种主题:室外场景,城市场景,菜单等.我想使用深度学习来对图像进行地理标记.
我开始使用一个由3个conv-> relu-> pool层组成的小型网络,然后又添加了3个以加深网络,因为学习任务并不简单.
实际上,这种损失开始变得平滑并且几百步下降,但随后开始逐渐上升.
对于我这样增加的损失有什么可能的解释?
我的初始学习率设定得很低:1e-6,但我也试过1e-3 | 4 | 5.我对网络设计进行了理智检查,检查了两个具有类别不同主题的类的小型数据集,并且损失会根据需要不断下降.列车精度徘徊在~40%
convolution deep-learning tensorflow tensorboard cross-entropy
这是我用来检查 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) 我正在尝试开发一个反卷积层(或准确的转置卷积层).
在前向传递中,我做了一个完整的卷积(零填充卷积)在后向传递中,我做了一个有效的卷积(没有填充的卷积)将错误传递给前一层
偏差的梯度很容易计算,只需要在多余尺寸上求平均值.
问题是我不知道如何更新卷积滤波器的权重.什么是渐变?我确定这是一个卷积操作,但我不知道如何.我尝试了输入的有效卷积和错误但无济于事.
有人可以告诉我什么include_top = True意味着在keras中定义模型?
我在Keras文档中读到了这一行的含义.它说include_top:是否在网络顶部包含完全连接的层.
我仍然在寻找这行代码的直观解释.
ResNet50(include_top=True)
Run Code Online (Sandbox Code Playgroud)
谢谢!
我想通过显式定义层的权重矩阵来创建 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
convolution ×10
python ×6
keras ×3
numpy ×2
tensorflow ×2
astropy ×1
debugging ×1
fft ×1
resolution ×1
scipy ×1
tensorboard ×1