pytorch reshape_pytorch入门总结指南(1)—import torch as np

本来觉得学个tf和keras就够了,但是用了torch之后觉得真的这个框架太好用了,非常灵活可以很方便的和python语言混编,torch基本可以和cupy并列称为gpu版的numpy,文本部分有torchtext和allenlp,调包有sktorch非常简单的融入到sklearn的生态中,再高层的封装有fast.ai,简直太香了。

考虑到网上的入门教程多且杂,还是打算自己好好整理一下,系统性的学习一下pytroch。

bharathgs/Awesome-pytorch-list​github.com
v2-18c33ba66b5335339740e517975d1df1_ipico.jpg

pytorch的各类详细资源列表。

总结内容包括了,github上的各类高星tutorial(其实内容上基本差不多大同小异的),pytorch中文手册,《deep learning with pytorch》《深度学习框架pytorch快速开发与实战》,《深度学习入门之torch》以及官方文档,说老实话,大部分教程或者书讲的都差不多,还是官网提供的信息量最多最大。


关于torch的背景介绍就算了,网上一大堆,主要讲一下torch的主要功能:

1、和tensorflow、mxnet一样,用于构建各类dl模型;

2、对我来说torch最大的优势之一,当gpu加速版的numpy来用,类似于cupy、cudf这类,cupy目前windows版本支持,而gpu版本的cudf暂时只能在linux下跑,至于rapidsai的cuml,目前功能还是不太完善很多算法没有。

3、也是很重要的一点,tf的原始接口写nn虽然灵活但是麻烦,keras虽然简单但是要做灵活的改变却显得麻烦,pytorch处于比较折中的位置,不像keras那样上手就来(不过torch现在也支持sequential构建nn的功能所以实际上也已经非常简单耐用了),不过引入skorch之后方便得多,很灵活的就能和现有的代码结合起来。 而且可以非常灵活简单的参与到nn的训练过程中来。

4、torch的tensor和numpy的array之间是内存共享的,这意味着二者的转化几乎不消耗什么资源,并且修改其中一个会同时改变另一个的值。而且数据在cpu的内存与gpu的显存中切换也非常简单,直接.to(device)既可以,device设置为cpu或者gpu的地址。


显然,关于torch的使用,一开始就得介绍tensor(张量)的概念,张量很简单。

一个点叫0阶张量,一维数据(向量)是一阶张量,二维数组(矩阵)是二阶张量,三维数组就叫三阶张量,张量是矢量概念的一种推广。

就api来说,torch.tensor和numpy的接口非常类似,事实上,torch也提供了numpy和tensor之间转换的接口。

zcyanqiu:pytorch入坑一 | Tensor及其基本操作​zhuanlan.zhihu.com
v2-9ea3d904583ada60f5311fa4340d6c51_180x120.jpg

v2-451bc2297266dec7374634172531ff25_b.jpg

这个思维导图是真的nice,可以看到torch.实现了基本上所有常用的numpy的处理方法。和cupy还真是。。。相似呢。

下面我们用torch和cupy分别重写一下之前用numpy写的逻辑回归,这一章就结束。

下面是纯numpy撸的简单版逻辑回归的代码

首先导入样本数据:

from 

然后是纯numpy撸的简单版逻辑回归:

import 

然后是cupy撸的:

import 

最后用pytorch撸的:

import 

整体上差别不大,就是pytorch中dot只能针对一维数组,也就是shape为(m,)这样的矩阵,而如果是多维数组则需要使用mm,需要注意的是无论是numpy,cupy还是pytorch,矩阵的直接 “*”都是哈达玛积,也就是各位相乘不求和,而dot或者mm才是正常的矩阵相乘,也就是我们初高中熟悉的“正经”的矩阵乘法,需要注意。

可以看到,torch和numpy之间的差异性很小,如果使用cuda,直接把数据.cuda()到gpu上,那么接下去的运算就都会自动在gpu上运行了,贼方便。

最后用torch的nn撸一个简单快速的:

class 

可以看到pytorch的forward的过程和keras的function api形式一模一样,而torch.nn.sequential也和keras的sequntial模式基本相同,从keras转torch难度很低的。

这么写挺麻烦的,感谢开源的skorch,让这一切变得简单无比:

X

需要注意的是,连续值必须转化为float32格式,离散值必须转化为int64,否则会报错。。。。无语

底层代码不难,有空也可以自己改改。这样包装之后的net就可以和gridsearch,scikit-optimize等一切sklearn-api的其它库之间形成良好的交互了。

skorch.classifier - skorch 0.7.0 documentation​skorch.readthedocs.io

如果需要原始网络结构的属性,直接访问module这个属性就可以了。

torch的生态真的太丰富了,skorch、allenlp、 pytext、fastai等等。明天继续写吧。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值