如果输入图像和输出图像已知,Python将查找卷积内核
我对python中的卷积内核有一个问题。它是关于简单的卷积算子。我有输入矩阵和输出矩阵。我想找到一个可能的卷积内核,大小为(5x5)。如何用python、numpy或tensorflow解决这个问题如果输入图像和输出图像已知,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]
将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
并将权重作为矩阵