PyTorch 深度学习:30分钟快速入门

卷积¶

卷积在 pytorch 中有两种方式,一种是 torch.nn.Conv2d(),一种是 torch.nn.functional.conv2d(),这两种形式本质都是使用一个卷积操作

这两种形式的卷积对于输入的要求都是一样的,首先需要输入是一个 torch.autograd.Variable() 的类型,大小是 (batch, channel, H, W),其中 batch 表示输入的一批数据的数目,第二个是输入的通道数,一般一张彩色的图片是 3,灰度图是 1,而卷积网络过程中的通道数比较大,会出现几十到几百的通道数,H 和 W 表示输入图片的高度和宽度,比如一个 batch 是 32 张图片,每张图片是 3 通道,高和宽分别是 50 和 100,那么输入的大小就是 (32, 3, 50, 100)

下面举例来说明一下这两种卷积方式

PyTorch 深度学习:30分钟快速入门_第1张图片

PyTorch 深度学习:30分钟快速入门_第2张图片

下面我们定义一个算子对其进行轮廓检测

PyTorch 深度学习:30分钟快速入门_第3张图片

下面我们可视化边缘检测之后的结果

PyTorch 深度学习:30分钟快速入门_第4张图片

PyTorch 深度学习:30分钟快速入门_第5张图片

 

可以看到两种形式能够得到相同的效果,不同的地方相信你也看到了,使用 nn.Conv2d() 相当于直接定义了一层卷积网络结构,而使用 torch.nn.functional.conv2d() 相当于定义了一个卷积的操作,所以使用后者需要再额外去定义一个 weight,而且这个 weight 也必须是一个 Variable,而使用 nn.Conv2d() 则会帮我们默认定义一个随机初始化的 weight,如果我们需要修改,那么取出其中的值对其修改,如果不想修改,那么可以直接使用这个默认初始化的值,非常方便

实际使用中我们基本都使用 nn.Conv2d() 这种形式

池化层¶

卷积网络中另外一个非常重要的结构就是池化,这是利用了图片的下采样不变性,即一张图片变小了还是能够看出了这张图片的内容,而使用池化层能够将图片大小降低,非常好地提高了计算效率,同时池化层也没有参数。池化的方式有很多种,比如最大值池化,均值池化等等,在卷积网络中一般使用最大值池化。

在 pytorch 中最大值池化的方式也有两种,一种是 nn.MaxPool2d(),一种是 torch.nn.functional.max_pool2d(),他们对于图片的输入要求跟卷积对于图片的输入要求是一样了,就不再赘述,下面我们也举例说明

PyTorch 深度学习:30分钟快速入门_第6张图片

可以看到图片的大小减小了一半,那么图片是不是变了呢?我们可以可视化一下

PyTorch 深度学习:30分钟快速入门_第7张图片

可以看到图片几乎没有变化,说明池化层只是减小了图片的尺寸,并不会影响图片的内容

PyTorch 深度学习:30分钟快速入门_第8张图片

跟卷积层一样,实际使用中,我们一般使用 nn.MaxPool2d()

 

你可能感兴趣的:(深度学习)