我试图直接在R中进行卷积并使用FFT然后进行反演.但似乎从简单的观察来看它是不正确的.看看这个例子:
# DIRECTLY
> x2$xt
[1] 24.610 24.605 24.610 24.605 24.610
> h2$xt
[1] 0.003891051 0.003875910 0.003860829 0.003845806 0.003830842
> convolve(h2$xt,x2$xt)
[1] 0.4750436 0.4750438 0.4750435 0.4750437 0.4750435
# USING INVERSE FOURIER TRANSFORM
> f=fft(fft(h2$xt)*fft(x2$xt), inv=TRUE)
> Re(f)/length(f)
[1] 0.4750438 0.4750435 0.4750437 0.4750435 0.4750436
>
Run Code Online (Sandbox Code Playgroud)
让我们取指数0.在0时,卷积应该只是x2 $ xt(24.610)的最后一个值乘以h2 $ xt(0.003891051)的第一个值,它应该在索引0 = 24.610*0.003891051 = 0.09575877处给出卷积,这是从0.4750436离开.
难道我做错了什么?为什么价值观与预期不同?
因此通常使用四个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数组但不怎么样?谢谢
我想通过 Keras 中未定义的特定内核初始化卷积层。例如,如果我定义以下函数来初始化内核:
def init_f(shape):
ker=np.zeros((shape,shape))
ker[int(np.floor(shape/2)),int(np.floor(shape/2))]=1
return ker
Run Code Online (Sandbox Code Playgroud)
并且卷积层设计如下:
model.add(Conv2D(filters=32, kernel_size=(3,3),
kernel_initializer=init_f(3)))
Run Code Online (Sandbox Code Playgroud)
我收到错误:
无法解释初始化标识符
我在以下位置关注了类似的问题:https : //groups.google.com/forum/#!topic/keras-users/J46pplO64-8 但我无法将其调整为我的代码。你能帮我在 Keras 中定义任意内核吗?
我不明白为什么在使用卷积神经网络时需要翻转过滤器。
根据千层面文件,
翻转过滤器:布尔(默认值:真)
是否在将过滤器滑过输入之前翻转过滤器,执行卷积(这是默认设置),或者不翻转它们并执行相关。请注意,对于 Lasagne 中的其他一些卷积层,翻转会产生开销,并且默认情况下处于禁用状态 - 使用从另一层学习的权重时请查看文档。
这意味着什么?在任何神经网络书籍中,我从未读过关于卷积时翻转滤波器的内容。请有人澄清一下好吗?
convolution neural-network theano conv-neural-network lasagne
我对 conv2d 和 conv3d 函数之间的区别有点困惑。\n例如,如果我有一堆 N 个图像,高高宽宽,有 3 个 RGB 通道。网络的输入可以是两种形式\nform1: (batch_size, N, H, W, 3) 这是一个 5 阶张量\nform2: (batch_size, H, W, 3N ) 这是一个 4 阶张量
\n\n问题是\xef\xbc\x8c 如果我将具有大小为 (N,3,3) 的 M 滤波器的 conv3d 应用到 form1 并应用具有大小为 (3,3) 的 M 滤波器的 conv2d
\n\n它们的功能操作基本相同吗?我认为这两种形式在时间和空间维度上交织在一起。
\n\n如果有人能帮助我解决这个问题,我真的很感激。
\n我有一个大小为 (140000,22) 维度的数据框。
我必须创建相同维度的二维数组才能将其传递到卷积神经网络中。
你能指导如何在这个数据帧上进行转换吗
我正在尝试在 c++ 中实现轻量级(最小库依赖性)版本的 TensorFlow 图,并且我正在尝试使用 Eigen Tensor 对象来执行图操作。现在我一直在尝试使用 EigenTensor.convolve()方法来尝试复制 TensorFlow 的 Conv2D 操作的行为。为了简单起见,我最初的 Conv2D 操作没有填充,步幅为 1。
卷积层的输入是一个 51x51x1 张量,它与大小为 3x3x1x16 的滤波器组进行卷积。在张量流中,这会生成大小为 49x49x16 的输出张量。使用下面的特征代码在 C++ 中设置相同的操作仅填充输出张量的第一个通道,因此顶部 49x49x1 单元格包含正确的值,但其余 1-15 个通道不会填充。
Eigen::TensorMap<Eigen::Tensor<float,4> > filter(filter, 3, 3, 1, 16 );
Eigen::TensorMap<Eigen::Tensor<float,3> > input(inputBuffer, 51, 51, 1 );
Eigen::TensorMap<Eigen::Tensor<float,3> > output(outputBuffer, 49, 49, 16);
Eigen::array<ptrdiff_t, 2> convDims({0, 1});
output = input.convolve(filter, convDims);
Run Code Online (Sandbox Code Playgroud)
我认为我错误地理解了这些函数的作用,并且它们没有执行相同的操作。为了让我的实现正常工作,我尝试循环遍历 16 个过滤器通道,并将卷积方法单独应用于每个通道,但我遇到了编译器错误,我无法理解以下代码:
for (int s=0; s<16; ++s)
{
Eigen::array<int, 4> fOffset = {0, 0, 0, s};
Eigen::array<int, 4> fExtent …Run Code Online (Sandbox Code Playgroud) 我正在看这个图层的打印输出。我意识到,这显示了输入/输出,但与如何处理 RGB 通道无关。
如果您查看 block1_conv1,它会显示“Conv2D”。但是如果输入是 224 x 224 x 3,那么这不是 2D。
我的更大、更广泛的问题是,在整个训练这样的模型的过程中如何处理 3 个通道输入(我认为它是 VGG16)。RGB 通道是否在某个时刻组合(相加或连接)?何时何地?为此需要一些独特的过滤器吗?或者模型是否从头到尾分别跨越不同的通道/颜色表示?
convolution neural-network channels conv-neural-network vgg-net
convolution ×10
keras ×3
python ×3
tensorflow ×2
algorithm ×1
autoencoder ×1
c++11 ×1
channels ×1
dataframe ×1
eigen ×1
fft ×1
filtering ×1
keras-layer ×1
lasagne ×1
math ×1
r ×1
theano ×1
vgg-net ×1