深度学习框架之pytorch

深度学习框架之pytorch

先来说说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

 

 

 

 

 

 

你可能感兴趣的:(python,pytorch)