一、Tensorboard
功能:展示 transform 的运行结果
涉及到的方法和类如下所示:
1.1、SummaryWriter
1.1.1、定义
class SummaryWriter(object):
"""Writes entries directly to event files in the log_dir to be
consumed by TensorBoard.
The `SummaryWriter` class provides a high-level API to create an event file
in a given directory and add summaries and events to it. The class updates the
file contents asynchronously. This allows a training program to call methods
to add data to the file directly from the training loop, without slowing down
training.
"""
函数大概作用时:这个类可以直接向 log_dir 文件夹写入事件,供 Tensorboard 使用,这个类包含的函数如下所示:
def __init__(self, log_dir=None, comment='', purge_step=None, max_queue=10,
flush_secs=120, filename_suffix=''):
就是当你运行这个类的时候,就会需要你新建一个文件夹,也就是 log_dir=None 这个步骤,不修改 None也即不输入名字,就会默认在runs/**CURRENT_DATETIME_HOSTNAME** 这个位置。后面 comment 参数 None时默认无效,它是用来在名字后面加后缀的。
1.1.2、使用方法
writer = SummaryWriter(),这就是 log_dir=None 的,存储在默认地址
writer = SummaryWriter("my_experiment"),这就是写了地址的,文件夹就会叫 my_experiment
writer = SummaryWriter(comment="LR_0.1_BATCH_16"),LR 是对用的学习速率,batch 是对应的 batchsize,这些都是一些细节信息,名字输出就是:runs/May04_22-14-54_s-MacBook-Pro.localLR_0.1_BATCH_16/
1.1.3、包含的方法
add_scalar:
功能:添加数据到集合中
源码如下:
def add_scalar(
self,
tag, # 添加横纵坐标,图片标题
scalar_value, # 需要保存的数值,对应输出图表的 Y 轴
global_step=None, # 多少步:训练到多少步时数值时多少,对应输出图表的 X 轴
walltime=None, # 基本是默认的
new_style=False, # 基本是默认的
double_precision=False, # 基本是默认的
):
e.g:
![](https://i-blog.csdnimg.cn/blog_migrate/5ecdfc81211c4aeaf357c3a22ee33f85.png)
实例:
from torch.utils.tensorboard import SummaryWriter
writer = SummaryWriter('logs') # 创建一个名为 logs 的文件夹
for i in range(100):
writer.add_scalar("y=x", i , i)
# 参数说明:(”函数“,x轴变量,y轴变量) 第一个”函数“只是个字符,真正的功能要后面的 i 来实现
writer.close()
这样就会多出来一个 logs 文件,接下来就是怎么读文件里的图片:
在终端输入 tensorboard --logdir=logs,logdir:事件文件所在文件夹名称
然后 tensorboard 就会弹出窗口,给一个端口可以点进去
(pytorch) F:\pycharm\text>tensorboard --logdir=logs
TensorFlow installation not found - running with reduced feature set.
Serving TensorBoard on localhost; to expose to the network, use a proxy or pass --bind_all
TensorBoard 2.11.0 at http://localhost:6006/ (Press CTRL+C to quit)
但是,如果端口别人再用可以用以下方式修改打开端口:
(pytorch) F:\pycharm\text>tensorboard --logdir=logs --port=6007
TensorFlow installation not found - running with reduced feature set.
Serving TensorBoard on localhost; to expose to the network, use a proxy or pass --bind_all
TensorBoard 2.11.0 at http://localhost:6007/ (Press CTRL+C to quit)
add_iamge:
功能:图片可视化
源码如下:
def add_image(self,
tag, # 标题
img_tensor, # 这里需要的数据类型:torch.Tensor, nummpy.array, string/blobname
global_step=None, walltime=None, dataformats='CHW'):
实例:
from torch.utils.tensorboard import SummaryWriter
import numpy as np # 图片格式 :numpy.array
from PIL import Image # 获得图片 PIL是pillow库
writer = SummaryWriter('log') # 创建一个名为 logs 的文件夹
img_path = 'F:\\pycharm\\text\\datasize\\train\\ants\\0013035.jpg' # 获取图片路径
img_PIL = Image.open(img_path) # 打开图片为PIL格式
img_array = np.array(img_PIL) # 将图片PIL格式转化为 torch.tensor 格式
writer.add_image('test',img_array, 1, dataformats='HWC')
#括号里的 1 ,是 step,是步数的意思,同一个 tag 下不同照片的 steps 是不一样的
for i in range(100):
writer.add_scalar("y=x", i , i)
# 参数说明:(”函数“,x轴变量,y轴变量) 第一个”函数“只是个字符,真正的功能要后面的 i 来实现
writer.close()
img_tensor 对形状是有要求的,默认的时 (3,H,W)即通道为3,后面是高和宽,不是的话,例如上面,需要加上 "dataformats='HWC'",这里的”HWC“也可以换,还有:CHW,HWC,HW
二、Transform
功能:对图像进行变换,例如统一尺寸,数据类转换,具体需要看里面的类
插播:tensor 数据类型,包装了反向神经网络所需要的参数
使用方法:
from torch.utils.tensorboard import SummaryWriter
from torchvision import transforms
from PIL import Image # PIL 的图片读取方式
import cv2
import numpy
img_path = "F:\\pycharm\\text\\datasize\\train\\ants\\0013035.jpg"
img = Image.open(img_path)
# cv_img = cv2.imread() cv2读图片的方式
writer = SummaryWriter('tags')
tensor_trans = transforms.ToTensor() # 从transforms中选一个 class,创建实例,这里选的是 ToTensor
tensor_img = tensor_trans(img) # 将 img 图片转化为 tensor
writer.add_image(tensor_img)
writer.close()
三、常见的 Transforms
读图片方法 | PIL | Image.open() |
tensor | ToTensor() | |
narrays | cv.imread() |
from PIL import Image
from torch.utils.tensorboard import SummaryWriter
from torchvision import transforms
writer = SummaryWriter('logs') # 引用 tensorboard 里的 SummaryWriter 函数
img = Image.open('F:\\pycharm\\text\\datasize\\train\\ants\\0013035.jpg')
print(type(img)) # 输出:<class 'PIL.JpegImagePlugin.JpegImageFile'>
# ToTensor 方法
trans_tensor = transforms.ToTensor() # 实例引用
img_tensor = trans_tensor(img) # 图片通过 ToTensor 变成 tensor
print(type(img_tensor)) # 输出:<class 'torch.Tensor'>
writer.add_image('ToTensor',img_tensor) # 将图片用SummaryWriter里的add_image方法读出来
# Normalize
print(img_tensor[0][0][0]) # 第0层,第0行,第0列
trans_norm = transforms.Normalize([0.5, 0.5, 0.5],[0.5, 0.5, 0.5]) # 这个方法需要输入三个平均值三个标准差
# 计算公式:output[channel] = (input[channel] - mean[channel]) / std[channel]
img_norm = trans_norm(img_tensor)
print(img_norm[0][0][0])
writer.add_image('normalize', img_norm)
# resize 进行等比缩放,不改变宽高比例,只改变最小边最大边之间的关系(图片会变形)
print(img.size)
trans_size = transforms.Resize((512, 512)) # 将图片变成 512*512
img_resize = trans_size(img) # 指定是那张图片
print(img_resize)
img_resize_totensor = trans_tensor(img_resize) # 这里PIL变成ToTensor
writer.add_image('Resize', img_resize_totensor,0)
# compese resize 用法2 这个就是等比放大
trans_size_2 = transforms.Resize(512)
trans_compose = transforms.Compose([trans_size_2, trans_tensor])
# 后面一个需要的输入和前面一个的输出一定要是同一种数据类型
img_resize_2 = trans_compose(img)
writer.add_image("resize",img_resize_2)
# Randomcrop
trans_randomcrop = transforms.RandomCrop(300)
img_randomcrop = transforms.Compose([trans_randomcrop, trans_tensor])
for i in range(10):
img_crop = img_randomcrop(img)
writer.add_image('randomcrop', img_crop, i)
writer.close()
以上是 ToTensor、Normalize、Resize、Randomcrop的用法
插播:
![](https://i-blog.csdnimg.cn/blog_migrate/e55b93a2d7c18bb1574be0e5710589e0.png)