问题
需要监控损失函数Loss啥时候训练收敛了。
解决
pip
pip3 install visdom
Visdom
运行:
python3 -m visdom.server
然后,打开http://localhost:8097/即可。
Python
最后,在Python程序中埋点即可。
def cifar10_go():
# 实例化一个窗口
viz = Visdom(port=8097)
# 初始化窗口的信息
viz.line([0.], [0.], win='train_loss', opts=dict(title='train loss'))
transform = transforms.Compose([
transforms.RandomResizedCrop((224, 224)),
transforms.ToTensor(),
transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])
])
cifar10_dataset = torchvision.datasets.CIFAR10(root='./data',
train=False,
transform=transform,
target_transform=None,
download=True)
dataloader = DataLoader(dataset=cifar10_dataset, # 传入的数据集, 必须参数
batch_size=32, # 输出的batch大小
shuffle=True, # 数据是否打乱
num_workers=4) # 进程数, 0表示只有主进程
model = MyCNN()
# 交叉熵损失函数
criterion = nn.CrossEntropyLoss()
# 定义优化器
optimizer = torch.optim.SGD(model.parameters(), lr=1e-4, weight_decay=1e-2, momentum=0.9)
# 下面开始训练
start = time.time() # 记时开始
for epoch in range(3): # 设置要在全部数据上训练的次数
for i, data in enumerate(dataloader):
# data就是我们获取的一个batch size大小的数据
inputs, labels = data # 分别得到输入的数据及其对应的类别结果
# 首先要通过zero_grad()函数把梯度清零,不然PyTorch每次计算梯度会累加,不清零的话第二次算的梯度等于第一次加第二次的
optimizer.zero_grad()
# 获得模型的输出结果,也即是当前模型学到的效果
outputs = model(inputs)
# 获得输出结果和数据真正类别的损失函数
loss = criterion(outputs, labels)
print('Epoch {}, Loss {}'.format(epoch + 1, loss))
# 算完loss之后进行反向梯度传播,这个过程之后梯度会记录在变量中
loss.backward()
# 用计算的梯度去做优化
optimizer.step()
# 更新监听的信息
viz.line([loss.item()], [i], win='train_loss', update='append')
end = time.time() # 计时结束
print('使用时间: {:.5f} s'.format(end - start))
# 保存模型训练结果
torch.save(model, './MyCNN_model_23.pth')
这里以为上一个例子:《PyTorch使用CIFAR-10数据进行训练》。