最近在学习pytorch实现深度神经网络的教程,强推deeplizard的系列教程,有能力的可以自己去搜索一下原地址,有详细的文字教案和每个part的测试题。虽然是全英文教程但以我托福听力18分的水平(哭了)也全程听完了,另外在优兔上面还可以按快捷键C开启自动字幕,不过这个自动字幕吧感觉开了还不如不开emmm,总之强烈推荐,真的讲的特别好!
B站链接:https://www.bilibili.com/video/av78848066
以下是一个简单的基于pytorch和tensorboard实现深度神经网络训练及数据可视化的栗子:
import torch
import torch.nn as nn
import torch.nn.functional as F
import torch.optim as optim
import torchvision
import torchvision.transforms as transforms
import numpy as np
import matplotlib.pyplot as plt
torch.set_printoptions(linewidth=120)
torch.set_grad_enabled(True)
from torch.utils.tensorboard import SummaryWriter
batch_size = 100
lr = 0.01
train_set = torchvision.datasets.FashionMNIST(
root='./data/FashionMNIST'
,train=True
,download=True
,transform=transforms.Compose([
transforms.ToTensor()
])
)
class Network(nn.Module):
def __init__(self):
super(Network,self).__init__()
self.conv1 = nn.Conv2d(in_channels=1,out_channels=6,kernel_size=5)
self.conv2 = nn.Conv2d(in_channels=6,out_channels=12,kernel_size=5)
self.fc1 = nn.Linear(in_features=12*4*4,out_features=120)
self.fc2 = nn.Linear(in_features=120,out_features=60)
self.out = nn.Linear(in_features=60,out_features=10)
def forward(self,t):
t = F.relu(self.conv1(t))
t = F.max_pool2d(t,kernel_size=2,stride=2)
t = F.relu(self.conv2(t))
t = F.max_pool2d(t,kernel_size=2,stride=2)
t = F.relu(self.fc1(t.reshape(-1,12*4*4)))
t = F.relu(self.fc2(t))
t = self.out(t)
return t
def get_num_correct(preds,labels):
return preds.argmax(dim=1).eq(labels).sum().item()
net = Network()
comment = f'batchsize={batch_size},lr={lr}'
tb = SummaryWriter(comment=comment)
data_loader = torch.utils.data.DataLoader(train_set,batch_size=batch_size)
images,labels = next(iter(data_loader))
grid = torchvision.utils.make_grid(images)
tb.add_images('images',grid.unsqueeze(dim=0))
tb.add_graph(net,images)
optimizer = optim.Adam(net.parameters(),lr=lr)
for epoch in range(5):
total_correct = 0
total_loss = 0
for batch in data_loader:
images,labels = batch
preds = net(images)
loss = F.cross_entropy(preds,labels)
optimizer.zero_grad()
loss.backward()
optimizer.step()
num_correct = get_num_correct(preds,labels)
total_correct += num_correct
total_loss += loss.item()
accuracy = total_correct/len(train_set)
tb.add_scalar('loss',total_loss,epoch)
tb.add_scalar('accuracy',accuracy,epoch)
print(f'epoch:{epoch},total_correct:{total_correct},total_loss:{total_loss},accuracy:{accuracy}')
print('done.')
tb.close()
需要说明的两点:
-
这里使用的dataset是改良版的MNIST:FashionMNIST。我们知道原来的MNIST是一个数字手写体0-9的一个数据库,labels一共有10个,其中train_set有6w个,test_set有1w个。后来出现的FashionMNIST和MNIST基本是一样的,不过内容从简单的手写体变成了衣服/裤子/鞋子。使用torch自带的
torchvision.datasets.FashionMNIST
函数就可以直接从网上下载下来。 -
tensorboard是tensorflow的一个很强大的可视化工具,能很方便的出图(论文就靠你了。。),现在只要版本在1.1.0以上的pytorch也可以使用tensorboard。
查看自己pytorch版本的方法:
import torch print(torch.__version__)
下载tensorboard:
pip install tensorboard -i https://pypi.tuna.tsinghua.edu.cn/simple
这里为了下载的更快些,使用了清华的镜像源。
引入tensorboard的格式:
from torch.utils.tensorboard import SummaryWriter
tensorboard读取文件的默认地址是./runs,在程序里面可以往里面写net, images, loss, accuracy以及net的所有参数。具体实现我上面的程序有部分,更详细地也可以自行百度或者去我发的最上面那个网址里面找讲的教程。
程序跑完过后,在终端里面输入:
tensorboard --logdir=runs
然后就会告诉你tensorboard现在运行的server地址,默认的是:
localhost:6006
随便打开一个浏览器,输入这个地址,就可以看到tensorboard的运行情况啦(如图)