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)
输入为一个张量,输出为一个张量
将一张图像经过卷积之后,输出特征结果并查看对应的数据。
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)
#可视化图片
plt.figure(figsize=(6,6))
plt.imshow(myimgray,cmap=plt.cm.gray)
plt.axis("off")
plt.show()
## 将数组转化为张量
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
#可视化卷积后的图像
plt.figure(figsize=(12.,6))
plt.subplot(1,2,1)
plt.imshow(imconv2dout_im[0],cmap=plt.cm.gray)
plt.axis("off")
plt.show()
池化层的目的是对卷积之后的特征进行进一步的处理,可以起到对数据进行进一步浓缩的效果。
整个池化的过程包括了最大池化(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)
参数的使用说明
输入为张量,同时输出为张量
下面以最大池化为例子进行说明
# 对卷积后的结果进行最大池化
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()