网站建设需要哪些人才,乾县做网站,书店网站建设网站栏目结构,设计师网络叫法深度学习网络通常具有很深的层次结构#xff0c;而且层与层之间通常会有并联、串联等连接方式。当使用PyTorch建立一个深度学习网络并输出文本向读者展示网络的连接方式是非常低效的#xff0c;所以需要有效的工具将建立的深度学习网络结构有层次化的展示#xff0c;这就需要…深度学习网络通常具有很深的层次结构而且层与层之间通常会有并联、串联等连接方式。当使用PyTorch建立一个深度学习网络并输出文本向读者展示网络的连接方式是非常低效的所以需要有效的工具将建立的深度学习网络结构有层次化的展示这就需要使用相关的深度学习网络结构可视化库。
3.1 准备网络
import torch
import torch.nn as nn
import torchvision
import torchvision.utils as vutils
from torch.optim import SGD
import torch.utils.data as Data
from sklearn.metrics import accuracy_score
import matplotlib.pyplot as plt
下面导入手写字体数据并将数据处理为数据加载器train_datatorchvision.datasets.MNIST(root./Dataset,trainTrue,#将数据转化为torch使用的张量取值范围为[0-1]transformtorchvision.transforms.ToTensor(),downloadFalse#因为数据已经下载过所以这里不在下载)
#定义一个数据加载器
train_loaderData.DataLoader(datasettrain_data,#使用的数据集batch_size128,#批处理样本大小shuffleTrue,num_workers0
)
#准备需要的测试集
test_datatorchvision.datasets.MNIST(root./Dataset,trainFalse,downloadFalse
)
#为数据添加一个通道维度并且取值范围缩放到[0-1]之间
test_data_xtest_data.data.type(torch.FloatTensor)/255.0
test_data_xtorch.unsqueeze(test_data_x,dim1)
test_data_ytest_data.targets#测试集的标签
print(test_data_x.shape)
print(test_data_y.shape)(1)针对训练集使用torchvision.datasets.MNIST()函数导入数据
并将其像素值转化到0~1之间然后使用Data.DataLoader()函数定义一个数据加载器
每个batch包含128张图像。
(2)针对测试数据同样使用torchvision.datasets.MNIST()函数导入数据
但不将数据处理为数据加载器而是将整个测试集作为一个batch方便计算模型在测试集上的预测精度。#搭建一个卷积神经网络
class ConvNet(nn.Module):def __init__(self):super(ConvNet,self).__init__()#定义第一个卷积层self.conv1nn.Sequential(nn.Conv2d(in_channels1,#输入的feature_mapout_channels16,#输出的feature_mapkernel_size3,#卷积核尺寸stride1,#卷积核步长padding1,#进行填充),nn.ReLU(),#激活函数nn.AvgPool2d(kernel_size2,#平均值池化层,使用2*2stride2,#池化步长为2),)#定义第二个卷积层self.conv2nn.Sequential(nn.Conv2d(16,32,3,1,1),nn.ReLU(),#激活函数nn.MaxPool2d(2,2)#最大值池化)#定义全连接层self.fcnn.Sequential(nn.Linear(in_features32*7*7,#输入特征out_features128#输出特征),nn.ReLU(),#激活层nn.Linear(128,64),#nn.ReLU()#激活层)self.outnn.Linear(64,10)#最后的分类层def forward(self,x):xself.conv1(x),xself.conv2(x),xx.view(x.size(0),-1),#展平多维的卷积图层xself.fc(x),outputself.out(x),return output
myConvNetConvNet()
3.2 网络结构的可视化---PytorchViz
从定义网络和网络的输出可以看出在myConvNet网络结构中共包含两个使用nn.Sequential()函数连接的卷积层即conv1和conv2每个层都包含有卷积层、激活函数层和池化层。在fc层中包含两个全连接层和激活函数层out层则由一个全连接层构成。通过文本输出myConvNet网络的网络结构得到上面的输出结果但这并不容易让读者理解在网络中层与层之间的连接方式所以需要将PyTorch搭建的深度学习网络进行可视化通过图像来帮助读者理解网络层与层之间的连接方式。PyTorchViz库是一个可视化网络结构的库学习和了解这些库对网络结构进行可视化,可以帮助我们查看、理解所搭建深度网络的结构。
from torchviz import make_dot
xtorch.randn(1,1,28,28).requires_grad_(True)
ymyConvNet(x)
#make_dot用来得到网络的可视化图像
myConvNetsmake_dot(y,paramsdict(list(myConvNet.named_parameters())[(x,x)]))
myConvNets.formatpng#指定可视化图像的格式
myConvNets.directorymodel_graph/#指定图像保存的文件夹
myConvNets.view()
得到的图像如下图所示 3.3 训练过程可视化---TensorboardX
网络结构可视化主要是帮助使用者理解所搭建的网络或检查搭建网络时存在的错误。而网络训练过程的可视化通常用于监督网络的训练过程或呈现网络的训练效果。tensorboardX是帮助pytorch使用tensornoard工具来可视化的库在tensorboardX库中提供了多种向tensorboard中添加事件的函数。
函数功能用法SummaryWriter()创建编写器保存日志writerSummaryWriter()writer.add_scalar()添加标量writer.add_scalar(myscalar,value,iteration)writer.add_image()添加图像writer.add_image(imresult,x,iteration)writer.add_histogram()添加直方图writer.add_histogram(hist,array,iteration)writer.add_graph(添加网络结构writer.add_graph(model,input_to_modelNone)writer.add_audio()添加音频add_audio(tag,audio,iteration,sample_rate)writer.add_text()添加文本writer.add_text(tag,text_string,global_stepNone)
下面针对建立好的MNIST手写字体识别网络使用rensorboardX库对网络在训练过程中的损失函数的变化情况、精度变化情况、权重分布等内容进行可视化程序如下
from tensorboardX import SummaryWriter
SumWriterSummaryWriter(log_dir./log)#日志保存路径
#定义优化器
optimizertorch.optim.Adam(myConvNet.parameters(),lr0.003)
#定义损失函数
loss_funcnn.CrossEntropyLoss()
train_loss0
print_step100#每经过100次迭代输出损失
#对模型进行迭代训练对所有的数据训练epoch轮
for epoch in range(5):#对训练数据的加载器进行迭代计算for step,(b_x,b_y) in enumerate(train_loader):#计算每个batch上的损失outputmyConvNet(b_x)lossloss_func(output,b_y)#交叉熵损失函数optimizer.zero_grad()#每个迭代步的梯度初始化为0loss.backward()#损失后向传播optimizer.step()#使用梯度进行优化train_losstrain_lossloss#计算累加损失niterepoch*len(train_loader)step1#计算迭代次数#计算每经过print_step次迭代后的输出if niter % print_step0:#为日志添加训练集损失函数SumWriter.add_scalar(train loss,train_loss.item() / niter,global_stepniter)#计算在测试集上的精度outputmyConvNet(test_data_x)_,pre_labtorch.max(output,1)accaccuracy_score(test_data_y,pre_lab)#为日志添加测试集上的预测精度SumWriter.add_scalar(test acc,acc.item(),niter)#为日志中添加训练数据的可视化图像使用当前batch的图像#将一个batch的数据进行预处理b_x_imvutils.make_grid(b_x,nrow12)SumWriter.add_image(train image sample,b_x_im,niter)#使用直方图可视化网络中参数的分布情况for name,param in myConvNet.named_parameters():SumWriter.add_histogram(name,param.data.numpy(),niter)
在网络训练完毕之后会得到网络的训练过程文件该文件的可视化结果可以通过tensorboard可视化工具进行查看。 日志文件保存路径在conda环境下执行tensorboard --logdir文件路径 成功后tensorboard会返回一个本地网址链接浏览器打开该链接即可查看到可视化界面 3.5 Visdom可视化
Visdom库中包含多种用于可视化图像的接口
可视化函数功能描述vis.image可视化一张图像vis.image可视化一个batch的图像或者一个图像列表vis.text可视化文本vis.audio用于播放音频vis.matplot可视化Matplotlib的图像vis.scatter2D或者3D的散点图vis.line线图vis.stem茎叶图vis.heatmap热力图vis.bar条形图vis.histogram直方图vis.boxplot盒形图vis.surf曲面图vis.contour等高线图vis.quiver箭头图vis.video播放音频vis.mesh网格图
下面使用具体的数据集进行可视化图像
import numpy as np
import torch
from visdom import Visdom
from sklearn.datasets import load_iris
iris_x,iris_yload_iris(return_X_yTrue)
print(iris_x.shape)
print(iris_y.shape)上面的程序导入了鸢尾花数据集包含3类数据150个样本每个样本包含4个特征。visVisdom()
#2D散点图
vis.scatter(iris_x[:,0:2],Yiris_y1,winwindows1,envmain)
#3D散点图
vis.scatter(iris_x[:,0:3],Yiris_y1,win3D 散点图,envmain,optsdict(markersize4,xlabel特征一,ylabel特征二))程序中使用vis Visdom()初始化一个绘图对象通过vis.scatter()为对象添加散点图。
在该函数中如果输入的X为二维则可得到2D散点图如果输入的X为三维则可得到3D散点图
其中参数Y用于指定数据的分组情况,参数win指定图像的窗口名称参数env则指定图像所在的环境。
可以发现两幅图像都在主环境main中。图像的其他设置可使用opts参数通过字典的形式设置。
在上述初始化的可视化图像环境main中继续添加其他窗口以绘制不同类型的图像如添加折线图.#添加折线图
xtorch.linspace(-6,6,100).view((-1,1))
sigmoidtorch.nn.Sigmoid()
sigmoidysigmoid(x)
tanhtorch.nn.Tanh()
tanhytanh(x)
relutorch.nn.ReLU()
reluyrelu(x)
#连接3个张量
plotytorch.cat((sigmoidy,tanhy,reluy),dim1)
plotxtorch.cat((x,x,x),dim1)
vis.line(Yploty,Xplotx,winline plot,envmain,optsdict(dashnp.array([solid,dash,dashdot]),legend[Sigmoid,Tanh,ReLU]))上面的程序中可视化出了sigmoid、Tanh和ReLU三种激活函数的图像。
在可视化折线时使用vis.line()函数进行绘图图像在环境main中
通过win参数指定窗口名称为line plot然后通过opts参数为不同的线设置了不同的线型。#添加茎叶图
xtorch.linspace(-6,6,100).view((-1,1))
y1torch.sin(x)
y2torch.cos(x)
#连接2个变量
plotxtorch.cat((y1,y2),dim1)
plotytorch.cat((x,x),dim1)
vis.stem(Xplotx,Yploty,winstem plot,envmain,#设置图例optsdict(legend[sin,cos],title茎叶图) )上面的程序中可视化出了正弦和余弦函数的茎叶图。
在可视化时通过vis.stem()函数绘图图像在环境main中
通过win参数指定窗口名称为stem plot然后通过opts参数为图像添加图例和标题。#添加热力图
iris_corrtorch.from_numpy(np.corrcoef(iris_x,rowvarFalse))
vis.heatmap(iris_corr,winheatmap,envmain,#设置每个特征的名称optsdict(rownames[x1,x2,x3,x4],columnnames[x1,x2,x3,x4],title热力图))程序中可视化出了鸢尾花数据集中4个特征的相关系数热力图。
在可视化时通过vis.heatmap()函数进行绘图图像在环境main中
通过win参数指定窗口名称为heatmap然后通过opts参数为图像添加X轴的变量名称、Y轴变量名称和标题。注意在使用visdom可视化图像之前应该在命令行激活visdom服务否则程序报错 python -m visdom.server 命令执行成功后会返回一个本地链接 http://localhost:8097
然后在pycharm中执行代码再用浏览器打开上述链接即可得到下面的可视化图像