pytorch --tensorboardX可视化的使用

标签: pytorch  tensorboard  神经网络

直接上中点
当然了,我们想要在pytorch中使用tensorboardX你需要先安装这些依赖
我在安装的过程中也遇到了一些小问题,基本上都是一些安装依赖版本的问题。

pip install tensorflow==1.13.2

因为tensorboardX是tensorflow下的一个依赖,所以安装这个需要先安装tensorflow,在安装tensorflow会一起安装上tensorboard,一起安装tensorboard的版本应该也是1.13.几的版本吧,我也记得不是很清楚,
然后安装tensorboardX

pip install tensorboardX

然后所需要的依赖就安装完成了,接下来的就是重头戏了
tensorboardX的基本可视化是非常简单的,只需要在你训练脚本中添加几行代码就可以实现,

#-------------------------------------#
#       对数据集进行训练
#-------------------------------------#
import os
import numpy as np
import time
import torch
from torch.autograd import Variable
import torch.nn as nn
import torch.optim as optim
import torch.nn.functional as F
import torch.backends.cudnn as cudnn
from utils.config import Config
from nets.yolo_training import YOLOLoss,Generator
from nets.yolo3 import YoloBody
from matplotlib import pyplot as plt
from tensorboardX import SummaryWriter
import torchvision.models.densenet
def get_lr(optimizer):
    for param_group in optimizer.param_groups:
        return param_group['lr']
def plot_curve(data):
    #fig = plt.figure()
    plt.plot(range(len(data)), data, color='blue')
    plt.legend(['value'], loc='upper right')
    plt.xlabel('step')
    plt.ylabel('value')
    plt.show()
def fit_ont_epoch(net,yolo_losses,epoch,epoch_size,epoch_size_val,gen,genval,Epoch):
    total_loss = 0
    val_loss = 0
    for iteration in range(epoch_size):
        start_time = time.time()
        images, targets = next(gen)#这里对原始的图片和框子进行了预处理
        with torch.no_grad():
            images = Variable(torch.from_numpy(images).cuda().type(torch.FloatTensor))
            targets = [Variable(torch.from_numpy(ann).type(torch.FloatTensor)) for ann in targets]

        optimizer.zero_grad()
        outputs = net(images)
        losses = []
        for i in range(3):#这里是计算三层yolo的损失
            loss_item = yolo_losses[i](outputs[i], targets)
            losses.append(loss_item[0])
        loss = sum(losses)
        loss.backward()
        optimizer.step()

        # 将loss写入tensorboard,每一步都写
        writer.add_scalar('Train_loss', loss, (epoch * epoch_size + iteration))
        total_loss += loss
        waste_time = time.time() - start_time
        print('\nEpoch:'+ str(epoch+1) + '/' + str(Epoch))
        print('iter:' + str(iteration) + '/' + str(epoch_size) + ' || Total Loss: %.4f || %.4fs/step' % (total_loss/(iteration+1),waste_time))

    print('Start Validation')
    for iteration in range(epoch_size_val):
        images_val, targets_val = next(gen_val)

        with torch.no_grad():
            images_val = Variable(torch.from_numpy(images_val).cuda().type(torch.FloatTensor))
            targets_val = [Variable(torch.from_numpy(ann).type(torch.FloatTensor)) for ann in targets_val]
            optimizer.zero_grad()
            outputs = net(images_val)
            losses = []
            for i in range(3):
                loss_item = yolo_losses[i](outputs[i], targets_val)
                losses.append(loss_item[0])
            loss = sum(losses)
            val_loss += loss
    print('Finish Validation')
    print('\nEpoch:'+ str(epoch+1) + '/' + str(Epoch))
    print('Total Loss: %.4f || Val Loss: %.4f ' % (total_loss/(epoch_size+1),val_loss/(epoch_size_val+1)))

    print('Saving state, iter:', str(epoch+1))
    torch.save(model.state_dict(), 'logs/Epoch%d-Total_Loss%.4f-Val_Loss%.4f.pth'%((epoch+1),total_loss/(epoch_size+1),val_loss/(epoch_size_val+1)))


if __name__ == "__main__":
    # 参数初始化
    annotation_path = '2007_train.txt'
    model = YoloBody(Config)#传入的是config,里边有框子和类别和输入网络的图片大小
    #model输出的是构建好的所有层,包括最后18通道的卷积
    # print(model)
    print('Loading weights into state dict...')
    model_dict = model.state_dict()

    pretrained_dict = torch.load("model_data/mobilenet_v2-b0353104.pth")
    pretrained_dict1 = {}
    for k, v in list(pretrained_dict.items())[:-8]:
        #print(k)
        if np.shape(model_dict["backbone."+ k]) == np.shape(v):
            pretrained_dict1["backbone."+ k] = v
            #print("it ok")
    # pretrained_dict = {k: v for k, v in pretrained_dict.items() if np.shape(model_dict[k]) ==  np.shape(v)}
    model_dict.update(pretrained_dict1)
    model.load_state_dict(model_dict)
    print('Finished!')


    # pretrained_dict = {k: v for k, v in pretrained_dict.items() if np.shape(model_dict[k]) ==  np.shape(v)}
    # model_dict.update(pretrained_dict)
    # model.load_state_dict(model_dict)

    net = model
    #设置gpu运行的各种参数
    net = torch.nn.DataParallel(model)#加载gpu训练,括号中还有其他参数,比如指定cuda1
    cudnn.benchmark = True
    net = net.cuda()

    # 建立loss函数一共三个,猜测因为有三个yolo层,所以要有三个损失计算
    yolo_losses = []
    for i in range(3):
        yolo_losses.append(YOLOLoss(np.reshape(Config["yolo"]["anchors"],[-1,2]),
                                    Config["yolo"]["classes"], (Config["img_w"], Config["img_h"])))

    # 0.1用于验证,0.9用于训练
    val_split = 0.1
    with open(annotation_path) as f:
        lines = f.readlines()
    np.random.seed(10101)
    np.random.shuffle(lines)
    np.random.seed(None)
    num_val = int(len(lines)*val_split)
    num_train = len(lines) - num_val

    writer = SummaryWriter(log_dir='logs', flush_secs=60)
    Cuda = True
    if Cuda:
        graph_inputs = torch.from_numpy(np.random.rand(1, 3, Config["img_w"], Config["img_h"])).type(
            torch.FloatTensor).cuda()
    else:
        graph_inputs = torch.from_numpy(np.random.rand(1, 3, Config["img_w"], Config["img_h"])).type(torch.FloatTensor)
    writer.add_graph(model, (graph_inputs,))

    if True:
        lr = 1e-3
        Batch_size = 8
        Init_Epoch = 0
        Freeze_Epoch = 14
        
        optimizer = optim.Adam(net.parameters(),lr)
        lr_scheduler = optim.lr_scheduler.StepLR(optimizer,step_size=1,gamma=0.95)
        #创建一个对象,将类中的参数初始化,这个貌似属于函数的多态
        gen = Generator(Batch_size, lines[:num_train],
                        (Config["img_h"], Config["img_w"])).generate()
        gen_val = Generator(Batch_size, lines[num_train:],
                        (Config["img_h"], Config["img_w"])).generate()
                        
        epoch_size = num_train//Batch_size#一共的数据/每次训练的数据=一共需要训练多少次
        epoch_size_val = num_val//Batch_size#测试的次数
        #------------------------------------#
        #   冻结一定部分训练
        #------------------------------------#
        # for i in model.backbone.features:
        #     print(i)
        for param in model.backbone.features.parameters():
            param.requires_grad = False
            #print("11")
        for epoch in range(Init_Epoch,Freeze_Epoch):
            fit_ont_epoch(net,yolo_losses,epoch,epoch_size,epoch_size_val,gen,gen_val,Freeze_Epoch)
            lr_scheduler.step()

这个是我自己代码的训练脚本,主要改动的地方我标注一下,你们可以从代码中找到,复制到你们的train.py中就妥了,
在这里插入图片描述
从代码中找到这一块代码,这一部分是初始化部分,将它放到你初始化代码区,就是没有进入for循环的代码段,首先

writer = SummaryWriter(log_dir='logs', flush_secs=60)

是初始化writer对象,参数中log_dir='logs’指的是你将tensorboardx产生的文件存放的位置,flush_secs=60是60S保存一次,

Cuda = True
    if Cuda:
        graph_inputs = torch.from_numpy(np.random.rand(1, 3, Config["img_w"], Config["img_h"])).type(
            torch.FloatTensor).cuda()
    else:
        graph_inputs = torch.from_numpy(np.random.rand(1, 3, Config["img_w"], Config["img_h"])).type(torch.FloatTensor)
    writer.add_graph(model, (graph_inputs,))

这段是给writer对象指定一个输入,graph_inputs 是产生一个按照pytorch要求给出的一个四维输入,然后按照add_graph方法将模型和输入进行写入文件。是不是很nice

writer.add_scalar('Train_loss', loss, (epoch * epoch_size + iteration))

然后是找到这段代码,这段代码在fit_ont_epoch函数中,你可以找一下,fit_ont_epoch这个函数是我脚本进行for循环的函数,所以可想而知,上面这行代码是放在循环迭代中的,这三个参数中Train_loss是生成图表的标题,loss就是数值,手边一堆是图表横坐标的值,这就完事了,然后你就可以开始训练你的模型了,
开始训练之后,在你的项目指定存储文件中就会产生一个
在这里插入图片描述
类似于这样的文件,这个文件就是在当时你指定存储位置中
在这里插入图片描述
就是这个代码指定的,dir不是路径的意思么,都懂。
运行了网络之后,你需要打开命令行来得到网址来查看你的训练参数,因为这个服务是在网站上进行的
打开你的命令行之后输入

>tensorboard --logdir=D:\桌面\毕业论文相
关资料\yolo3-mobilenetv3-pytorch-master\logs

当然,tensorboard --logdir=这个是固定写法,但是后边 D:\桌面\毕业论文相
关资料\yolo3-mobilenetv3-pytorch-master\logs是你存放
在这里插入图片描述
的路径,我存放的路径就是那个,但是你需要改成你的,然后回车之后就会出现
在这里插入图片描述
出现这个说明已经成功了,将我箭头指向的网站复制到浏览器中打开就是这个东东了
在这里插入图片描述
这个是实时监控的,随着时间推移,loss就会不断变化,但是也不是所有浏览器都能打开这个网页,我的qq浏览器就打不来,用电脑自带的ie打开的,如果打不开你可以多试几个。

运行报错

在我装了那些依赖之后第一次使用是会报错的,基本上错误的原因都是包的版本对不上号,这个你可以将问题复制到网站上查一下,都是可以解决的,可能tensorboard的版本太低,让你换一个高版本的,可会遇到past错误,这个错误是需要安装一个包future

pip install future

然后你装上了基本上就ok了
我写这篇文章的时间是2020.09.12

版权声明:本文为qq_35741782原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_35741782/article/details/108548793

智能推荐

pytorch使用tensorboardX做可视化(二)特征图可视化

因为要对网络里的layer操作,所以网络层命名发生了一些改变 LeNet5.py show.py 结果:...

pytorch 使用tensorboardX可视化网络结构图

pytorch 使用tensorboardX可视化网络结构图 前提条件 使用方法 代码 使用 结果展示: 前提条件 安装tensorflow,tensorboardX,pytorch 使用方法 代码 使用 运行程序后: 生成类似下图中的文件夹,文件夹内有相应文件: 进到该文件夹所在目录: 执行下列命令: 这里需要注意下,有的博客里写的是–logdir=,是有问题的,之前的版本这样写没问...

Linux内核之进程调度3:进程调度

1. 吞吐率和响应 吞吐:单位时间内做的有用功; 响应:低延迟。 吞吐追求的整个系统CPU做有用功,响应追求的是某个特定任务的延迟低; 1GHZ的CPU切换线程保存恢复现场约几个微妙级别,看似消耗不了太多时间,但是由于系统的局部性原理,会保存当前线程数据的缓存,切换线程会打乱局部性引起cache miss,而CPU访问cache速度远大于内存访问,这样综合看来上下文切换花销还是很大的。无用功占用较...

restful+ci框架 实践

restful架构: 是就是目前最流行的一种互联网软件架构。它结构清晰、符合标准、易于理解、扩展方便,所以正得到越来越多网站的采用。具体理论请看我上一篇写的restful理论。本篇主要记录下关于restful的实践。 restful实践: 工具: 这次在ci框架+restful 主要文件: 在控制器中添加控制器类:Restful.php。 在头部包含REST_Controller.php文件并继承...

Configuration, ConfigurationProperties和EnableConfigurationProperties用法

最近刚刚解决了个错误,突然又发现这个类在spring容器中找不到, 于是我就加一个 @Component的注解,哈哈直接启动成功,那我如果吧这个注解去掉,加上一个@Configuration的注解呢,哈哈还是可以的,毕竟里面已经有这个@Component的注解了。所以我就整理下Configuration,ConfigurationProperties,EnableConfigurationProp...

猜你喜欢

备战蓝桥杯--贪心算法刷题整理5

翻硬币(贪心算法) 看了一下网上的题解,感觉挺强,网友的做题思想值得借鉴,这里分享一下网友的链接,同时再分享一下自己的解题方案 链接:https://blog.csdn.net/qq_34594236/article/details/60326782 题目描述: 小明正在玩一个“翻硬币”的游戏。 桌上放着排成一排的若干硬币。我们用 * 表示正面,用 o 表示反面(是小写字母...

部署高可用RabbitMQ

安装 准备工作 这里我们使用三个RabbitMQ节点: 开通端口(具体见官方文档): 安装ErLang和RabbitMQ Server 安装文档见:https://www.rabbitmq.com/install-rpm.html。 采用RPM包而不是Repo的安装命令如下(以下的版本号可根据实际情况修改): 安装管理插件 安装文档见:https://www.rabbitmq.com/manage...

Opencv常用代码总结

文章目录 读取显示图像 保存图片 查看图片信息 读取视频 截取部分图像数据 颜色通道提取、融合与保留 边界填充 数值计算 图像融合 图像阈值 图像平滑(降噪) 形态学-腐蚀操作 形态学-膨胀操作 开运算与闭运算 梯度运算 礼帽与黑帽 图像梯度 Sobel算子 Scharr算子 laplacian算子 Canny边缘检测 图像金字塔 高斯金字塔:向下采样(缩小) 高斯金字塔:向上采样(放大) 拉普拉...

Numpy实现LDA

LDA与PCA的区别如下表: LDA的原理如下: 代码实现如下,这里使用的a,b是Nx2的二维点集合,经过LDA后,二维的点变为一维。更高维度的也是可以做到的。函数里的dim是原始数据的维度,d是想要降到的维度。  初始的数据如下图,红色点和蓝色点代表不同的分类。 经过LDA后,投影的一维数值如下图所示。 可见LDA实现了降维,而且两种分类的间距较大,类内的散度较小。...

Java反射机制

相关类型:  java.lang.Class  java.lang.reflect.Constructor  java.lang.reflect.Field  java.lang.reflect.Method  java.lang.reflect.Modifier 作用:  1、反编译 .class –> .java&n...