import torch
print(torch.__version__) #注意是双下划线
!pip install torch.optim.optimize
import time
import torch.optim.optimizer
import torchvision
from torch import nn
from torch.nn import Sequential
from torch.utils.data import DataLoader
#from mymodel import *
from torch.utils.tensorboard import SummaryWriter
%load_ext tensorboard
class MyModel(nn.Module):
def __init__(self) -> None:
super().__init__()
#初始化各层
self.model=Sequential(
nn.Conv2d(3,32,5,1,2),
nn.MaxPool2d(2),
nn.Conv2d(32,32,5,1,2),
nn.MaxPool2d(2),
nn.Conv2d(32,64,5,1,2),
nn.MaxPool2d(2),
nn.Flatten(),
nn.Linear(64*4*4,64),
nn.Linear(64,10)
)
def forward(self,x):
output =self.model(x)
return output
start_time=time.time()
#开始训练与测试
for i in range(epoch):
print("-------------------------第{}轮训练开始-----------------------".format(i + 1))
#训练步骤开始
#设置训练状态
mymodel.train()
for data in train_dataloader:
imgs, targets = data
imgs=imgs.cuda()
targets=targets.cuda()
outputs = mymodel(imgs)
loss = loss_fn(outputs, targets)
#优化器优化模型
optimizer.zero_grad()
loss.backward()
optimizer.step()
#打印每一百次的损失值,观察趋势
total_train_step = total_train_step + 1
if total_train_step % 100 == 0:
end_time=time.time()
print("cost_time is : {}".format(end_time-start_time))
writer.add_scalar("train_loss", loss.item(), total_train_step)
print("------------------训练次数:{},Loss:{}-------------------".format(total_train_step, loss.item()))
#测试步骤开始
total_test_loss = 0
total_accuracy = 0
#设置验证状态
mymodel.eval()
with torch.no_grad():
for data in test_dataloader:
imgs, targets = data
imgs=imgs.cuda()
targets=targets.cuda()
outputs = mymodel(imgs)
loss = loss_fn(outputs, targets)
total_test_loss = total_test_loss + loss.item()
accuracy = (outputs.argmax(1) == targets).sum()
total_accuracy = total_accuracy + accuracy
writer.add_scalar("test_loss", total_test_loss, total_test_step)
writer.add_scalar("test_accuracy", total_accuracy.item()/test_datasize, total_test_step)
print("整体测试集上的loss:{}".format(total_test_loss))
print("整体测试集上的正确率:{}".format(total_accuracy.item()/test_datasize))
total_test_step = total_test_step + 1
#保存每一轮训练的参数结果
torch.save(mymodel.state_dict(), "mymodel_{}.pth".format(i + 1))
print("****模型已经保存****")
!tensorboard --logdir cnn_demo_logs #定位tensorboard读取的文件目录
!wget https://bin.equinox.io/c/4VmDzA7iaHb/ngrok-stable-linux-amd64.zip
!unzip ngrok-stable-linux-amd64.zip
LOG_DIR = '/content/cnn_demo_logs'
get_ipython().system_raw(
'tensorboard --logdir {} --host 0.0.0.0 --port 6006 &'
.format(LOG_DIR)
)
get_ipython().system_raw('./ngrok http 6006 &')
! curl -s http://localhost:4040/api/tunnels | python3 -c \
"import sys, json; print(json.load(sys.stdin)['tunnels'][0]['public_url'])"