文章插图
第二个错误,在解决第一个错误后,再次运行命令,还是报错,内容为编码出错 。由于笔者做过一点前端,在学习webpack项目时,曾经被告知项目路径不能含有中文,否则会有编码错误,而刚才的报错中涉及到了前端服务器的启动,因此,笔者想到从文件名入手 。
解决方法:确保命令涉及的文件路径、所有程序涉及到文件不含中文 。笔者是计算机名字含有中文,然后tensorboard的日志文件是以本地计算机名为后缀的,所以笔者将计算机名修改成了英文,重启后再输入指令就ok了 。
2.2 HiddenLayer可视化训练过程
tensorboard的图像很华丽,但是使用过程相较于其他的工具包较为繁琐,所以小网络一般没必要使用tensorboard 。
import hiddenlayer as hl import time # 记录训练过程的指标 history = hl.History() # 使用canvas进行可视化 canvas = hl.Canvas() # 获取优化器和损失函数 optimizer = torch.optim.Adam(MyConvNet.parameters(), lr=3e-4) loss_func = nn.CrossEntropyLoss() log_step_interval = 100 # 记录的步数间隔 for epoch in range(5): print("epoch:", epoch) # 每一轮都遍历一遍数据加载器 for step, (x, y) in enumerate(train_loader): # 前向计算->计算损失函数->(从损失函数)反向传播->更新网络 predict = MyConvNet(x) loss = loss_func(predict, y) optimizer.zero_grad() # 清空梯度(可以不写) loss.backward() # 反向传播计算梯度 optimizer.step() # 更新网络 global_iter_num = epoch * len(train_loader) + step + 1 # 计算当前是从训练开始时的第几步(全局迭代次数) if global_iter_num % log_step_interval == 0: # 控制台输出一下 print("global_step:{}, loss:{:.2}".format(global_iter_num, loss.item())) # 在测试集上预测并计算正确率 test_predict = MyConvNet(test_data_x) _, predict_idx = torch.max(test_predict, 1) # 计算softmax后的最大值的索引,即预测结果 acc = accuracy_score(test_data_y, predict_idx) # 以epoch和step为索引,创建日志字典 history.log((epoch, step), train_loss=loss, test_acc=acc, hidden_weight=MyConvNet.fc[2].weight) # 可视化 with canvas: canvas.draw_plot(history["train_loss"]) canvas.draw_plot(history["test_acc"]) canvas.draw_image(history["hidden_weight"])
不同于tensorboard,hiddenlayer会在程序运行的过程中动态生成图像,而不是模型训练完后
下面为模型训练的某一时刻的截图:
文章插图
三、使用Visdom进行可视化
Visdom是Facebook为pytorch开发的一块可视化工具 。类似于tensorboard,visdom也是通过在本地启动前端服务器来实现可视化的,而在具体操作上,visdom又类似于matplotlib.pyplot 。所以使用起来很灵活 。
首先先安装visdom库,然后补坑 。由于启动前端服务器需要大量依赖项,所以在第一次启动时可能会很慢(需要下载前端三板斧的依赖项),解决方法请见这里 。
先导入需要的第三方库:
from visdom import Visdom from sklearn.datasets import load_iris import torch import numpy as np from PIL import Image
matplotlib里,用户绘图可以通过plt这个对象来绘图,在visdom中,同样需要一个绘图对象,我们通过vis = Visdom()来获取 。具体绘制时,由于我们会一次画好几张图,所以visdom要求用户在绘制时指定当前绘制图像的窗口名字(也就是win这个参数);除此之外,为了到时候显示的分块,用户还需要指定绘图环境env,这个参数相同的图像,最后会显示在同一张页面上 。
绘制线图(相当于matplotlib中的plt.plot)
# 绘制图像需要的数据 iris_x, iris_y = load_iris(return_X_y=True) # 获取绘图对象,相当于plt vis = Visdom() # 添加折线图 x = torch.linspace(-6, 6, 100).view([-1, 1]) sigmoid = torch.nn.Sigmoid() sigmoid_y = sigmoid(x) tanh = torch.nn.Tanh() tanh_y = tanh(x) relu = torch.nn.ReLU() relu_y = relu(x) # 连接三个张量 plot_x = torch.cat([x, x, x], dim=1) plot_y = torch.cat([sigmoid_y, tanh_y, relu_y], dim=1) # 绘制线性图 vis.line(X=plot_x, Y=plot_y, win="line plot", env="main", opts={ "dash" : np.array(["solid", "dash", "dashdot"]), "legend" : ["Sigmoid", "Tanh", "ReLU"] })
绘制散点图:
推荐阅读
- 世界上最好的编程语言PHP和Facebook的感情经历
- XDP的重定向工作原理
- 决定转行的互联网大厂人,都去哪了?
- 小狗的名字吉祥招财微信图片 小狗的名字吉祥招财微信
- 怎么形容小孩子爱说谎的句子 怎么形容小孩子爱说谎
- 如何才能更符合今日头条的推送机制?获得头条更多展示量的方法
- 爱说谎的孩子该怎么办教案 爱说谎的孩子该怎么办
- 盘点那些高危却又不得不用的Linux命令
- 孩子不懂感恩的句子 孩子不懂感恩的话怎么说
- 面对不懂感恩的孩子怎么办教案