CNN中的stride 和 padding

先看一下 tensorflow中自带的卷积操作是什么样子的呢?

https://tensorflow.google.cn/api_docs/python/tf/nn/conv2d

tf.nn.conv2d(
    input,
    filter,
    strides,
    padding,
    use_cudnn_on_gpu=True,
    data_format='NHWC',
    dilations=[1, 1, 1, 1],
    name=None
)

其中data_format这个参数我们很少了解,其实它是固定你input的格式,NHWC对应着你的输入数据的维度时[batch_size,Heigth,Width,Channel],NCHW对应[batch_size,Channel,Heigth,Width]。

其实strides里面的参数和这个data_format是一一对应的,什么意思呢?就是说,如果我们采用NHWC的方式和strides=[a,b,c,d]的情况下,计算卷积核移动过程是怎么样的呢?它会在batch的维度上按照 step=a的大小进行移动计算,同理,分别在HWC的维度上移动的step为b c d。因为我们需要对每一个batch和channel都需要进行计算,所以这里 a,d 的值为1。b c的值可以根据实际情况进行改变,他们的值直接关系到输出的feature map 的维度。

在来看一下在padding 等于 same 和valid 两个参数下的计算方式。可以参考:https://www.jianshu.com/p/05c4f1621c7e

假设,我们输入的图像的大小为:W*H

  kernel size的大小为: k_h*k_w

             在 H 方向的stride为 h, 在W方向 的stride为 w

            来求我们新输出的特征图的大小,n_h 和 n_w

如果是 valid 模式,他是只在原图进行修改

     则 n_h =( H-k_h)/ h 向上取整后加 1 ;          n_w = (W-k_w)/ h 向上取整后加 1 ;

如果是 SAME 模式,他会在填充的时候自动补0(在必要的时候)。

那么什么是必要的时候呢?它是先根据公式 n_h = H/h 向上取整 和 n_w=W/w 向上取整 得到最终的输出n_h和n_w,在根据得需要输出的 n_h 和 n_w 反向推到那些地方需要补 0 。

在 H 方向 pad_need_H = (n_h -1 ) * h +K_h - H

在矩阵每一行的上方需要添加的像素数为:

pad_need_H/2 取整 

在矩阵每一行的下方需要添加的像素数为

pad_need_H - pad_need_H/2

同理可得在W方向,

源码如下。
 

例如输入的是feature map 是4*4 ,kernel size 为1*1,strides 1,1

则它需要补充后的图为

这里画斜杠的为填充的0

加入输入的feature map 为 2*5 kernel size 为2*2 , strides 为【1,2,1,1】

则它需要填充后的图为

最后一列为需要填充的0值,最后输出的feature map 为1*5

原文:https://blog.csdn.net/tiandd12/article/details/80271050 
 

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
反向传播算法(backpropagation)是一种用于训练神经网络的算法,它可用于计算损失函数相对于模型参数的梯度。本文将介绍如何使用PyTorch实现CNN的反向传播算法。 首先,我们需要定义CNN模型。以下是一个简单的例子: ```python import torch import torch.nn as nn class CNN(nn.Module): def __init__(self): super(CNN, self).__init__() self.conv1 = nn.Conv2d(in_channels=3, out_channels=16, kernel_size=3, stride=1, padding=1) self.conv2 = nn.Conv2d(in_channels=16, out_channels=32, kernel_size=3, stride=1, padding=1) self.fc1 = nn.Linear(32*8*8, 64) self.fc2 = nn.Linear(64, 10) self.relu = nn.ReLU() self.pool = nn.MaxPool2d(kernel_size=2, stride=2) def forward(self, x): x = self.pool(self.relu(self.conv1(x))) x = self.pool(self.relu(self.conv2(x))) x = x.view(-1, 32*8*8) x = self.relu(self.fc1(x)) x = self.fc2(x) return x ``` 上述CNN模型包含两个卷积层和两个全连接层。我们可以使用PyTorch的nn.Conv2d和nn.Linear来定义卷积和全连接层。在forward函数,我们先将输入x通过两个卷积层和池化层进行卷积和下采样,然后将其展开成一维向量,并通过两个全连接层输出结果。 接下来,我们需要定义损失函数和优化器。在本例,我们使用交叉熵损失函数和随机梯度下降(SGD)优化器: ```python criterion = nn.CrossEntropyLoss() optimizer = torch.optim.SGD(model.parameters(), lr=0.01) ``` 然后我们可以开始训练模型。在每个epoch,我们需要遍历训练集的所有样本,并计算损失函数和梯度。这可以通过以下代码实现: ```python for epoch in range(num_epochs): running_loss = 0.0 for i, data in enumerate(trainloader, 0): inputs, labels = data optimizer.zero_grad() outputs = model(inputs) loss = criterion(outputs, labels) loss.backward() optimizer.step() running_loss += loss.item() print('Epoch [%d], loss: %.3f' % (epoch+1, running_loss/len(trainloader))) ``` 在每个batch,我们首先将模型参数的梯度清零,然后将输入数据输入模型,计算模型的输出和损失函数,并通过调用loss.backward()计算梯度。最后,我们通过调用optimizer.step()更新模型参数。 最后,我们可以使用训练好的模型进行预测。这可以通过以下代码实现: ```python correct = 0 total = 0 with torch.no_grad(): for data in testloader: images, labels = data outputs = model(images) _, predicted = torch.max(outputs.data, 1) total += labels.size(0) correct += (predicted == labels).sum().item() print('Accuracy of the network on the 10000 test images: %d %%' % (100 * correct / total)) ``` 在预测过程,我们将输入数据输入模型,计算模型输出并找到输出最大值的索引,然后将其与真实标签进行比较,最后计算模型预测的准确率。 以上就是使用PyTorch实现CNN反向传播算法的基本步骤。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

帅气滴点C

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值