首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

体系课-前端工程师2022版(缅想咸阳事可嗟)

体系课-前端工程师2022版

download:https://www.zxit666.com/4972/

作为合成机的卷积网络

下图显现了卷积网络如何创立交互特征

上图有5个曾经停止嵌入的分类特征(batch_size, num_categorical=5, embedding_size)。假定我们有一个大小为(高度=3,宽度为1)的卷积过滤器。当我们在num_categorical维度(输入维度=1)上应用卷积(高度=3,宽度=1)的过滤器时,运用红框的示例(当我们在dim=1上卷积时),能够看到我们有效地计算了3个特征之间的卷积(由于过滤器的高度为3)。单个卷积的每个输出是3个分类特征之间的互相作用。当我们在num_categorical上滑动卷积时,能够有效地捕获任何滚动三元组特征之间的交互,其中3个不同特征窗口之间的每个交互都在卷积的输出中被捕获。

由于过滤器的宽度为1,所以正在计算三个特征在嵌入维度上独立的滚动窗口交互,如红色、蓝色、紫色和绿色框所示。卷积层的输出高度是产生的可能交互特征的总数,本例是3。卷积层输出的宽度将是原始嵌入大小,由于卷积滤波器的宽度为1。

由于嵌入大小是相同的,我们能够有效地将卷积网络的这种运用视为合成机,其中以滚动窗口的方式捕获特征之间的交互。

PyTorch完成

我们运用PyTorch停止完成,并且可视化视卷积网络中的填充、跨步和扩张

1、填充 Padding

停止填充后,我们的输入和输出的大小是相同的,下面代码在pytorch中运用padding='same'。

class Conv2dSame(nn.Conv2d): def __init__(self, in_channels, out_channels, kernel_size, stride=1, padding=0, dilation=1, groups=1, bias=True): # initialize with no padding first super(Conv2dSame, self).__init__( in_channels, out_channels, kernel_size, stride, 0, dilation, groups, bias) nn.init.xavier_uniform_(self.weight) def forward(self, x): # input height and width ih, iw = x.size()[-2:] # filter height and width kh, kw = self.weight.size()[-2:] # output height oh = math.ceil(ih / self.stride[0]) # output width ow = math.ceil(iw / self.stride[1]) # 2* padding for height pad_h = max((oh - 1) * self.stride[0] + (kh - 1) * self.dilation[0] + 1 - ih, 0) # 2 * padding for width pad_w = max((ow - 1) * self.stride[1] + (kw - 1) * self.dilation[1] + 1 - iw, 0) # divide the paddings equally on both sides and pad equally # note the ordering of the paddings are reversed for height and width. (it is width then height in the code) if pad_h > 0 or pad_w > 0: x = F.pad(x, [pad_w // 2, pad_w - pad_w // 2, pad_h // 2, pad_h - pad_h // 2]) # manually create padding out = F.conv2d(x, self.weight, self.bias, self.stride, self.padding, self.dilation, self.groups) return out # self implementation conv_same = Conv2dSame(in_channels=1, out_channels=5, kernel_size=3, stride=1, dilation=2, padding=0) conv_same_out= conv_same(x) ## pytorch conv_same_pt = nn.Conv2d(in_channels=1, out_channels=5, kernel_size=3, stride=1, dilation=2, padding='same') conv_same_pt.weight = conv_same.weight conv_same_pt.bias = conv_same.bias conv_same_pt_out= conv_same_pt(x) assert torch.equal(conv_same_out, conv_same_pt_out) == True

为什么需求填充

有两种最常见的填充类型:(1)“valid”填充(2)“same”填充,如上图所示。

运用“valid”填充对一个维度停止卷积时,输出维度将小于输入维度。(上面的“被丢弃”的例子)

运用“same”填充对一个维度停止卷积时,对输入数据停止填充,使输出维度与输入维度相同(参考上面的“pad”示例)。

2、步幅 Stride

步幅就是在输入上滑动过滤器的步长。

Stride指的是卷积核在输入张量上挪动的步长:

步幅为1意味着过滤器每次挪动一个元素,产生密集的计算。步幅大于1意味着过滤器在挪动过程中跳过元素,产生输入的子采样。步幅直接影响输出特征图的空间维度。较大的步幅会招致输出大小的减小。

步幅为2,则输出大小将减小。我们能够用Pytorch考证这一点,假如我们将height和width的stride设置为2,则height和width从5减小到3。(留意,能够为高度和宽度指定不同的步长):

# sample data batch_size=10 channel_in = 1 height = 5 width = 5 x = torch.randn(batch_size, channel_in, height, width) x.shape # torch.Size([10, 1, 5, 5]) # padded convolution with padding specified in nn.Conv2d pad_conv = nn.Conv2d(in_channels=1, out_channels=5, kernel_size=3, stride=2, dilation=1, padding=1) pad_conv(x).shape # torch.Size([10, 5, 3, 3])

3、扩张 Dilation

扩张是滤波器中输入张量和权重之间的间隙大小

扩张是指卷积运算过程中核元素之间的间距。扩张为1意味着核元素之间没有间隙,产生规范卷积。大于1则引入了核元素之间的间隙,有效地扩展了卷积操作的承受域。

扩张通常用于增加卷积层的承受野,能够在不添加额外参数的状况下捕获更普遍的上下文信息。扩张不直接影响输出特征图的空间维度。它影响内核如何采样输入元素。

4、Flexible K-max pooling

在计算机视觉中,最大池化的思想曾经十分盛行,以减少卷积网络所需的计算,并已被证明是胜利的辨认图像中的重要特征。max_pooling在计算机视觉中表现得很好,但我们不能将其用于引荐系统,由于只检索(height, width)字段中的最大值是没有意义的,由于具有大值的交互特征将在池化层的输出中反复呈现(由于卷积网络逾越输入的实质,其中每个输入能够在输出中呈现屡次)。

所以能够扩展池化操作(输出交互特征的大值比输出交互特征的小值更重要),并引入了灵敏的p-max池化,只从每个卷积层输出中取得top-k个最大特征。由于k是由卷积层的深度决议的,它随着深度的增加而减小。这模拟了卷积层中的最大池化思想,其中最大池化产生的输出大小小于输入大小。

  • 发表于:
  • 原文链接https://page.om.qq.com/page/O9NFEIjHa0SgAvlgG4ZmVjqQ0
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券