数据集下载地址:

链接:https://pan.baidu.com/s/1l1AnBgkAAEhh0vI5_loWKw
提取码:2xq4

创建数据集:https://www.cnblogs.com/xiximayou/p/12398285.html

读取数据集:https://www.cnblogs.com/xiximayou/p/12422827.html

进行训练:https://www.cnblogs.com/xiximayou/p/12448300.html

保存模型并继续进行训练:https://www.cnblogs.com/xiximayou/p/12452624.html

加载保存的模型并测试:https://www.cnblogs.com/xiximayou/p/12459499.html

划分验证集并边训练边验证:https://www.cnblogs.com/xiximayou/p/12464738.html

使用学习率衰减策略并边训练边测试:https://www.cnblogs.com/xiximayou/p/12468010.html

epoch、batchsize、step之间的关系:https://www.cnblogs.com/xiximayou/p/12405485.html

我们已经能够使用学习率衰减策略了,同时也可以训练、验证、测试了。那么,我们可能想要了解训练过程中的损失和准确率的可视化结果。我们可以使用tensorboard来进行可视化。可参考:

利用tensorboard可视化:https://www.cnblogs.com/xiximayou/p/12470678.html

利用tensorboardcolab可视化:https://www.cnblogs.com/xiximayou/p/12470715.html

在此之前,我们还要优化一下我们的训练测试代码。一般情况下,我们只需要关注每一个epoch的结果就行了,可以将输入每一个step的那段代码注释掉,但是,这也存在一个问题。每次只打印出epoch的结果,有可能一个epoch要执行的时间很长,注释掉step之后没有反馈给到我们。那应该怎么办?使用python库tqdm。它会以进度条的形式告诉我们一个epoch还有多久完成,以及完成所需的时间。

接下来,我们结合代码来一起看看改变之后的结果:

main.py

import sys
sys.path.append("/content/drive/My Drive/colab notebooks")
from utils import rdata
from model import resnet
import torch.nn as nn
import torch
import numpy as np
import torchvision
import train
import torch.optim as optim np.random.seed(0)
torch.manual_seed(0)
torch.cuda.manual_seed_all(0) torch.backends.cudnn.deterministic = True
torch.backends.cudnn.benchmark = True device = torch.device('cuda' if torch.cuda.is_available() else 'cpu') batch_size=128
train_loader,val_loader,test_loader=rdata.load_dataset(batch_size) model =torchvision.models.resnet18(pretrained=False)
model.fc = nn.Linear(model.fc.in_features,2,bias=False)
model.cuda() #定义训练的epochs
num_epochs=100
#定义学习率
learning_rate=0.1
#定义损失函数
criterion=nn.CrossEntropyLoss()
#定义优化方法,简单起见,就是用带动量的随机梯度下降
optimizer = torch.optim.SGD(params=model.parameters(), lr=0.1, momentum=0.9,
weight_decay=1*1e-4)
scheduler = optim.lr_scheduler.MultiStepLR(optimizer, [40,80], 0.1)
print("训练集有:",len(train_loader.dataset))
#print("验证集有:",len(val_loader.dataset))
print("测试集有:",len(test_loader.dataset))
def main():
trainer=train.Trainer(criterion,optimizer,model)
trainer.loop(num_epochs,train_loader,val_loader,test_loader,scheduler) main()

这里面没有什么变化。主要是train.py

import torch
from tqdm import tqdm
from tensorflow import summary
import
datetime current_time = str(datetime.datetime.now().timestamp())
train_log_dir = '/content/drive/My Drive/colab notebooks/output/tsboardx/train/' + current_time
test_log_dir = '/content/drive/My Drive/colab notebooks/output/tsboardx/test/' + current_time
val_log_dir = '/content/drive/My Drive/colab notebooks/output/tsboardx/val/' + current_time
train_summary_writer = summary.create_file_writer(train_log_dir)
val_summary_writer = summary.create_file_writer(val_log_dir)
test_summary_writer = summary.create_file_writer(test_log_dir)
class Trainer:
def __init__(self,criterion,optimizer,model):
self.criterion=criterion
self.optimizer=optimizer
self.model=model
def get_lr(self):
for param_group in self.optimizer.param_groups:
return param_group['lr']
def loop(self,num_epochs,train_loader,val_loader,test_loader,scheduler=None,acc1=0.0):
self.acc1=acc1
for epoch in range(1,num_epochs+1):
lr=self.get_lr()
print("epoch:{},lr:{:.6f}".format(epoch,lr))
self.train(train_loader,epoch,num_epochs)
#self.val(val_loader,epoch,num_epochs)
self.test(test_loader,epoch,num_epochs)
if scheduler is not None:
scheduler.step() def train(self,dataloader,epoch,num_epochs):
self.model.train()
with torch.enable_grad():
self._iteration_train(dataloader,epoch,num_epochs) def val(self,dataloader,epoch,num_epochs):
self.model.eval()
with torch.no_grad():
self._iteration_val(dataloader,epoch,num_epochs)
def test(self,dataloader,epoch,num_epochs):
self.model.eval()
with torch.no_grad():
self._iteration_test(dataloader,epoch,num_epochs) def _iteration_train(self,dataloader,epoch,num_epochs):
total_step=len(dataloader)
tot_loss = 0.0
correct = 0
#for i ,(images, labels) in enumerate(dataloader):
for images, labels in tqdm(dataloader,ncols=80):
images = images.cuda()
labels = labels.cuda() # Forward pass
outputs = self.model(images)
_, preds = torch.max(outputs.data,1)
loss = self.criterion(outputs, labels)
# Backward and optimizer
self.optimizer.zero_grad()
loss.backward()
self.optimizer.step()
tot_loss += loss.data
"""
if (i+1) % 2 == 0:
print('Epoch: [{}/{}], Step: [{}/{}], Loss: {:.4f}'
.format(epoch, num_epochs, i+1, total_step, loss.item()))
"""
correct += torch.sum(preds == labels.data).to(torch.float32)
### Epoch info ####
epoch_loss = tot_loss/len(dataloader.dataset)
epoch_acc = correct/len(dataloader.dataset)
print('train loss: {:.4f},train acc: {:.4f}'.format(epoch_loss,epoch_acc))
with train_summary_writer.as_default():
summary.scalar('loss', epoch_loss.item(), epoch)
summary.scalar('accuracy', epoch_acc.item(), epoch)
if epoch==num_epochs:
state = {
'model': self.model.state_dict(),
'optimizer':self.optimizer.state_dict(),
'epoch': epoch,
'train_loss':epoch_loss,
'train_acc':epoch_acc,
}
save_path="/content/drive/My Drive/colab notebooks/output/"
torch.save(state,save_path+"/resnet18_final"+".t7")
def _iteration_val(self,dataloader,epoch,num_epochs):
total_step=len(dataloader)
tot_loss = 0.0
correct = 0
#for i ,(images, labels) in enumerate(dataloader):
for images, labels in tqdm(dataloader,ncols=80):
images = images.cuda()
labels = labels.cuda() # Forward pass
outputs = self.model(images)
_, preds = torch.max(outputs.data,1)
loss = self.criterion(outputs, labels)
tot_loss += loss.data
correct += torch.sum(preds == labels.data).to(torch.float32)
"""
if (i+1) % 2 == 0:
print('Epoch: [{}/{}], Step: [{}/{}], Loss: {:.4f}'
.format(1, 1, i+1, total_step, loss.item()))
"""
### Epoch info ####
epoch_loss = tot_loss/len(dataloader.dataset)
epoch_acc = correct/len(dataloader.dataset)
print('val loss: {:.4f},val acc: {:.4f}'.format(epoch_loss,epoch_acc))
with val_summary_writer.as_default():
summary.scalar('loss', epoch_loss.item(), epoch)
summary.scalar('accuracy', epoch_acc.item(), epoch)
def _iteration_test(self,dataloader,epoch,num_epochs):
total_step=len(dataloader)
tot_loss = 0.0
correct = 0
#for i ,(images, labels) in enumerate(dataloader):
for images, labels in tqdm(dataloader,ncols=80):
images = images.cuda()
labels = labels.cuda() # Forward pass
outputs = self.model(images)
_, preds = torch.max(outputs.data,1)
loss = self.criterion(outputs, labels)
tot_loss += loss.data
correct += torch.sum(preds == labels.data).to(torch.float32)
"""
if (i+1) % 2 == 0:
print('Epoch: [{}/{}], Step: [{}/{}], Loss: {:.4f}'
.format(1, 1, i+1, total_step, loss.item()))
"""
### Epoch info ####
epoch_loss = tot_loss/len(dataloader.dataset)
epoch_acc = correct/len(dataloader.dataset)
print('test loss: {:.4f},test acc: {:.4f}'.format(epoch_loss,epoch_acc))
with test_summary_writer.as_default():
summary.scalar('loss', epoch_loss.item(), epoch)
summary.scalar('accuracy', epoch_acc.item(), epoch)
if epoch_acc > self.acc1:
state = {
"model": self.model.state_dict(),
"optimizer": self.optimizer.state_dict(),
"epoch": epoch,
"epoch_loss": epoch_loss,
"epoch_acc": epoch_acc,
"acc1": self.acc1,
}
save_path="/content/drive/My Drive/colab notebooks/output/"
print("在第{}个epoch取得最好的测试准确率,准确率为:{:.4f}".format(epoch,epoch_acc))
torch.save(state,save_path+"/resnet18_best"+".t7")
self.acc1=max(self.acc1,epoch_acc)

首先关注summary.create_file_writer,这个函数的参数是需要存储可视化文件的地址,我们这里有train、val、test。然后是

with test_summary_writer.as_default():
summary.scalar('loss', epoch_loss.item(), epoch)
summary.scalar('accuracy', epoch_acc.item(), epoch)

这之类的。我们把想要可视化的损失和准确率随epoch的变化情况传入到summary.scalar中。summary.scalar接受三个参数,第一个是图的名称,第二个是纵坐标,第三个是横坐标。

之后在test.ipynb中,我们一步步进行操作:

首先进入到train目录下:

cd /content/drive/My Drive/colab notebooks/train

然后输入魔法命令:

%load_ext tensorboard.notebook

接着就可以启动tensorboard了:

%tensorboard --logdir "/content/drive/My Drive/colab notebooks/output/tsboardx/"

启动之后会在该代码块下显示tensorboard的界面。还没有开始训练,所以暂时是看不到变化的。

接下来我们就可以开始训练了:

!python main.py

这里的结果就只截部分了。我们设定了训练100个epoch,batchsize设定为128。这里需要说明的是使用大的batchsize的同时要将学习率也设置大些,我们设置初始的学习率为0.1。并在第40个和第80个epoch进行学习率衰减,每次变为原来的0.1呗。也要切记并不是batchsize越大越好,虽然大的batchsize可以加速网络的训练,但是会造成内存不足和模型的泛化能力不好。

可以发现我们显示的界面还是比较美观的。

最后截图的是测试准确率最高的那个epoch的结果:

在查看tensorboard之前,我们看下存储内容的位置。

就是根据标红的文件中的内容进行可视化的。

最后去看一下tensorboard:

红线代表测试,蓝线代表训练。

至此,网络的训练、测试以及可视化就完成了,接下来是看看整体的目录结构:

下一节,通过在命令行指定所需的参数,比如batchsize等。

【猫狗数据集】利用tensorboard可视化训练和测试过程的更多相关文章

  1. 【猫狗数据集】使用预训练的resnet18模型

    数据集下载地址: 链接:https://pan.baidu.com/s/1l1AnBgkAAEhh0vI5_loWKw提取码:2xq4 创建数据集:https://www.cnblogs.com/xi ...

  2. 【猫狗数据集】使用top1和top5准确率衡量模型

    数据集下载地址: 链接:https://pan.baidu.com/s/1l1AnBgkAAEhh0vI5_loWKw提取码:2xq4 创建数据集:https://www.cnblogs.com/xi ...

  3. 【猫狗数据集】pytorch训练猫狗数据集之创建数据集

    猫狗数据集的分为训练集25000张,在训练集中猫和狗的图像是混在一起的,pytorch读取数据集有两种方式,第一种方式是将不同类别的图片放于其对应的类文件夹中,另一种是实现读取数据集类,该类继承tor ...

  4. 利用tensorboard可视化checkpoint模型文件参数分布

    写在前面: 上周微调一个文本检测模型seglink,将特征提取层进行冻结,只训练分类回归层,然而查看tensorboard发现里面有histogram显示模型各个参数分布,看了目前这个训练模型参数分布 ...

  5. 利用Tensorboard可视化模型、数据和训练过程

    在60分钟闪电战中,我们像你展示了如何加载数据,通过为我们定义的nn.Module的子类的model提供数据,在训练集上训练模型,在测试集上测试模型.为了了解发生了什么,我们在模型训练时打印了一些统计 ...

  6. Pytorch1.0入门实战三:ResNet实现cifar-10分类,利用visdom可视化训练过程

    人的理想志向往往和他的能力成正比. —— 约翰逊 最近一直在使用pytorch深度学习框架,很想用pytorch搞点事情出来,但是框架中一些基本的原理得懂!本次,利用pytorch实现ResNet神经 ...

  7. 【猫狗数据集】谷歌colab之使用pytorch读取自己数据集(猫狗数据集)

    之前在:https://www.cnblogs.com/xiximayou/p/12398285.html创建好了数据集,将它上传到谷歌colab 在colab上的目录如下: 在utils中的rdat ...

  8. kaggle之猫狗数据集下载

    链接:https://pan.baidu.com/s/1l1AnBgkAAEhh0vI5_loWKw 提取码:2xq4 百度网盘实在是恶心,找的别人的网盘下载不仅速度慢,还老挂掉,自己去kaggle下 ...

  9. 猫狗识别——PyTorch

    猫狗识别 数据集下载: 网盘链接:https://pan.baidu.com/s/1SlNAPf3NbgPyf93XluM7Fg 提取密码:hpn4 1. 要导入的包 import os import ...

随机推荐

  1. cesium初探之加载三维模型

    项目需要用到二三维地图切换,本来准备研究ArcGIS js for Web 3d,但考虑到版权的问题,决定试着用cesium来做,于是花了2天时间抱着试试看的心态把cesium从环境配置到加载三维模型 ...

  2. Hadoop_在linux中安装hadopp出现的问题

    问题 sudo: no valid sudoers sources found, quitting 网络解决方法 链接:sudo: no valid sudoers sources found, qu ...

  3. HTML颜色表

    1.配色原则 2.HTML颜色表 颜色名列表 单击一个颜色名或者16进制值,就可以查看与不同文字颜色搭配的背景颜色 3.总参考表:

  4. NIO与IO

    待续... 该文章部分摘自:http://tutorials.jenkov.com/java-nio/index.html 一.I/O简介 I/O(英语:Input/Output),即输入/输出, 指 ...

  5. springboot学习笔记:11.springboot+shiro+mysql+mybatis(通用mapper)+freemarker+ztree+layui实现通用的java后台管理系统(权限管理+用户管理+菜单管理)

    一.前言 经过前10篇文章,我们已经可以快速搭建一个springboot的web项目: 今天,我们在上一节基础上继续集成shiro框架,实现一个可以通用的后台管理系统:包括用户管理,角色管理,菜单管理 ...

  6. Jmeter之压力测试总结

    一.基本概念 1.线程组N:代表一定数量的并发用户,所谓并发就是指同一时刻访问发送请求的用户.线程组就是模拟并发用户访问. 2.Ramp-Up Period(in seconds):建立所有线程的周期 ...

  7. 赫夫曼解码(day17)

    思路: 传入map(字节与对应字节出现的次数)和最后生成的要传送的字节.将他们先转换成对应的二进制字节,再转换成原来的字符串. 代码: 12345678910111213141516171819202 ...

  8. 修改 commit message

    本文为原创文章,转载请标明出处 目录 修改上一条提交的 commit message 修改之前提交的 commit message 1. 修改上一条提交的 commit message git com ...

  9. 初等数论-Base-2(扩展欧几里得算法,同余,线性同余方程,(附:裴蜀定理的证明))

    我们接着上面的欧几里得算法说 扩展欧几里得算法 扩展欧几里德算法是用来在已知a, b求解一组x,y,使它们满足贝祖等式\(^①\): ax+by = gcd(a, b) =d(解一定存在,根据数论中的 ...

  10. NoneBot+酷Q,打造QQ机器人

    NoneBot 是一个基于 酷Q 的 Python 异步 QQ 机器人框架,它会对 QQ 机器人收到的消息进行解析和处理,并以插件化的形式,分发给消息所对应的命令处理器和自然语言处理器,来完成具体的功 ...