注意,Tensorboard、TensorboardX本身可以直接存储1通道和3通道的图像,如果不是1或3通道才需要本方法把所有的通道分成1通道
Python环境安装Tensorboard、TensorboardX
通过以下命令安装
pip install tensorboard
pip install tensorboardX
基础使用方法可以查看下面的链接
我之前写过的基础教程:如何利用Tensorboard以可视化的方式查看训练的“过程资产”(目标函数、结果、AUC等等)
具体步骤:将多通道图像存入Events(日志文件)
1 引入第三方库
from tensorboardX import SummaryWriter
import datetime # 是为了让保存结果按照日期时间命名,方便区分每次运行的结果
2 设置保存路径
也就是结果保存的路径,就是那个结果文件。
# 路径你可以写个现在不存在的,summary会自己创建的。
save_path = './logdir/' + datetime.datetime.now().strftime("%Y%m%dT%H%M%S") + '/' #注意,时间部分不要改成用“:”相连的方式,因为格式不合适。
writer = SummaryWriter(save_path);
3 处理 Batch 和 Channel
以下代码只是个样例,只保留了重要的部分。
while iteration<total_iteration:
# ****************
# 这里省略一些代码。
# ****************
for i, images in enumerate(train_loader):
# ****************
# 这里省略一些代码。
# ****************
output = model(images)
# output的size:[batch, channel, height, width]如下所示
# torch.Size([20, 60, 128, 128])
#
iteration = iteration+1
if iteration % 20 == 0:
writer.add_scalar('Loss/train_loss', losses.avg, iteration);
# ****************
# 这里省略一些代码。
# ****************
# 考虑到图片的话,文件比较大的,可以多几个迭代保存一次,只是查看结果用,不在意的话也没有关系。
if iteration % 5000 == 0 or iteration == 1000:
batch_size, channels, height, width = output.shape
# 先按照Batch进行循环,batch=0,batch=1.....一直循环。
for batch_idx in range(batch_size):
# 再对每个通道进行循环,把该batch的所有通道保存。
for channel_idx in range(channels):
output_view = output[batch_idx, channel_idx, :, :]
output_view = output_view.unsqueeze(0)
writer.add_image(f'OUTPUT_Batch_{batch_idx}/Channel_{channel_idx}', output_view, iteration)
# 下面的代码可以对比该图像不同通道之间的差异
for batch_idx in range(batch_size):
for channel_idx in range(channels - 1):
img1 = output[batch_idx, channel_idx, :, :]
img2 = output[batch_idx, channel_idx + 1, :, :]
error_img = torch.abs(img1 - img2)
error_img = error_img.unsqueeze(0)
writer.add_image(f'OUTPUT_Batch_{batch_idx}/Error_Channel_{channel_idx}_{channel_idx + 1}', error_img, iteration)
# 不再存入的时候,也就是整个代码文件的最后一行,可以关闭了。
writer.close()
结果展示
最终结果就会像下图一样,每个Batch都会保存图像的所有通道。