
Pytorch学习日记01-TensorBoard与Transforms的使用
Transforms用最简单的语言解释。及使用。
·
课程内容来自于B站小土堆视频仅作为自己总结使用。
其主要目的是用,另外就是养成看源码的习惯,了解输入内容及输出内容。关注函数参数内容。
TensorBorder的使用
自己的理解就是一个简单的展示工具。将一些函数绘画出来。或一些图片进行展示出来。
主要的使用的函数为:add_scalar和add_image
使用方法示例:
from torch.utils.tensorboard import SummaryWriter
import numpy as np
from PIL import Image
""""
干啥用的啊---
- 用于绘画出函数图像和所要展示的图片
- 使用一种类似与flask客户端的页面进行展示,且部分内容可调节
如何使用呢?
- 需要使用tensorboard中的summaryWriter类进行划定生成的文件名称
- 画图即利用 add_scalar()进行绘图。第一个参数代表你要在那个标签图中绘画。后面紧跟着y,x坐标
- 展示图片需要利用add_image()第一个参数同样是设定图片展示格子。第二个参数必须指定为numpy图像类型。所以需要打开图片后转换格式。
-第三参数为当前格子的图片索引值。第四个参数为:调换通道数。如果是xy3与3xy是不同的需要调换
"""
writer = SummaryWriter("logs")
image_path = "../data/train/ants_image/0013035.jpg"
img_PIL = Image.open(image_path)
img_array = np.array(img_PIL)
print(img_array.shape)
writer.add_image("test", img_array, 1, dataformats='HWC')
x = range(100)
for i in x:
writer.add_scalar('y=3x', 3 * i, i)
writer.close()
运行截图为:
- 程序运行会生成相应标签文件夹和文件
- 使用cmd命令行运行这个文件夹,激活conda环境运行该命令
tensorboard --logdir=logs
使用相对位置请找准当前控制台所在位置。若没有运行结果可将logs替换成绝对地址。
TensorForm的使用
主要负责图像的初始化处理,像改变图像大小、归一化处理图像、图像存储格式变化及组合变化。
主要使用的类工具有:ToTensor、Normalize、Resize、Compose
使用示例如:
from PIL import Image
from torch.utils.tensorboard import SummaryWriter
from torchvision import transforms
"""
transform所有工具的使用前都要先创建一个变化格式工具。 img是变化前的图像数据;img_trans_是变化后图像数据。
比如文件格式变化工具需要先声明 PIL转成tensor格式才能展示在body上
trans_type_tool=transforms.ToTensor()
img_trans_type=trans_type_tool(img)
再比如变化大小 声明大小变化器
trans_size_tool=transforms.Resize((512,512))
img_trans_size=trans_size_tool(img)
归一化处理器 这个操作的是Tensor类型的数据
trans_norm_tool=transforms.Normalize([均值],[方差])
img_trans_norm=trans_norm_tool(img_trans_type)
工具顺序打包 Compose() compose就是组合的意思将一些工具组合在一起
trans_compose_tool = transforms.Compose([trans_size_tool, trans_type_tool])
上述代码就是生成一个组合工具包,他会对图像先进行一个大小的改变,然后进行格式转化成tensor。
两者的顺序不能改变?因为大部分的transforms工具都是对PIL Image or numpy.ndarray这两种类型的操作。
工具包是顺序执行,在执行完格式转化后讲无法进行其他变化。
img_trans_compose = trans_compose_tool(img)
"""
# 1、配置tensorboard 导入summarywriter并创建书写类。
writer = SummaryWriter("logs")
# 2、导入所要显示的图片内容,并进行格式转换。Totensor使用
img = Image.open("../data/train/ants_image/0013035.jpg")
trans_type_tool = transforms.ToTensor()
img_trans_type = trans_type_tool(img)
writer.add_image("ToTensor", img_trans_type)
# 3、规一划处理,normalize
print("第一个参数初始"+str(img_trans_type[0][0][0]))
trans_norm_tool = transforms.Normalize([0.5, 0.5, 0.5], [0.5, 0.5, 0.5])
img_trans_norm = trans_norm_tool(img_trans_type)
print("第一个参数归一化后"+str(img_trans_norm[0][0][0]))
writer.add_image("Normalize",img_trans_norm)
# 4、Resize
print("初始图像大小:"+str(img.size))
trans_size_tool = transforms.Resize((512, 512))
img_trans_size = trans_size_tool(img)
print("变化后1图像大小:"+str(img_trans_size.size))
# 将PIL类型-》tensor
img_trans_size = trans_type_tool(img_trans_size)
writer.add_image("Resize",img_trans_size)
# 5、Compose - resize
trans_resize_2 = transforms.Resize(512) # 这是指定变换方法
trans_compose = transforms.Compose([trans_resize_2, trans_type_tool])
img_resize_2 = trans_compose(img)
writer.add_image("Compose-resize", img_resize_2)
# 6、RandomCrop 随机裁剪
trans_RandomCrop_tool = transforms.RandomCrop(512)
# 使用组合方式进行操作 单个数值则X*X 双数则X*Y
trans_compose_tool = transforms.Compose([trans_RandomCrop_tool, trans_type_tool])
for i in range(10):
img_trans_rc = trans_compose_tool(img)
writer.add_image("RandomCrop", img_trans_rc,i)
writer.close()
运行结果:
–注:解释为啥归一化的代码需要传入Tensor类型。可以观看源码程序,该类继承了一个class Normalize(torch.nn.Module):
所以当一个类继承了torch.nn.Module,并且没有显式定义__call__方法时,Python会沿着继承链往上寻找__call__方法,直到找到torch.nn.Module中定义的__call__方法。因此,按照函数的方式调用这个类的实例时,实际上会执行torch.nn.Module中的__call__方法,这将触发模型的前向传播过程。需要观察forward前向传播函数内的参数情况。
示例:
normal的需要一个tensor
RandomCrop需要一个PIL或Tensor都可以
更多推荐
所有评论(0)