gpt4 book ai didi

python - 当步幅大于 1 时,SAME 填充如何在卷积神经网络中工作?

转载 作者:行者123 更新时间:2023-12-04 17:26:35 26 4
gpt4 key购买 nike

我正在尝试在 python 中实现二维卷积。
我有一个尺寸为 (m, 64, 64, 3) 的输入图像集,其中 m 是图像的数量。
我想对高度和宽度使用过滤器大小 f=8 和 stride=8,并使用相同的填充,以便保留输入宽度和高度 (64, 64)。
使用公式 [n' = floor((n-f+2*pad)/stride + 1)] 并把 n'=64, n=64, stride=8, f=8, 我得到 垫=224 ,这是不合理的大。
比如我取m的时候,图像的数量,为1080,估计是内存错误导致系统崩溃。
但是当我使用 Keras 库和以下代码时,它运行良好。

X = keras.layers.Conv2D(filters=32, kernel_size=(8, 8), strides=(8, 8), padding='same')(X)
这是我在 python 中的 Conv2D 实现:
import numpy as np

# A.shape = (1080, 64, 64, 3)
# W.shape = (8, 8, 3, 32)
# b.shape = (32,)

def conv_fwd(A, W, b, pad=0, stride=1):
pad_A = np.pad(A, ((0, 0), (pad, pad), (pad, pad), (0, 0)), mode='constant')
(m, w, h, nc) = A.shape
(fw, fh, ncc, ncn) = W.shape

if nc != ncc:
raise Exception('Number of channels in kernel and input do not match')

wn = int((w-fw+2*pad)/stride + 1)
hn = int((h-fh+2*pad)/stride + 1)
A_n = np.zeros((m, wn, hn, ncn))
W = W.reshape(fw*fh*ncc, ncn)

for i in range(wn):
for j in range(hn):
A_n[:, i, j] = pad_A[:, i*stride:i*stride+fw, j*stride:j*stride+fh].reshape(m, fw*fh*nc).dot(W) + b
return A_n
所以我假设在 keras 中计算填充有不同的过程。我试图寻找源代码,但找不到。它是如何工作的?

最佳答案

在公式中,n' = floor((n-f+2*pad)/stride + 1您已服用 n' == n == 64 .
那是不正确的。 n' is equal to n仅当 Stride is equal to 1 的值但在这里,Stride大于 1 ( 8 )。
这就是您获得高值(value) Padding 的原因.
现在,您的目标是找到 Padding 的值,我有一个解决方案/解决方法(可能不是很优化)。
最初,使用 Padding = Same 构建模型, 如下所示:

import tensorflow as tf
model = tf.keras.models.Sequential()
model.add(tf.keras.layers.Conv2D(filters = 64, strides = (2,2), kernel_size = (3,3),
input_shape = (64,64,3), padding = 'same'))
print(model.summary())
模型总结 Padding = Same如下图所示:
Model: "sequential_12"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
conv2d_25 (Conv2D) (None, 32, 32, 64) 1792
=================================================================
Total params: 1,792
Trainable params: 1,792
Non-trainable params: 0
如果我们观察 ShapeImage ,从 (64,64) 减少至 (32,32)即使 Padding == Same .
现在,使用 Padding = Valid 构建模型, 如下所示:
import tensorflow as tf
model = tf.keras.models.Sequential()
model.add(tf.keras.layers.Conv2D(filters = 64, strides = (2,2), kernel_size = (3,3),
input_shape = (64,64,3), padding = 'valid'))
print(model.summary())
上述模型的摘要如下所示:
Model: "sequential_11"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
conv2d_24 (Conv2D) (None, 31, 31, 64) 1792
=================================================================
Total params: 1,792
Trainable params: 1,792
Non-trainable params: 0
如果我们观察, ShapeConvolutional Layer(None,31,31,64) .
现在, Padding可以通过公式得到,
Height with SAME Padding - Height with VALID Padding
或者
Width with SAME Padding - Width with VALID Padding
即, 32 - 31 = 1 .
衬垫 在您的情况下,使用 Input Shape = (64, 64,3) , Filter Size = 8 , Strides = 8 1 IE。, Input用 1 行和 1 列零填充 .

关于python - 当步幅大于 1 时,SAME 填充如何在卷积神经网络中工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62859668/

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