我正在编写一些信号处理软件,我开始编写一个离散卷积函数.
这适用于前一万个左右的值列表,但随着它们变大(例如,100k),我开始得到StackOverflow错误,当然.
不幸的是,我在将命令式卷积算法转换为递归和懒惰版本时遇到了很多麻烦,实际上使用速度足够快(至少有一点优雅也很好).
我也不是100%确定我完全没有这个功能,但是 - 如果我错过了什么/做错了什么,请告诉我.我认为这是正确的.
(defn convolve
"
Convolves xs with is.
This is a discrete convolution.
'xs :: list of numbers
'is :: list of numbers
"
[xs is]
(loop [xs xs finalacc () acc ()]
(if (empty? xs)
(concat finalacc acc)
(recur (rest xs)
(if (empty? acc)
()
(concat finalacc [(first acc)]))
(if (empty? acc)
(map #(* (first xs) %) is)
(vec-add
(map #(* (first xs) %) is)
(rest …Run Code Online (Sandbox Code Playgroud) functional-programming signal-processing clojure convolution
我想拍摄两张图像并使用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) 我想重用Tensorflow"MNIST for Pros"CNN示例中的代码.我的图像是388px X 191px,只有2个输出类.原始代码可以在这里找到.我试图通过仅更改输入和输出层来重用此代码,如下所示:
x = tf.placeholder("float", shape=[None, 74108])
y_ = tf.placeholder("float", shape=[None, 2])
x_image = tf.reshape(x, [-1,388,191,1])
Run Code Online (Sandbox Code Playgroud)
W_fc2 = weight_variable([1024, 2])
b_fc2 = bias_variable([2])
Run Code Online (Sandbox Code Playgroud)
运行修改后的代码会产生模糊的堆栈跟踪:
W tensorflow/core/common_runtime/executor.cc:1027] 0x2136510 Compute status: Invalid argument: Input has 14005248 values, which isn't divisible by 3136
[[Node: Reshape_4 = Reshape[T=DT_FLOAT, _device="/job:localhost/replica:0/task:0/cpu:0"](MaxPool_5, Reshape_4/shape)]]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/framework/ops.py", line 1267, in run
_run_using_default_session(self, feed_dict, self.graph, session)
File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/framework/ops.py", …Run Code Online (Sandbox Code Playgroud) python convolution neural-network conv-neural-network tensorflow
我正在尝试实施维纳滤波器以对模糊图像执行反卷积.我的实现是这样的
import numpy as np
from numpy.fft import fft2, ifft2
def wiener_filter(img, kernel, K = 10):
dummy = np.copy(img)
kernel = np.pad(kernel, [(0, dummy.shape[0] - kernel.shape[0]), (0, dummy.shape[1] - kernel.shape[1])], 'constant')
# Fourier Transform
dummy = fft2(dummy)
kernel = fft2(kernel)
kernel = np.conj(kernel) / (np.abs(kernel) ** 2 + K)
dummy = dummy * kernel
dummy = np.abs(ifft2(dummy))
return np.uint8(dummy)
Run Code Online (Sandbox Code Playgroud)
此实现基于Wiki页面.
使用的TIFF图像来自:http://www.ece.rice.edu/~wakin/images/lena512color.tiff
但这里有一个PNG版本:

我有一个由对角内核模糊的输入图像运动,并添加了一些高斯加性噪声.lena图片为512x512,模糊内核为11x11.
当我将wiener_filter应用于此图像时,结果就像这样.
.
我认为这种模糊的图像质量不高.所以我想问一下我的实现是否正确.
非常感谢你!
更新我添加噪音的方式.
from scipy.signal import gaussian, convolve2d
def blur(img, …Run Code Online (Sandbox Code Playgroud) 我对keras中的一个步幅(比如说,2,2)的想法感到有些困惑.
元组(2,2)中的第二个2是做什么的?
我知道步幅是否为(2),因为那时我们将在图像上移动滤镜2个像素.
如果我们沿着y沿着x向前跨步2,那么我们将沿着对角线运行图像.这没有多大意义.
Keras文档不清楚.
谢谢.
我是从多个384x286 b/w图像手动创建我的数据集.
我加载这样的图像:
x = []
for f in files:
img = Image.open(f)
img.load()
data = np.asarray(img, dtype="int32")
x.append(data)
x = np.array(x)
Run Code Online (Sandbox Code Playgroud)
这导致x是一个数组(num_samples,286,384)
print(x.shape) => (100, 286, 384)
Run Code Online (Sandbox Code Playgroud)
阅读keras文档,并检查我的后端,我应该向卷积步骤提供由(行,列,通道)组成的input_shape
因为我不随意知道样本大小,我本来希望传递一个类似的输入大小
( None, 286, 384, 1 )
Run Code Online (Sandbox Code Playgroud)
该模型构建如下:
model = Sequential()
model.add(Conv2D(32, kernel_size=(3, 3), activation='relu', input_shape=input_shape))
# other steps...
Run Code Online (Sandbox Code Playgroud)
传递为input_shape(286,384,1)会导致:
检查输入时出错:预期conv2d_1_input有4个维度,但是有形状的数组(85,286,384)
传递as_input_shape(无,286,384,1)会导致:
输入0与图层conv2d_1不兼容:预期ndim = 4,发现ndim = 5
我究竟做错了什么 ?我如何重塑输入数组?
动画来自这里.我想知道为什么要求扩张卷积保持分辨率.显然,蓝色输入为7x7,绿色输出为3x3.
编辑:
解决分辨率损失的一种方法是将输入填充大约当前感受区域大小的一半,但是
今天早上花了一些时间寻找一个广义的问题来指出重复问题as_strided和/或如何制作通用窗口函数.关于如何(安全地)创建补丁,滑动窗口,滚动窗口,平铺或视图到阵列以进行机器学习,卷积,图像处理和/或数值积分,似乎存在很多问题.
我在寻找一个通用功能,可以接受window,step而且axis参数和返回一个as_strided超过任意维度视图.我将在下面给出我的答案,但我很感兴趣,如果有人能够制作更有效的方法,因为我不确定使用np.squeeze()是最好的方法,我不确定我的assert语句使函数足够安全以写入结果查看,我不知道如何处理axis不按升序排列的边缘情况.
尽职调查
我能找到的最通用的函数是sklearn.feature_extraction.image.extract_patches由@eickenberg编写的(以及显然是等价的skimage.util.view_as_windows),但是那些在网上没有很好地记录,并且不能在比原始数组中更少的轴上执行窗口(例如,这个问题要求在一个轴上有一定大小的窗口).通常,问题numpy只需要答案.
@Divakar在这里numpy为1-d输入创建了一个通用函数,但是更高维度的输入需要更多的关注.我在3d输入法上制作了一个裸骨2D窗口,但它不是很可扩展.
看起来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
tensorflow ×4
python ×3
arrays ×1
clojure ×1
filter ×1
matlab ×1
motion-blur ×1
numpy ×1
stride ×1