资源来源:Pytorch模型训练实用教程
功能:
在一个图表中记录一个标量的变化,常用于 Loss 和 Accuracy 曲线的记录。
参数:
add_scalar(tag, scalar_value, global_step=None, walltime=None)
writer = SummaryWriter('../../Result/runs')
for n_iter in range(100):
y = torch.rand(1)
writer.add_scalar('data/scalar_systemtime', y[0], n_iter)
功能:
在一个图表中记录多个标量的变化,常用于对比,如 Train Loss 和 Valid Loss 的比较等。
参数:
add_scalars(main_tag, tag_scalar_dict, global_step=None, walltime=None)
for n_iter in range(100):
writer.add_scalars('data/scalar_group', {"xsinx": n_iter * np.sin(n_iter),
"xcosx": n_iter * np.cos(n_iter),
"arctanx": np.arctan(n_iter)}, n_iter)
功能:
绘制直方图和多分位数折线图,常用于监测权值及梯度的分布变化情况,便于诊断网络更新方向是否正确。
参数:
add_histogram(tag, values, global_step=None, bins=‘tensorflow’, walltime=None)
resnet18 = models.resnet18(False)
for name, param in resnet18.named_parameters():
writer.add_histogram(name, param.clone().cpu().data.numpy(), n_iter)
可以在 HISTOGRAMS 和 DISTRIBUTIONS 里面分别得到两种图:
x 轴即变量大小,y 轴为 gloabl_step。377 表示卷积层 conv1 的权值中有 377 个weight 的大小是在 0.036 这个区间。
x 轴为 gloabl_step,由于这里没有训练,所以随着 x 轴的增加,曲线是平直的。看 y 轴,从上到下,共计 9 条曲线(若有训练,会是曲线,现在是直线),分别对应[maximum, 93%, 84%, 69%, 50%, 31%, 16%, 7%, minimum]分位数。
功能:
绘制图片,可用于检查模型的输入,监测 feature map 的变化,或是观察 weight。
参数:
add_image(tag, img_tensor, global_step=None, walltime=None)
通常会借助 torchvision.utils.make_grid() 将一组图片绘制到一个窗口
功能:
将一组图片拼接成一张图片,便于可视化。
参数:
torchvision.utils.make_grid(tensor, nrow=8, padding=2, normalize=False, range=None, scale_each=False, pad_value=0)
import torchvision.utils as vutils
img = torch.rand(32, 3, 64, 64) # (B x C x H x W)
if n_iter % 10 == 0:
x = vutils.make_grid(img, normalize=True, scale_each=True)
writer.add_image('Image', x, n_iter) # x.size= (3, 266, 530) (C*H*W)
功能:
绘制网络结构拓扑图
参数:
add_graph(model, input_to_model=None, verbose=False, **kwargs)
import torchvision.models as models
resnet18 = models.resnet18(False)
input = torch.rand(6, 3, 224, 224)
writer.add_graph(resnet18, input)
功能:
在三维空间或二维空间展示数据分布,可选 T-SNE、PCA 和 CUSTOM 方法。
参数:
add_embedding(mat, metadata=None, label_img=None, global_step=None, tag=‘default’, metadata_header=None)
dataset = datasets.MNIST('mnist', train=False, download=True)
images = dataset.test_data[:100].float()
label = dataset.test_labels[:100]
features = images.view(100, 784) # 将二维图片转成一维数据
writer.add_embedding(features, metadata=label, label_img=images.unsqueeze(1))
add_text(tag, text_string, global_step=None, walltime=None)
功能: 记录文字
add_video(tag, vid_tensor, global_step=None, fps=4, walltime=None)
功能: 记录视频
add_figure(tag, figure, global_step=None, close=True, walltime=None)
功能: 添加 matplotlib 图片到图像中
add_image_with_boxes(tag, img_tensor, box_tensor, global_step=None, walltime=None, * *kwargs)
功能: 图像中绘制 Box,目标检测中会用到
add_pr_curve(tag, labels, predictions, global_step=None, num_thresholds=127, weights=None, walltime=None)
功能: 绘制 PR 曲线
add_pr_curve_raw(tag, true_positive_counts, false_positive_counts, true_negative_counts, false_negative_counts, precision, recall, global_step=None, num_thresholds=127, weights=None, walltime=None)
功能: 从原始数据上绘制 PR 曲线
export_scalars_to_json(path)
功能: 将 scalars 信息保存到 json 文件,便于后期使用
net = Net() # 创建一个网络
writer = SummaryWriter(log_dir='../../Result/visual_weights')
params = net.state_dict()
for k, v in params.items():
if 'conv' in k and 'weight' in k:
c_int = v.size()[1] # 输入层通道数
c_out = v.size()[0] # 输出层通道数
for j in range(c_out):
kernel_j = v[j, :, :, :].unsqueeze(1) # 压缩维度,为make_grid制作输入
kernel_grid = vutils.make_grid(kernel_j, normalize=True, scale_each=True, nrow=c_int) # 1*输入通道数, w, h
writer.add_image(k+'_split_in_featuremap', kernel_grid, global_step=j) # j 表示feature map数
# 将一个卷积层的卷积核绘制在一起,每一行是一个feature map的卷积核
k_w, k_h = v.size()[-1], v.size()[-2]
kernel_all = v.view(-1, 1, k_w, k_h)
kernel_grid = vutils.make_grid(kernel_all, normalize=True, scale_each=True, nrow=c_int) # 1*输入通道数, w, h
writer.add_image(k + '_all', kernel_grid, global_step=666)
writer.close()
net = Net()
normMean = [0.49139968, 0.48215827, 0.44653124]
normStd = [0.24703233, 0.24348505, 0.26158768]
normTransform = transforms.Normalize(normMean, normStd)
testTransform = transforms.Compose([
transforms.Resize((32, 32)),
transforms.ToTensor(),
normTransform
])
test_data = MyDataset(txt_path=txt_path, transform=testTransform)
test_loader = DataLoader(dataset=test_data, batch_size=1)
img, label = iter(test_loader).next()
x = img
writer = SummaryWriter(log_dir=log_dir)
for name, layer in net._modules.items():
x = x.view(x.size(0), -1) if 'fc' in name else x
x = layer(x) # 对x执行单层运算
x = F.relu(x) if 'conv' in name else x
if name == 'conv1':
x1 = x.transpose(0, 1) # C, B, H, W ---> B, C, H, W
img_grid = vutils.make_grid(x1, normalize=True, scale_each=True, nrow=2) # B, C, H, W
writer.add_image(vis_layer + '_feature_maps', img_grid, global_step=666)
# 绘制原始图像
img_raw = normalize_invert(img, normMean, normStd) # 图像去标准化
img_raw = np.array(img_raw * 255).clip(0, 255).squeeze().astype('uint8')
writer.add_image('raw img', img_raw, global_step=666) # j 表示feature map数
writer.close()