先来说说pytorch 和tensorflow的区别吧
PyTorch 很简洁、易于使用、支持动态计算图而且内存使用很高效,提供大量模块化组件,支持丰富的预训练模型。
PyTorch 上训练一个数据集,可以使用 GPU 来增强其训练过程,因为它们运行在 CUDA上。
PyTorch 开发使用 Visdom完成可视化,但是 Visdom 提供的功能很简单且有限。
PyTorch有两个核心模块:计算图的按需和动态构建Autograd:执行动态图的自动微分可以在下图中看到,图会随着执行过而
改变和执行节点,没有特殊的会话接口或占位符。
TensorFlow ,运行速度慢。TensorFlow 的可视化库名为 TensorBoard。在 TensorFlow 中运行代码时,计算图是以静态方式定义
的。与外部世界的通信是通过 tf.Sessionobject 和 tf.Placeholder 执行,它们是在运行时会被外部数据替换的张量。计算图
的核心优势是能实现并行化或依赖驱动式调度,这能让训练速度更快,更有效率。
pytorch的一些小结:
Tensor是Pytorch中的重要数据结构。函数名后面带_的函数会修改Tensor本身。Tensor不支持的操作可以转换为numpy再转换回来。
torchvsion中实现了常用的图像数据加载功能;Variable封装了Tensor,并提供了自动求导功能;nn为神经网络设计接口,提供了损
失函数,优化器等功能。
t.Tensor(*sizes)创建时不会马上分配空间,系统会计算剩余内存是否足够使用。支持自动广播法则,也可以手动广播。autograd
中的核心数据结构是variable,包含三个主要属性,data保存variable所包含的tensor属性,grad保存data对应的梯度,grad_fn记
录variable的操作历史。autograd底层采用计算图,一种特殊的有向无环图,根据链式求导法则计算梯度,计算图在每次前向传播
时都是从头开始构建,根据需求创建计算图。volatile属性为true的节点不会求导,反向传播的中间缓存会被清空,指定
retain_grapy=True来保存缓存。非叶子节点的梯度在计算完后被清空,使用autograd.grad或者hook技术获取叶子节点的梯度值。
variable默认是不需要求导的,需要将requires_grad设置为true。torch.nn的核心数据结构是Moudle
接下来记录一下用pytorch 实现训练的过程:
NO1.数据加载以及预处理
import torchvision as tv
import torchvision .transforms as transforms
from torchvision.transforms import ToPILImage
show =ToPILImage()
transform=transform.Compose([
transforms.ToTensor(),
transforms.Normalize()
])
NO2.训练与测试集加载
trainset=tv.datasets.C(root,train=True,download=True,transform=transform)
trainloader=t.utils.data.Data.Loader(trainset,batch_size=4,shuffle=True)
testset=tv.datasets.C(root,train=False,download=True,transform=transform)
testloader=t.utils.data.Data.Loader(testset,batch_size=4,shuffle=False)
No3.定义网络
import torch.nn as nn
import torch.nn.functional as F
class Net(nn.Moudle):
def __init__(self):
super(net,self).__init__()
self.conv1=nn.Conv2d(3,6,5)
self.fc1 =nn.Linear(16*5*5,120)
def forward(self,x)
x=F.max_pool2d(F.relu())
x=F.relu(self.fc1(x))
return x
net=Net()
printf(net)
NO4.定义损失函数和优化器
from torch import optim
criterion=nn.CrossEntropyLoss()
optimizer=optim.SGD(net.parameters)
NO5.训练网络
for epoch in range(2)
running_loss=0.0
for i, data in enumerate(trainloader,o)
inputs,labels=data
inputs,labels=Variable(inputs),Variable(labels)
optimizer.zero_grad()
outputs=net(inputs)
loss=criterion=(outputs,labels)
loss.backward()
optimizer.step() //更新参数
running_loss+=loss.data[0]
if i%2000==1999:
printf('[%d,%5s] loss:%.3f'\%(epoch+1,i+1,running_loss/2000))
running_loss=0.0
https://blog.csdn.net/vicky_white/article/details/107470700 深度学习的框架之keras