在之前的章节里演示了怎么加载数据,给模型传递数据,在训练集上训练模型,在测试集上测试模型。
为了能够看到发生了什么,我们打印出一些统计数据,观测训练的进展。然而,我们可以做到更多:Pytorch 集成了tensorboard,一个用来可视化神经网络训练的工具。本节将会介绍tensorboard一些功能并学习:
- 读取数据时添加一些合适的数据转换;
- 设置tensorboard;
- 写入tensorboard;
- 使用tensorboard检查一个模型文件;
- 更简单的使用tensorboard创建一个可视化的交互版本。
特别的,关于最后一点,我们将会看到:
- 几种方法检查训练数据;
- 怎么跟踪我们的模型在训练时的表现;
- 一旦模型开始训练,怎么评价模型的表现;
数据加载部分代码:
# transform
transform = transforms.Compose([transforms.ToTensor(),
transforms.Normalize((0.5,), (0.5,))])
# dataset
trainset = torchvision.datasets.FashionMNIST('./data',
download=True,
train=True,
transform=transform)
testset = torchvision.datasets.FashionMNIST('./data',
download=True,
train=False,
transform=transform)
trainloader = torch.utils.data.DataLoader(trainset,
batch_size=4,
shuffle=True,
num_workers=2)
testloader = torch.utils.data.DataLoader(testset,
batch_size=4,
shuffle=False,
num_workers=2)
# show image
def pltshow(img, one_channel=False):
if one_channel:
img = img.mean(dim=0)
img = img / 2 + 0.5
npimg = img.numpy()
if one_channel:
plt.imshow(npimg, cmap='Greys')
else:
plt.imshow(np.transpose(npimg, (1, 2, 0)))
模型定义:
class Net(nn.Module):
def __init__(self):
super(Net, self).__init__()
self.conv1 = nn.Conv2d(1, 6, 5)
self.pool1 = nn.MaxPool2d(2, 2)
self.conv2 = nn.Conv2d(6, 16, 5)
self.fc1 = nn.Linear(16 * 4 * 4, 120)
self.fc2 = nn.Linear(120, 84)
self.fc3 = nn.Linear(84, 10)
def forward(self, x):
x = self.pool1(F.relu(self.conv1(x)))
x = self.pool1(F.relu(self.conv2(x)))
x = x.view(-1, 16 * 4 * 4)
x = F.relu(self.fc1(x))
x = F.relu(self.fc2(x))
x = self.fc3(x)
return x
net = Net()
定义损失函数以及优化器:
criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(net.parameters(), lr=0.001, momentum=0.9)
1. TensorBoard设置
首先设置tensorboard,从torch.utils导入tensorboard:
from torch.utils.tensorboard import SummaryWriter
writer=SummaryWriter('runs/fashion_mnist_experiment_1')
上面两行代码会创建一个"runs/fashion_mnist_experiment_1"文件夹。
运行时可能会报错提示没有安装tensorboard,进入anaconda虚拟环境,conda install tensorboard就可以了。
2. 写入Tensorboard
向tensorboard写入一个图像,make_grid会将一组图片拼接在一起组成一个新的图片:
dataiter = iter(trainloader)
images, labels = dataiter.next()
img_grid = torchvision.utils.make_grid(images)
writer.add_image('four_mnist_images', img_grid)
现在打开anaconda,进入安装了pytorch的虚拟环境,然后输入命令:
tensorboard --logdir=E:\program\python\pytorch-test\basic\runs
logdir后面是log保存的绝对路径,需要按照实际情况进行修改,运行成功的话会有如下图提示:向谷歌或者火狐浏览器中输入上图中提示的网址:
3. 查看网络模型
Tensorboard一个强大之处是它可以可视化复杂模型的结构:
writer.add_graph(net,images)
writer.close()
刷新tensorboard网页,查看gragh:4. 跟踪模型训练
在之前的示例,我们只是简单的打印模型运行的loss。现在我们可以保存log到tensorboard,查看运行过程中loss的走势:
running_loss = 0.0
for epoch in range(1): # loop over the dataset multiple times
for i, data in enumerate(trainloader, 0):
# get the inputs; data is a list of [inputs, labels]
inputs, labels = data
# zero the parameter gradients
optimizer.zero_grad()
# forward + backward + optimize
outputs = net(inputs)
loss = criterion(outputs, labels)
loss.backward()
optimizer.step()
running_loss += loss.item()
if i % 1000 == 999: # every 1000 mini-batches...
# ...log the running loss
writer.add_scalar('training loss',
running_loss / 1000,
epoch * len(trainloader) + i)
# ...log a Matplotlib Figure showing the model's predictions on a
# random mini-batch
writer.add_figure('predictions vs. actuals',
plot_classes_preds(net, inputs, labels),
global_step=epoch * len(trainloader) + i)
running_loss = 0.0
print('Finished Training')
查看tensorboard:结语
本节代码可以从github上下载,github上提供了python两个版本的入门程序,仅供大家参考。今天查了一天的libtorch trace模型的方法,可惜网上一点资料都没有,Pytorch官网也没有任何说明,可能libtorch不支持freeze模型,那这样的话libtorch的意义就小了很多啊!我用C++训练完模型却不能部署,这不是逗我嘛!瞬间失去了学习libtorch的热情。