中文网站建设英文,晋中网络推广,wordpress素材下载源码,网站模板怎么使用教程机器学习深度学习——torch.nn模块 卷积层池化层激活函数循环层全连接层 torch.nn模块包含着torch已经准备好的层#xff0c;方便使用者调用构建网络。 卷积层
卷积就是输入和卷积核之间的内积运算#xff0c;如下图#xff1a; 容易发现#xff0c;卷积神经网… 机器学习深度学习——torch.nn模块 卷积层池化层激活函数循环层全连接层 torch.nn模块包含着torch已经准备好的层方便使用者调用构建网络。 卷积层
卷积就是输入和卷积核之间的内积运算如下图 容易发现卷积神经网络中通过输入卷积核来进行卷积操作使输入单元图像或特征映射和输出单元特征映射之间的连接时稀疏的能够减少需要的训练参数的数量从而加快网络计算速度。 卷积的分类如下所示大体分为一维卷积、二维卷积、三位卷积以及转置卷积简单理解为卷积操作的逆操作
层对应的类功能作用torch.nn.Conv1d()针对输入信号上应用1D卷积torch.nn.Conv2d()针对输入信号上应用2D卷积torch.nn.Conv3d()针对输入信号上应用3D卷积torch.nn.ConvTranspose1d()在输入信号上应用1D转置卷积torch.nn.ConvTranspose2d()在输入信号上应用2D转置卷积torch.nn.ConvTranspose3d()在输入信号上应用3D转置卷积
以torch.nn.Conv2d()为例介绍卷积在图像上的使用方法其调用方式为
torch.nn.Conv2d(in_channels,outchannels,kernel_size,stride1,padding0,dilation1,groups1,biasTrue)直接说前面三个参数吧这三个是必选的参数其他的参数作用可以看下面的这个文章 torch.nn.Conv2d() 用法讲解 必选参数 in_channels输入的通道数目 out_channels输出的通道数目 kernel_size卷积核的大小类型为int或元组当卷积为方形时只需要一个整形边长即可否则要输入一个元组表示高和宽 现在我们针对一个二维图像来做卷积并观察结果
import torch
import torch.nn as nn
import matplotlib.pyplot as plt
import numpy as np
from PIL import Image# 使用PIL包读取图像数据使用matplotlib包来可视化图像和卷积后的结果
# 读取图像-转化为灰度图像-转化为Numpy数组
myim Image.open(data/chap2/yier.jpg)
myimgray np.array(myim.convert(L), dtypenp.float32)
# 可视化图片
plt.figure(figsize(6, 6))
plt.imshow(myimgray, cmapplt.cm.gray)
plt.axis(off)
# plt.show()# 上述操作得到一个512×512的数组在卷积前需要转化为1×1×512×512的张量
imh, imw myimgray.shape
myimgray_t torch.from_numpy(myimgray.reshape(1, 1, imh, imw))
# print(myimgray_t.shape)# 卷积时需将图像转化为四维来表示[batch,channel,h,w]卷积后得到两个特征映射
# 第一个特征映射使用图像轮廓提取卷积核获取第二个特征映射使用的卷积核为随机数
# 卷积核大小为5×5且不使用0填充则卷积后输出特征映射的尺寸为508×508
# 下面进行卷积且对卷积后的两个特征映射进行可视化kersize 5 # 定义边缘检测卷积核并将维度处理为1*1*5*5
ker torch.ones(kersize, kersize, dtypetorch.float32) * -1
ker[2, 2] 24
ker ker.reshape((1, 1, kersize, kersize))
# 此时ker矩阵为
# tensor([[[[-1., -1., -1., -1., -1.],
# [-1., -1., -1., -1., -1.],
# [-1., -1., 24., -1., -1.],
# [-1., -1., -1., -1., -1.],
# [-1., -1., -1., -1., -1.]]]])
# 用意还是很好理解的如果不再边缘上那么乘积之和就是0否则看结果正负也容易知道边缘所在的大概位置# 进行卷积操作
conv2d nn.Conv2d(1, 2, (kersize, kersize), biasFalse)
# 设置卷积时使用的核第一个核使用边缘检测核
conv2d.weight.data[0] ker
# 对灰度图像进行卷积操作
imconv2dout conv2d(myimgray_t)
# 对卷积后的输出进行维度压缩
imconv2dout_im imconv2dout.data.squeeze()
# print(imconv2dout_im.shape)
# 可视化卷积后的图像
plt.figure(figsize(12, 12))
plt.subplot(2, 2, 1)
plt.imshow(myim)
plt.axis(off)
plt.subplot(2, 2, 2)
plt.imshow(myimgray, cmapplt.cm.gray)
plt.axis(off)
plt.subplot(2, 2, 3)
plt.imshow(imconv2dout_im[0], cmapplt.cm.gray)
plt.axis(off)
plt.subplot(2, 2, 4)
plt.imshow(imconv2dout_im[1], cmapplt.cm.gray)
plt.axis(off)
plt.show()结果 可以看出使用的边缘特征提取卷积核很好地提取出了图像的边缘信息。而使用随机数的卷积核得到的卷积结果与原始图像很相似。
池化层
池化的一个重要目的是对卷积后得到的特征进行进一步处理主要是降维池化层可以对数据进一步浓缩从而缓解内存压力。 池化会选取一定大小区域将该区域内的像素值用一个代表元素表示如下图表示滑动窗口2×2且步长为2时的最大值池化和平均值池化 在pytorch中有多种池化的类分别是最大值池化MaxPool、最大值池化的逆过程MaxUnPool、平均值池化AvgPool与自适应池化AdaptiveMaxPool、AdaptiveAvgPool等且都提供了一二三维的池化操作。 如果对上一个卷积后的图像进行池化并且使用步长为2的最大值池化或平均值池化以后所得到的尺寸将会变为254×254。 如果使用nn.AdaptiveAvgPool2d()函数构造时可以指定其池化后的大小。 池化后特征映射的尺寸变小图像变得更模糊。
激活函数
下面的一些函数感觉也都是很基础的一些关于双曲正余弦函数、双曲正切函数、梯度的概念给搞懂了就没什么问题。
层对应的类功能torch.nn.SigmoidSigmoid激活函数torch.nn.TanhTanh激活函数torch.nn.ReLUReLU激活函数torch.nn.SoftplusReLU激活函数的平滑近似
torch.nn.Sigmoid() 其对应的Sigmoid激活函数又叫logistic激活函数 f ( x ) 1 1 e − x f(x)\frac{1}{1e^{-x}} f(x)1e−x1 其输出在(0,1)这个开区间内该函数在神经网络早期也是很常用的激活函数之一但是当输入远离坐标源点时函数的梯度就会变得很小几乎为0因此会影响参数的更新速度 torch.nn.Tanh() 对应双曲正切函数 f ( x ) e x − e − x e x e − x f(x)\frac{e^x-e^{-x}}{e^xe^{-x}} f(x)exe−xex−e−x 其输出区间在(-1,1)之间整个函数以0为中心虽然与Sigmoid一样当输入很大或很小时梯度很小不利于权重的更新但毕竟是以0为对称使用效果会比Sigmoid好很多 torch.nn.ReLU() 其对应的ReLU函数又叫修正线性单元计算方式为 f ( x ) m a x ( 0 , x ) f(x)max(0,x) f(x)max(0,x) 其只保留大于0的输出。而在输入正数时不会存在梯度饱和的问题计算速度会更快而且因为ReLU函数只有线性关系所以不管是前向传播还是反向传播都很快。 torch.nn.Softplus() 对应的平滑近似ReLU的激活函数计算公式 f ( x ) 1 β l o g ( 1 e β x ) f(x)\frac{1}{β}log(1e^{βx}) f(x)β1log(1eβx) β默认为1。这个函数可以在任何位置求导数且尽可能保留了ReLU函数的优点。
循环层
pytorch提供三种循环层实现
层对应的类功能torch.nn.RNN()多层RNN单元torch.nn.LSTM()多层长短期记忆LSTM单元torch.nn.GRU()多层门限循环GRU单元torch.nn.RNNCell()一个RNN循环层单元torch.nn.LSTMCell()一个长短期记忆LSTM单元torch.nn.GRUCell()一个门限循环GRU单元
几个循环层函数的原理将在之后更新。
全连接层
指一个由多个神经元所组成的层其所有的输出和该层的所有输入都有连接即每个输入都会影响所有神经元的输出。 在pytorch中nn.Linear()表示线性变换全连接层可以看作是nn.Linear()表示线性变层再加上一个激活函数层所构成的结构。 nn.Linear()全连接操作及相关参数 torch.nn.Linear(in_features,out_features,biasTrue) 参数说明如下 in_feature每个输入样本的特征数量 out_feature每个输出样本的特征数量 bias若设置为False则该层不会设置偏置默认为True
torch.nn.Linear()的输入为(N,in_feature)的张量输出为(N,out_feature)的张量。 全连接层的应用广泛只有全连接层组成的网络是全连接神经网络可用于数据的分类或回归预测卷积神经网络和循环神经网络的末端通常多个连接层组成。