pytorch 怎么用tensorboard 可视化

参考链接:

https://mp.weixin.qq.com/s?__biz=MzI5MDUyMDIxNA==&mid=2247514888&idx=2&sn=3884cf50b88eaee6744d35cb528c0fa7&chksm=ec1c56f1db6bdfe7585830d13a3673648c1b9f5098af15d53e4efb96e16a1b22003b1b56ba43&mpshare=1&scene=1&srcid=1103IwBjWjTF3h8l3Smh5ohu&sharer_sharetime=1604478585079&sharer_shareid=3839dc73cba9ba6f5a6eb2fee58f300f&key=966b233910e1aa6df0e367067aa3169852053729d9052e5342c78c9521b069153beb74b5e5136bf692087ad3f33b8e74113962a2cb47ef61279a45edfb79e1a1f8e2a1f99ffb03b137b906f25ce6b92abd156e73faa83b558301cfaf0612deeca4803458512fba340ae9f489ef073cf96c4031c2bd491bf7f53d3a58c3d2cc62&ascene=1&uin=MjAyMjA0NjY3MA%3D%3D&devicetype=Windows+10+x64&version=6300002f&lang=zh_CN&exportkey=AwmXeExcmzVZ1BaQZJvCJ3o%3D&pass_ticket=jMBlpDzYyeU7%2BXpQJxN0X6ddKC13bpbPaoJh%2FjGTz2GR%2BAB4Bu7Rui39ieh3Oxic&wx_header=0

https://blog.csdn.net/bigbennyguo/article/details/87956434

https://blog.csdn.net/zouxiaolv/article/details/105192739

 https://pytorch.apachecn.org/docs/1.2/tensorboard.html

https://gist.github.com/anonymous/bf16430f7750c023141c562f3e9f2a91

https://github.com/lanpa/tensorboardX/blob/master/README.md

https://blog.csdn.net/goldxwang/article/details/76855200  Matplotlib调用imshow()函数绘制热图

首先进行环境的配置

我的基本环境:ubuntu 16   py3.6

 

安装对应的tensorboard  tensorboard X ,还有tensorflow-gpu

具体的方法可参考本文开头的第一篇链接

如果出现

启动Tensorboard时发生错误:class BeholderHook(tf.estimator.SessionRunHook): AttributeError: module 'tensorflow.python.estimator.estimator_lib' has no attribute 'SessionRunHook'

主要原因是tensorflow 和tensorboard的版本不一致(要做到上面截图红线所示)

如果出现

cl@gxz:~/visual$ python test.py
[W common_gpu.cc:35] Insufficient cuda driver. Cannot use cuda.

这是因为cuda 和torch 的版本不对应,具体可参考https://www.cnblogs.com/tingtin/p/13900424.html

具体实现过程:

1.

  代码:

from tensorboardX import SummaryWriter

# Creates writer1 object.
# The log will be saved in 'runs/exp'
writer1 = SummaryWriter('runs/exp1')


for i in range(10):
    writer1.add_scalar('quadratic', i**2, global_step=i)
    writer1.add_scalar('exponential', 2**i, global_step=i)

需要先运行代码,生成

 2.命令行执行:tensorboard --logdir=<your_log_dir>  #这里需要注意your_log_dir 为

writer1 = SummaryWriter('runs/exp1')
此时的tensorboard --logdir='runs/exp1'

来开启tensorboard 

3.那么现在可以在浏览器地址栏输入相应地址

如果是服务器需要服务器地址+端口号  ,如:http://192.1.27.110:6006/

如果输入相关地址后没反应,可以参考 https://blog.csdn.net/index20001/article/details/82871634

注意:这里的  Smoothing =0 ,不然会在一幅图上显示2条曲线

 很容易发现上图没有对应的label,也就是希望下图的

 要实现上图,可以在windows环境下

前提:已经得到数据,然后用曲线表示

import requests
import bs4
import re
import time
import xlwt
import xlrd
import telnetlib
import urllib
import matplotlib
# matplotlib.use('Agg')
from bs4 import BeautifulSoup
from urllib import request
from urllib.request import urlopen
# from tensorboardX import SummaryWriter
# from my_fake_useragent import UserAgent
import matplotlib.pyplot as plt
import matplotlib as mpl
import numpy as np
xlsx_path='.psnr+60.xlsx'
data_xsls = xlrd.open_workbook(xlsx_path)
sheet_name = data_xsls.sheets()[0]
count_nrows = sheet_name.nrows  #获取总行数
x1 = []
x2 = []
x3= []
y1 =[]
y2 = []
y3 = []
for i in range(1,count_nrows):
    y1.append(sheet_name.cell(i,1).value)  #根据行数来取对应列的值,并添加到字典中
    y2.append(sheet_name.cell(i, 2).value)
    y3.append(sheet_name.cell(i, 3).value)
    x1.append(i)
    x2.append(i)
    x3.append(i)


plt.figure()
plt.plot(x1, y1, color='red', label='middlebury')
plt.plot(x2, y2, color='black', label='KITTI2012')
plt.plot(x3, y3, color='blue', label='KITTI2015')

plt.xlabel('Steps',fontsize=20)
plt.ylabel('PSNR',fontsize=20)
plt.legend(fontsize=16)
plt.show()

但是add_iamge() 能够接受的格式是[C,H,W], 范围[0,1],C<=4,数据类型tensor.FloatTensor。

 以一副图展示C张图片

#多通道特征图可视化
        # print(' buffer_left:size', buffer_left.shape)
        # print(' buffer_right:size', buffer_right.shape)#[B,C,H,W]
        # print(' buffer_left[0]:size', buffer_left[0].shape)#[C,H,W],#buffer_left[0]像素点范围不是[0,1]
        # y =  buffer_left[0].detach().cpu().unsqueeze(dim=1)#[C,1,H,W]
        # print(' buffer_left[0]:size', buffer_left[0].shape)
        # print(' y:size', y.shape)#一般为[C,1,H,W]
        # a, _,c ,d= buffer_left.shape
        #
        #
        # #buffer_left[0] 才可以,也就是[1,H,W]才没有歧义
        # grid = torchvision.utils.make_grid( y, normalize=True, scale_each=True)
        # print('grid.size :', grid.size())#grid一定要三维,grid的像素点值范围[0,1]
        # # writer.add_image('images',grid , 0,dataformats='CHW')
        # writer.add_image('images',y[31], 0, dataformats='CHW')#这是第32张特征图
        # writer.close()

 第32张特征图

把网络某环节的特征图以热图形式可视化

每个通道一张热力图

参考博客:https://blog.csdn.net/GrayOnDream/article/details/99090247

#下面是某卷积部分,
init_feature维特征提取网络

buffer_left = self.init_feature(x_left)#[B,C,H,W]
buffer_right
= self.init_feature(x_right) l = buffer_left[0].shape[0]#通道数目 dst = './feautures' therd_size = 256#有些图太小,会放大到这个尺寸 def make_dirs(path): if os.path.exists(path) is False: os.makedirs(path) dst_path = os.path.join(dst) make_dirs(dst_path) for i in range(l): y =np.asarray(buffer_left[0].data.cpu())#处理成array格式 y_ = y[i, :, :] print('y_.shape:', y_.shape)#2维 print('y_type:',y_.dtype)#float32 y_ = np.asarray(y_ * 255, dtype=np.uint8)#[0,255] print('y_type:', y_.dtype)#uint8 # y_ = cv2.applyColorMap(y_, cv2.COLORMAP_JET) y_ = cv2.applyColorMap(y_, cv2.COLORMAP_RAINBOW)#https://www.sohu.com/a/343215045_120197868创建伪彩色 if y_.shape[0] < therd_size:#大小调整 tmp_file = os.path.join(dst_path, str(i) + '_' + str(therd_size) + '.png') tmp_img = y_.copy()#将src中的元素复制到tensor tmp_img = cv2.resize(tmp_img, (therd_size, therd_size), interpolation=cv2.INTER_NEAREST)#https://www.cnblogs.com/jyxbk/p/7651241.html cv2.imwrite(tmp_file, tmp_img) dst_file = os.path.join(dst_path, str(i) + '.png') cv2.imwrite(dst_file, y_)

 多个通道融合为一张热力图

 每个通道有一个权重,该通道的权重就是特征图的均值

            [c, h, w] = out[0].shape
            # print('buffer_left[0]',buffer_left[0].shape)
            # print('c h  w',c,h,w)
            ans = np.zeros((h, w))
            dst = './feautures'
            therd_size = 256  # 有些图太小,会放大到这个尺寸
            dst_path = os.path.join(dst)
            make_dirs(dst_path)
            ret = []
            y = np.asarray(out[0].data.cpu())  # 处理成array格式
            for i in range(c):
                y_ = y[i, :, :]
                ret.append(np.mean(y_))#把每个feature map的均值作为对应权重
            for j in range(h):
                for k in range(w):
                    for i in range(c):
                        ans[j][k] += ret[i] * y[i][j][k]#融合
            for i in range(h):
                for j in range(w):
                    ans[i][j] = max(0, ans[i][j])#不需要负值
            ans = (ans - np.min(ans)) / np.max(ans)#归一化
            print('ans
', ans)
            ans = np.asarray(ans * 255, dtype=np.uint8)  # [0,255]
            print('ans _type:', ans.dtype)  # uint8
            # y_ = cv2.applyColorMap(y_, cv2.COLORMAP_JET)
            ans = cv2.applyColorMap(ans, cv2.COLORMAP_JET)  # https://www.sohu.com/a/343215045_120197868创建伪彩色
            if ans.shape[0] < therd_size:  # 大小调整
                tmp_file = os.path.join(dst_path, str(therd_size) + 'sr.png')
                tmp_img = ans.copy()  # 将src中的元素复制到tensor
                tmp_img = cv2.resize(tmp_img, (therd_size, therd_size),
                                     interpolation=cv2.INTER_NEAREST)  # https://www.cnblogs.com/jyxbk/p/7651241.html
                cv2.imwrite(tmp_file, tmp_img)
            dst_file = os.path.join(dst_path, 'sr.png')
            cv2.imwrite(dst_file, ans)
            return out

注意如果

ERROR: TensorBoard could not bind to port 6006, it was already in use

 表示目前的端口正在被使用,需要lsof -i:6006

kill -9 32683

在重新在浏览器输入地址+端口才可,不要用其他的端口,不然会无法显示曲线

上述解决方案来源于   https://blog.csdn.net/c20081052/article/details/81974847

如果第二次运行tensorboard时发现不显示图像,只有一个点(此时的gxz文件可能比正常的小)

那可能是上一次没有writer.close() 

调用日志书写器实例对象summary_writer的close()方法写入内存,否则它每隔120s写入一次
close() 方法是把事件文件写到硬盘,并且关闭文件,一般是在不再需要writer的时候调用这个函数。

如果

add_image() got an unexpected keyword argument 'dataformats'

请 

pip install tensorboardX==1.6

 

如果遇到:

No dashboards are active for the current data set. 

请参考:https://www.cnblogs.com/ipersevere/p/10843115.html

原文地址:https://www.cnblogs.com/tingtin/p/13934057.html