Tensorboard
- Tensorboard能够可视化loss的变化过程,便于我们查看模型的训练状态,也能查看模型当前的输入和输出结果
- 在Pycharm中,可以通过按住ctrl,并左键点击某个库来进入源文件查看该库的使用方法
- SummaryWriter是用来向log_dir文件夹中写入事件文件的一个类,并且该事件文件可以被tensorboard解析,如下:
class SummaryWriter:"""Writes entries directly to event files in the log_dir to beconsumed by TensorBoard.The `SummaryWriter` class provides a high-level API to create an event filein a given directory and add summaries and events to it. The class updates thefile contents asynchronously. This allows a training program to call methodsto add data to the file directly from the training loop, without slowing downtraining."""
* 我们可以创建SummaryWriter对象来在logs文件夹下生成log文件,如下:
* 同时每次生成的writer()对象都会生成log文件,tensorboard --logdir logs 会将 logs文件夹下的log文件全展示出来
from torch.utils.tensorboard import SummaryWriterwriter = SummaryWriter("logs") # 创建一个writer对象 logs是保存的路径# writer.add_image() # 添加图像
for i in range(10):writer.add_scalar("y=3x", 4*i, i) # 添加标量writer.close() # 关闭writer
* 通过SummaryWriter中的.add_scalar()函数,向logs文件夹的log文件添加标量数据,tensorboard 可以根据logs文件夹中的log文件,绘制图像,如下:
* 但是每次绘制图像前,如果不更换图片的标题,那么最好删除之前绘制的log文件,避免出现图像混乱,如下:
- 可以通过SummaryWriter中的.add_image()函数,来向logs文件夹中的log文件添加图像数据,tensorboard可以根据logs文件中的log文件,展示图像,如下:
Transforms
-
transforms指transforms.py(python文件),相当于一个工具箱
-
我们从工具箱中选取一个工具模板(class类),根据自己的需求打造一个具体的工具,把特定格式的图片经过这个工具,得到我们想要的图片变换结果
-
transforms的使用方法:
from PIL import Image
from torchvision import transforms# 通过transforms.ToTensor()将PIL图像转换为张量
# 1. transforms怎么使用# 绝对路径:D:\learn_pytorch\learn_pytorch\Dataset\train\ants_image\0013035.jpg
# 相对路径:Dataset/train/ants_image/0013035.jpgimg_path = "Dataset/train/ants_image/0013035.jpg" # 相对路径
img = Image.open(img_path) # 打开图像tensor_trans = transforms.ToTensor() # 实例化transforms.ToTensor()类
img_tensor = tensor_trans(img) # 调用实例化对象的__call__方法 # 将PIL图像转换为张量
print(img_tensor) # tensor([[[0.0000, 0.0000, 0.0000, ..., 0.0000, 0.0000, 0.0000],
* 注意:这里的_ _ call _ _ 方法跟_ _ init _ _ 方法都是是python的一种内置方法,也叫魔法方法,但是它们两不一样,如下:
1. _ _ call _ _方法是把对象当成函数来使用的时候,会自动调用,也就是说把类的实例化对象,变成一个可以调用的对象,可以让实例对象可以像函数一样被调用。
2. 在python官网里面说的是,此方法会在实例作为一个函数被“调用”时被调用。例如:
class A:# 定义__call__方法def __call__(self, a, b):print("调用__call__()方法,把对象当成函数来使用", a, b)def hello(self, e, f):print("调用hello" + e + f)c = A()
c("我是参数a", "你是参数b") # 调用方法一
print("-" * 100)
c.hello("我是参数e", "你是参数f")# 调用__call__()方法,把对象当成函数来使用 我是参数a 你是参数b
# ----------------------------------------------------------------------------------------------------
# 调用hello我是参数e你是参数f
- tensor数据类型
- 下图可以看到tensor数据类型包含神经网络所需要的参数
- 我们可以将PIL格式的图片传给ToTensor,也可以将ndarray格式的图片传给ToTensor
- 可以使用opencv来将图片读取成ndarray格式,如下:
- tensorboard 可以展示ndarray格式的图片,也可以展示tensor格式的图片,如下:
- 下图可以看到tensor数据类型包含神经网络所需要的参数
from PIL import Image
from torch.utils.tensorboard import SummaryWriter
from torchvision import transforms# 通过transforms.ToTensor()将PIL图像转换为张量
# 1. transforms怎么使用# 绝对路径:D:\learn_pytorch\learn_pytorch\Dataset\train\ants_image\0013035.jpg
# 相对路径:Dataset/train/ants_image/0013035.jpgimg_path = "Dataset/train/ants_image/0013035.jpg" # 相对路径
# img_path = "learn_pytorch/Dataset/train/ants_image/0013035.jpg" # 相对路径
img = Image.open(img_path) # 打开图像writer = SummaryWriter("logs")
tensor_trans = transforms.ToTensor() # 实例化transforms.ToTensor()类
img_tensor = tensor_trans(img) # 调用实例化对象的__call__方法 # 将PIL图像转换为张量writer.add_image("tensor_img", img_tensor) # 将张量写入tensorboard
writer.close()