卷积步长strides参数的具体解释

conv1 = tf.nn.conv2d(input_tensor,conv1_weights,strides=[1,1,1,1],padding='SAME')

这是一个常见的卷积操作,其中strides=【1,1,1,1】表示滑动步长为1,padding=‘SAME’表示填0操作

当我们要设置步长为2时,strides=【1,2,2,1】,很多同学可能不理解了,这四个参数分别代表了什么,查了官方函数说明一样不明不白,今天我来解释一下。

strides在官方定义中是一个一维具有四个元素的张量,其规定前后必须为1,这点大家就别纠结了,所以我们可以改的是中间两个数,中间两个数分别代表了水平滑动和垂直滑动步长值,于是就很好理解了。

在卷积核移动逐渐扫描整体图时候,因为步长的设置问题,可能导致剩下未扫描的空间不足以提供给卷积核的,大小扫描 比如有图大小为5*5,卷积核为2*2,步长为2,卷积核扫描了两次后,剩下一个元素,不够卷积核扫描了,这个时候就在后面补零,补完后满足卷积核的扫描,这种方式就是same。如果说把刚才不足以扫描的元素位置抛弃掉,就是valid方式。

  • 27
    点赞
  • 51
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
好的,我来为您解答这个问题。 首先,我们需要定义一个简单卷积神经网络的卷积核类ConvKernel,代码如下: ```python class ConvKernel: def __init__(self, kernel_size, input_size, strides): self.kernel_size = kernel_size self.input_size = input_size self.strides = strides def convolve(self, _input, weights, strides, axis): # 卷积运算函数 pass def forward(self, _input): # 前向传播的操作 pass def backward(self, grad_out): # 反向传播的操作 pass ``` 接下来,我们来逐一讲解这个卷积核类的各个方法: 1. `__init__`方法 这个方法在类被实例化的时候会被调用,用来初始化卷积核的大小、输入大小和步长大小。具体来说,这个方法包含三个参数: - `kernel_size`:卷积核的大小; - `input_size`:输入的大小; - `strides`:步长的大小。 这个方法的实现非常简单,只需要将这三个参数存储在对象的属性中即可: ```python def __init__(self, kernel_size, input_size, strides): self.kernel_size = kernel_size self.input_size = input_size self.strides = strides ``` 2. `convolve`方法 这个方法用来实现卷积运算,包含四个参数: - `_input`:输入的矩阵; - `weights`:卷积核的权重; - `strides`:步长的大小; - `axis`:矩阵的维度。 在这个方法中,我们需要对输入的矩阵和卷积核的权重进行卷积运算,得到输出矩阵。具体来说,这个方法需要完成以下操作: 1. 根据步长卷积核的大小计算出输出矩阵的大小; 2. 初始化输出矩阵; 3. 对输入矩阵和卷积核的权重进行卷积运算,得到输出矩阵。 这个方法的实现需要用到numpy库中的一些函数,具体实现如下: ```python def convolve(self, _input, weights, strides, axis): # 计算输出矩阵的大小 output_size = (_input.shape[axis] - self.kernel_size) // strides + 1 # 初始化输出矩阵 output = np.zeros((output_size, output_size)) # 对输入矩阵和卷积核的权重进行卷积运算 for i in range(output_size): for j in range(output_size): output[i][j] = np.sum(_input[i*strides:i*strides+self.kernel_size, j*strides:j*strides+self.kernel_size] * weights) return output ``` 3. `forward`方法 这个方法用来实现前向传播的操作。在这个方法中,我们需要将输入矩阵和卷积核的权重进行卷积运算,得到输出矩阵。具体来说,这个方法需要完成以下操作: 1. 对输入矩阵和卷积核的权重进行卷积运算,得到输出矩阵; 2. 将输出矩阵存储在对象的属性中。 这个方法的实现非常简单,只需要调用`convolve`方法,然后将输出矩阵存储在对象的属性中即可: ```python def forward(self, _input): # 对输入矩阵和卷积核的权重进行卷积运算 output = self.convolve(_input, self.weights, self.strides, self.axis) # 将输出矩阵存储在对象的属性中 self.output = output ``` 4. `backward`方法 这个方法用来实现反向传播的操作。在这个方法中,我们需要计算输出矩阵对输入矩阵和卷积核的权重的梯度,并将其传递到上一层。具体来说,这个方法需要完成以下操作: 1. 计算输出矩阵对输入矩阵的梯度; 2. 计算输出矩阵对卷积核的权重的梯度; 3. 将输入矩阵和卷积核的权重的梯度传递到上一层。 这个方法的实现需要用到numpy库中的一些函数,具体实现如下: ```python def backward(self, grad_out): # 计算输出矩阵对输入矩阵的梯度 grad_input = np.zeros(self.input_size) for i in range(grad_out.shape[0]): for j in range(grad_out.shape[1]): grad_input[i*self.strides:i*self.strides+self.kernel_size, j*self.strides:j*self.strides+self.kernel_size] += self.weights * grad_out[i][j] # 计算输出矩阵对卷积核的权重的梯度 grad_weights = np.zeros((self.kernel_size, self.kernel_size)) for i in range(grad_out.shape[0]): for j in range(grad_out.shape[1]): grad_weights += _input[i*self.strides:i*self.strides+self.kernel_size, j*self.strides:j*self.strides+self.kernel_size] * grad_out[i][j] # 将输入矩阵和卷积核的权重的梯度传递到上一层 return grad_input, grad_weights ``` 这样,我们就完成了一个简单的卷积神经网络的卷积核类ConvKernel的定义,并实现了卷积运算、前向传播和反向传播的操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值