torch.nn.conv2d中涉及的参数是什么意思

时间:2019-06-19 21:15:38

标签: python machine-learning artificial-intelligence pytorch

在Fastai面向程序员的前沿深度学习课程7中。 有一行

 self.conv1 = nn.Conv2d(3,10,kernel_size = 5,stride=1,padding=2)

那里的10代表过滤器的数量或过滤器将激活的数量吗?如果我错了纠正我吗?

2 个答案:

答案 0 :(得分:1)

检查文档https://pytorch.org/docs/stable/nn.html#torch.nn.Conv2d时,您有3个in_channel和10个out_channel,因此这10个out_channel是@ thefifthjack005过滤器,也称为功能。

答案 1 :(得分:0)

Here是您可以找到的

  

torch.nn.Conv2d(in_channels,out_channels,kernel_size,stride = 1,padding = 0,dilation = 1,groups = 1,bias = True,padding_mode ='zeros')

参数

  • in_channels(int)–输入图像中的通道数
  • out_channels(int)–卷积产生的通道数
  • kernel_size(整数或元组)–卷积内核的大小
  • 跨度(int或tuple,可选)–卷积的跨度。 (默认:1)
  • 填充(int或元组,可选)–在输入的两边都添加了零填充(默认值:0)
  • padding_mode(字符串,可选)–零
  • dilation(整数或元组,可选)–内核元素之间的间距。 (默认:1)
  • 组(int,可选)–从输入通道到输出通道的阻塞连接数。 (默认:1)
  • bias(布尔型,可选)–如果为True,则为输出添加可学习的偏差。 (默认:True)

这个URL具有对过程的可视化帮助。

因此,对于具有3个通道的图像(彩色图像),开头的in_channels为3。 对于黑白图像,应为1。 一些卫星图像应该有4。

out_channels将产生卷积,因此这就是过滤器的数量。

让我们创建一个示例来“证明”这一点。

import torch
import torch.nn as nn
c = nn.Conv2d(1,3, stride = 1, kernel_size=(4,5))
print(c.weight.shape)
print(c.weight)

torch.Size([3, 1, 4, 5])
Parameter containing:
tensor([[[[ 0.1571,  0.0723,  0.0900,  0.1573,  0.0537],
          [-0.1213,  0.0579,  0.0009, -0.1750,  0.1616],
          [-0.0427,  0.1968,  0.1861, -0.1787, -0.2035],
          [-0.0796,  0.1741, -0.2231,  0.2020, -0.1762]]],


        [[[ 0.1811,  0.0660,  0.1653,  0.0605,  0.0417],
          [ 0.1885, -0.0440, -0.1638,  0.1429, -0.0606],
          [-0.1395, -0.1202,  0.0498,  0.0432, -0.1132],
          [-0.2073,  0.1480, -0.1296, -0.1661, -0.0633]]],


        [[[ 0.0435, -0.2017,  0.0676, -0.0711, -0.1972],
          [ 0.0968, -0.1157,  0.1012,  0.0863, -0.1844],
          [-0.2080, -0.1355, -0.1842, -0.0017, -0.2123],
          [-0.1495, -0.2196,  0.1811,  0.1672, -0.1817]]]], requires_grad=True)

如果我们要更改out_channels的数量,

c = nn.Conv2d(1,5, stride = 1, kernel_size=(4,5))
print(c.weight.shape) # torch.Size([5, 1, 4, 5])

我们将获得5个过滤器,每个过滤器4x5,因为这是我们的内核大小。 如果我们要设置2个通道,(某些图像可能只有2个通道)

c = nn.Conv2d(2,5, stride = 1, kernel_size=(4,5))
print(c.weight.shape) # torch.Size([5, 2, 4, 5])

我们的过滤器将有2个频道。

我认为他们有this book来的术语,并且由于在那里没有将其称为过滤器,因此他们没有使用该术语。

所以你是对的;过滤器是conv层要学习的内容,过滤器的数量是输出通道的数量。一开始它们是随机设置的。

激活次数是根据bs和图片尺寸计算的:

bs=16
x = torch.randn(bs, 3, 28, 28)
c = nn.Conv2d(3,10,kernel_size=5,stride=1,padding=2)
out = c(x)
print(out.nelement()) #125440 number of activations