pytorch深度学习框架—torch.nn模块(一)

pytorch深度学习框架—torch.nn模块

torch.nn模块中包括了pytorch中已经准备好的层,方便使用者调用构建的网络。包括了卷积层,池化层,激活函数层,循环层,全连接层。

卷积层

pytorch中针对使用场景的不同,有一维卷积,二维卷积,三维卷积和转置卷积等。都可以从torch.nn模块中进行调用。

层对应的类 功能作用
troch.nn.Conv1d() 应用1D卷积
troch.nn.Conv2d() 应用2D卷积
troch.nn.Conv3d() 应用3D卷积
troch.nn.Transpose1d() 应用1D转置卷积
troch.nn.Transpose2d() 应用2D转置卷积
troch.nn.Transpose3d() 应用3D转置卷积

conv1d常用在文本、conv2d常用在图片、conv3d常用在帧图片

以torch.nn.Conv2d为例介绍卷积在图像上的操作

torch.nn.Conv2d(in_channels,
				out_channels,
				kernel_size,
				stride=1,
				padding=0,
				dilation=1,
				groups=1,
				bias=True)
  • in_channels:(整数) 输入图像的通道数
  • out_channels(整数)经过卷积运算后,输出特征映射的数量。
  • kernel_size(整数或者数组):卷积核大小
  • stride(步长)默认为1
  • padding:在输入两边进行0填充的数量,默认为0
  • dilation:卷积核元素之间的步幅
  • groups:从输入通道到输出通道的阻塞连接数
  • bias:添加偏置默认为True

输入为一个张量,输出为一个张量

将一张图像经过卷积之后,输出特征结果并查看对应的数据。

import torch
import torch.nn as nn
import matplotlib.pyplot as plt
from PIL import Image
import numpy as np
# 读取图像-转化为灰度图片-转化为numpy数组
myim = Image.open("data/bg.jpg")
myimgray = np.array(myim.convert("L"),dtype=np.float32)

pytorch深度学习框架—torch.nn模块(一)_第1张图片

#可视化图片
plt.figure(figsize=(6,6))
plt.imshow(myimgray,cmap=plt.cm.gray)
plt.axis("off")
plt.show()

pytorch深度学习框架—torch.nn模块(一)_第2张图片

## 将数组转化为张量
imh,imw = myimgray.shape
myimgray_t = torch.from_numpy(myimgray.reshape(1,1,imh,imw))
myimgray_t.shape

经过上面的操作得到了一个560 * 989的数组,进行卷积操作之前先将其转化为张量

卷积操作

卷积时先将图像转化为四维表示[batch,channel,h,w]在对图像进行卷积操作以后获取两个特征映射
第一个特征映射用图像轮廓提取卷积核获取,第二个特征映射使用的卷积核为随机数,卷积核大小为5x5图像边缘不使用0填充

# 对灰度图像进行卷积提取图像轮廓
kersize = 5
ker = torch.ones(kersize,kersize,dtype=torch.float32)*-1
ker[2,2] = 24
ker = ker.reshape((1,1,kersize,kersize))

进行卷积操作提取特征,并压缩维度尺寸

## 进行卷积操作
conv2d = nn.Conv2d(1,2,(kersize,kersize),bias=False)
# 设置卷积时使用的核,第一个核使用边缘检测核
conv2d.weight.data[0] = ker
# 对灰度图像进行卷积操作
imconv2dout = conv2d(myimgray_t)
#对卷积后的输出进行维度压缩
imconv2dout_im = imconv2dout.data.squeeze()
#输出卷积后的尺寸
imconv2dout_im.shape

pytorch深度学习框架—torch.nn模块(一)_第3张图片

#可视化卷积后的图像
plt.figure(figsize=(12.,6))
plt.subplot(1,2,1)
plt.imshow(imconv2dout_im[0],cmap=plt.cm.gray)
plt.axis("off")
plt.show()

pytorch深度学习框架—torch.nn模块(一)_第4张图片

池化层

池化层的目的是对卷积之后的特征进行进一步的处理,可以起到对数据进行进一步浓缩的效果。

整个池化的过程包括了最大池化(MaxPool)平均池化(AvgPool)与自适应池化。每一种池化都包括了1d 2d 3d三种类型的池化过程

下面对torch.nn.MaxPool2d()池化操作的相关参数的应用进行说明

torch.nn.MaxPool2d(kernel_size,
					stride=None,
					padding=0,
					dilation=1,
					return_indices=False,
					ceil_mode=False)

参数的使用说明

  • kernel_size 最大池化的窗口大小
  • stride:最大池化窗口移动的步长,默认值是kernel_size
  • padding:输入的每一条边补充0的层数
  • dilation:控制窗口元素步幅参数
  • return_indices:如果为true则返回最大索引,便于之后的torch.nn.MaxUnpool2d操作

输入为张量,同时输出为张量

下面以最大池化为例子进行说明

# 对卷积后的结果进行最大池化
maxpool2 = nn.MaxPool2d(2,stride=2)
pool2_out = maxpool2(imconv2dout)
pool2_out_im = pool2_out.squeeze()
pool2_out.shape

可视化最大池化后的结果

将两个特征映射可视化之后得到对应结果。

plt.figure(figsize=(12,6))
plt.subplot(1,2,1)
plt.imshow(pool2_out_im[0].data,cmap=plt.cm.gray)
plt.subplot(1,2,2)
plt.imshow(pool2_out_im[1].data,cmap=plt.cm.gray)
plt.show()

pytorch深度学习框架—torch.nn模块(一)_第5张图片

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