gpt4 book ai didi

Tensorflow:如何使用自定义常量滤波器对图像进行卷积

转载 作者:行者123 更新时间:2023-11-30 09:45:29 26 4
gpt4 key购买 nike

我有 3 个 5x5 过滤器,我想对灰度图像(形状 [nx,ny,1])输入进行卷积。我已经预设了每个 5x5 过滤器所需的硬编码值,我不希望它们被我的模型“学习”,而只是一个恒定的操作。

我该如何实现这一目标?

我正在考虑使用 tf.nn.conv2d() ,它说它的过滤器需要具有形状 [高度、宽度、输入、输出],所以我尝试使用 tf.constant() 为我的张量创建一个张量形状为 [5,5,1,3] 的过滤器(因此 3 个形状为 5x5 的过滤器应用于具有 1 个 channel 的输入),但 tf.constant() 的结果看起来不正确。结果是这样的:

 [[[[ -5   7  -12]]

[[ 21 0 2]]

[[ -6 9 -6]]

[[ 2 -2 8]]

[[-6 4 -1]]]


[[[ 2 -6 8]]

[[ -6 2 -1]]

[[ 2 -2 2]]

[[ -1 1 5]]

[[ 4 3 2]]]

...etc

它看起来不像 3 个 5x5 过滤器的形状。

如果我使用 tf.constant() 且形状为 [1,3,5,5],我会得到:

[[[[ -5   7  -12   21  0]
[ 2 -6 9 -6 2]
[ -2 8 -6 4 -1]
[ 2 -6 8 -6 2]
[ -1 2 -2 2 -1]]

[[ 1 5 4 3 2]
[ 4 0 -2 0 4]
[ 2 -1 7 -3 5]
[ -1 0 -1 0 -1]
[ 5 0 9 0 5]]

...etc

确实看起来像 5x5 过滤器,但它不是 tf.nn.conv2d() 所采用的正确形状

所以我对这种不匹配感到困惑,不知道正确的做法是什么。

最佳答案

最好不要担心过滤器的外观。只需跟踪形状以确保它们有意义。

以下是对图像应用 2 个 Sobel 滤镜的示例:

from skimage import data
img = np.expand_dims(data.camera(), -1)
img = np.expand_dims(img, 0) # shape: (1, 512, 512, 1)

sobel_x = np.array([[-0.25, -0.2 , 0. , 0.2 , 0.25],
[-0.4 , -0.5 , 0. , 0.5 , 0.4 ],
[-0.5 , -1. , 0. , 1. , 0.5 ],
[-0.4 , -0.5 , 0. , 0.5 , 0.4 ],
[-0.25, -0.2 , 0. , 0.2 , 0.25]])

sobel_y = np.array([[-0.25, -0.4 , -0.5 , -0.4 , -0.25],
[-0.2 , -0.5 , -1. , -0.5 , -0.2 ],
[ 0. , 0. , 0. , 0. , 0. ],
[ 0.2 , 0.5 , 1. , 0.5 , 0.2 ],
[ 0.25, 0.4 , 0.5 , 0.4 , 0.25]])

filters = np.concatenate([[sobel_x], [sobel_y]]) # shape: (2, 5, 5)
filters = np.expand_dims(filters, -1) # shape: (2, 5, 5, 1)
filters = filters.transpose(1, 2, 3, 0) # shape: (5, 5, 1, 2)

# Convolve image
ans = tf.nn.conv2d((img / 255.0).astype('float32'),
filters,
strides=[1, 1, 1, 1],
padding='SAME')

with tf.Session() as sess:
ans_np = sess.run(ans) # shape: (1, 512, 512, 2)

filtered1 = ans_np[0, ..., 0]
filtered2 = ans_np[0, ..., 1]

图像与 2 个滤波器正确卷积,生成的图像如下所示:

plt.matshow(filtered1)
plt.show()

enter image description here

plt.matshow(filtered2)
plt.show()

enter image description here

关于Tensorflow:如何使用自定义常量滤波器对图像进行卷积,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53146638/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com