Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/355.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如果输入图像和输出图像已知,Python将查找卷积内核_Python_Numpy_Tensorflow_Convolution - Fatal编程技术网

如果输入图像和输出图像已知,Python将查找卷积内核

如果输入图像和输出图像已知,Python将查找卷积内核,python,numpy,tensorflow,convolution,Python,Numpy,Tensorflow,Convolution,我对python中的卷积内核有一个问题。它是关于简单的卷积算子。我有输入矩阵和输出矩阵。我想找到一个可能的卷积内核,大小为(5x5)。如何用python、numpy或tensorflow解决这个问题 将scipy.signal作为ss导入 input_img=np.array([[94,166,76,106,152,232], [48, 242, 30, 98, 46, 210], [52, 60, 86, 60, 216, 248], [52, 236, 116, 240, 224, 184]

我对python中的卷积内核有一个问题。它是关于简单的卷积算子。我有输入矩阵和输出矩阵。我想找到一个可能的卷积内核,大小为(5x5)。如何用python、numpy或tensorflow解决这个问题

将scipy.signal作为ss导入
input_img=np.array([[94,166,76,106,152,232],
[48, 242, 30, 98, 46, 210],
[52, 60, 86, 60, 216, 248],
[52, 236, 116, 240, 224, 184],
[138, 160, 146, 254, 236, 252],
[94100224246152 74]],数据类型=浮点)
output_img=np.array([[15,49,23,105,0,0],
[43,30, 108, 124, 0, 0],
[58, 120, 112, 92, 0, 0],
[73, 127, 118, 126, 0, 0],
[112, 123, 76, 37, 0, 0],
[0,0,0,0,0,0]],dtype=float)
#我想找到这个内核
conv=np.zeros((5,5),dtype=int)
#所以,若我做卷积运算,输出将得到一个和我上面定义的相同的值
输出\u img=ss.convalve2d(输入\u img,conv,padding='same')

据我所知,您需要根据给定的输入、输出数组和窗口大小重建窗口权重。我认为这是可能的,特别是如果输入数组(图像)足够大的话

请看下面的代码:

import scipy.signal as ss
import numpy as np

source_dataset = np.random.rand(20, 10)
sample_convolution = np.diag([1, 1, 1])
output_dataset = ss.convolve2d(data, sample_convolution, mode='same')
conv_size = c.shape[0]

# Given output_dataset, source_datset, and conv_size we need to reconstruct
# window weights.

def reconstruct(data, output, csize):
    half_size = int(csize / 2)
    min_row_ind = half_size
    max_row_ind = int(data.shape[0]) - half_size
    min_col_ind = half_size
    max_col_ind = int(data.shape[1]) - half_size
    A = list()
    b = list()
    for i in np.arange(min_row_ind, max_row_ind, dtype=int):
        for j in np.arange(min_col_ind, max_col_ind, dtype=int):
            A.append(data[(i - half_size):(i + half_size + 1), (j - half_size):(j + half_size + 1)].ravel().tolist())
            b.append(output[i, j])
            if len(A) == csize * csize and np.linalg.matrix_rank(A) == csize * csize:
                return (np.linalg.pinv(A)@np.array(b)[:, np.newaxis]).reshape(csize, csize)
    if len(A) < csize*csize:
        raise Exception("Insufficient data")

result = reconstruct(source_dataset, output_dataset, 3)

因此,它按预期工作;但确实需要改进,以考虑边缘效应、窗口大小均匀的情况等。

据我所知,您需要根据给定的输入、输出数组和窗口大小重建窗口权重。我认为这是可能的,特别是如果输入数组(图像)足够大的话

请看下面的代码:

import scipy.signal as ss
import numpy as np

source_dataset = np.random.rand(20, 10)
sample_convolution = np.diag([1, 1, 1])
output_dataset = ss.convolve2d(data, sample_convolution, mode='same')
conv_size = c.shape[0]

# Given output_dataset, source_datset, and conv_size we need to reconstruct
# window weights.

def reconstruct(data, output, csize):
    half_size = int(csize / 2)
    min_row_ind = half_size
    max_row_ind = int(data.shape[0]) - half_size
    min_col_ind = half_size
    max_col_ind = int(data.shape[1]) - half_size
    A = list()
    b = list()
    for i in np.arange(min_row_ind, max_row_ind, dtype=int):
        for j in np.arange(min_col_ind, max_col_ind, dtype=int):
            A.append(data[(i - half_size):(i + half_size + 1), (j - half_size):(j + half_size + 1)].ravel().tolist())
            b.append(output[i, j])
            if len(A) == csize * csize and np.linalg.matrix_rank(A) == csize * csize:
                return (np.linalg.pinv(A)@np.array(b)[:, np.newaxis]).reshape(csize, csize)
    if len(A) < csize*csize:
        raise Exception("Insufficient data")

result = reconstruct(source_dataset, output_dataset, 3)

因此,它按预期工作;但确实需要改进,以考虑边缘效应、窗口大小均匀时的情况等。

这是一个广泛的问题。您可以手动操作,这将导致一个优化问题,或者您可以使用tensorflow中已设置的所有框架并训练卷积神经网络。您的
conv
变量将是卷积层的权重。您只需输入
input\u img
,并将输出设置为先前定义的
output\u img
。最后,这两种方法都是优化问题。区别在于,在前者中,您需要在多维函数中手动调用
scipy.optimize
,而在后者中,您只需创建一个
tf.Session
run
优化器。我还想使用张量流,但在张量流中,输出层有时是张量,在我的例子中,输出是矩阵。您可以始终使用
eval
,并将权重作为矩阵。这是一个广泛的问题。您可以手动执行此操作,这将导致一个优化问题,或者您可以使用tensorflow中已设置的所有框架并训练卷积神经网络。您的
conv
变量将是卷积层的权重。您只需输入
input\u img
,并将输出设置为先前定义的
output\u img
。最后,这两种方法都是优化问题。区别在于,在前者中,您需要在多维函数中手动调用
scipy.optimize
,而在后者中,您只需创建一个
tf.Session
run
优化器。我还想使用张量流,但在张量流中,输出层有时是张量,在我的例子中,输出是矩阵。您可以始终使用
eval
并将权重作为矩阵