卷积层
在卷积神经网络中,通过输入卷积核来进行卷积操作,使输入单元(图像或特征映射)和输出单元(特征映射)之间的连接是稀疏的,这样能够减少需要训练参数的数量,从而加快网络的计算速度。
卷积操作的参数共享??特点,主要体现在模型中同一组参数可以被多个函数或操作共同使用。
torch.nn.Conv2d()
针对输入信号上应用2D卷积
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 , 卷积的步长
padding , 在输入两边进行0填充的数量,默认为0
dialation ,卷积核元素之间的步幅,该参数可调整空洞卷积的空洞大小,默认为1
groups , 从输入通道到输出通道的阻塞连接数
bias , 如果bias = True,则添加偏置,默认为True
conv2d的输出是什么呢?
这里的输出也是一个4维的张量。
torch.nn的输入和输出都是张量
## 使用一张图像来展示经过卷积后的图像效果
import torch
import torch.nn as nn
import matplotlib.pyplot as plt
from PIL import Image
## 读取图像——>转化为灰度图片——>转化为Numpy数组
myim = Image.open("data/chap2/Lenna.png")
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()
(Image.convert(),用于将图片在PIL中的九种模式之间相互切换)
我们在处理图像之前,先获得一张灰度图像,现在灰度图像是一个512x512的数组,在使用Pytorch进行卷积操作之前,需要将其转化为1x1x512x512的张量
In[2] :
## 将数组转化为张量
imh,imw = myimgray.shape
myimgray_t = torch.from_numpy(myimgray.reshape((1,1,imh,imw)))
myimgray_t.shape
Out[2] : torch.Size([1,1,512,512])
卷积时需要将图像转化为思维来表示[ batch , channel , h , w]
这里的batch的意思是指,该图像有几个feature maps,channel是指通道数
In[3]: ## 对灰度图像进行卷积提取图像轮廓
kersize = 5 ## 定义边缘检测卷积核,并将维度处理为1*1*5*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)
## 对卷积后输出进行维度压缩
imconv2out_im = imconv2dout.data.squeeze()
print("卷积后尺寸:",imconv2out_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.subplot(1,2,2)
plt.imshow(imconv2dout_im[1],cmap=plt.cm.gray)
plt.axis("off")
plt.show()
Out[3] :卷积后尺寸 : torch.Size([2,508,508])
在深度学习中,卷积核也就是,我们卷积时所需要用到的特征,这个一般是网络自己会学习的,我们的目标就是把网络/框架搭建出来就行。
池化层
池化操作的一个重要的目的就是对卷积后得到的特征进行进一步处理(主要是降维),池化层可以起到对数据进一步浓缩的结果,从而缓解计算时内存的压力。池化会选取一定大小区域,将该区域内的像素值使用一个代表元素表示。如果使用平均值代替则成为平均值池化,如果使用最大值代替,则称为最大值池化。
激活函数
在PyTorch中,提供了十几种激活函数层所对应的类,但常用的激活函数通常为S型(Sigmoid)激活函数、双曲正切(Tanh)激活函数、线性修正单元(ReLU)激活函数等。
torch.nn.Sigmoid
torch.nn.Tanh
torch.nn.ReLU
torch.nn.Softplus
我以前一直以为是用方法来作为模型,今天才知道是用类来作为模型。
类有输入和输出也是很正常的吧。