keras 自定义层input_从4个方面介绍Keras和Pytorch,并给你选择其中一个学习库的理由...

全文共3376字,预计学习时长7分钟
5bb355474db874e1efb22a976762ad76.png

对许多科学家、工程师和开发人员而言,TensorFlow是他们的第一个深度学习框架。

TensorFlow 1.0于2017年2月发布;但客观来说,它对用户不是非常友好。

过去几年里,由于Keras和PyTorch比TensorFlow更容易使用,这两个主要的深度学习库已得到较广的普及。

本文将从四个方面来介绍Keras和Pytorch,以及选择其中一个学习库的理由。

ecdc0cf93e853c31c6d9ef46a59a16fa.png

Keras

Keras自身并不是框架,它其实是一个位于其他高级学习框架之上的高级API。目前,它支持TensorFlow, Theano和CNTK。

Keras的吸引力在于使用简单。它是目前为止启动和运行最快且最简单的框架。神经网络的定义是直观的,使用功能API则允许人们将函数定义为层次。

ecdc0cf93e853c31c6d9ef46a59a16fa.png

Pytorch

Pytorch是由Facebook AI 研究组开发的深度学习框架(如Tensorflow)。像Keras一样,它也提炼了深度网络编程的大多混乱部分。

就编码风格的高级和低级而言,Pytorch介于Keras和TensorFlow之间。使用时,你有比Keras更多的灵活性和控制力,同时还无需冗长的声明式编程。

应该使用哪一个编程框架,是深度学习练习者一直在争论的问题。一般来说,这取决于个人偏好。但在做选择时,需要记住Keras和Pytorch的这几个方面的知识。

fe818e03e7ae2483607e6857d324d767.png
ecdc0cf93e853c31c6d9ef46a59a16fa.png

用于定义模型的类与函数

为了定义深度学习模型,Keras设置了功能API。在功能API的范畴里,神经网络被定义为一组顺序函数,需要接连使用。比如说,函数定义层1的输出是函数定义层2的输入。

img_input = layers.Input(shape=input_shape)x = layers.Conv2D(64, (3, 3), activation='relu')(img_input)x = layers.Conv2D(64, (3, 3), activation='relu')(x)x = layers.MaxPooling2D((2, 2), strides=(2, 2))(x)

而Pytorch将网络设置为一个类,该类拓展了Torch库中的torch.nn模块。与Keras类似,Pytorch使用的层为构建块,但由于它们在Pytorch的类中,因此它们属于‘__init__()’类下的一种字符,并由‘forward()’类执行。

class Net(nn.Module): def __init__(self): super(Net, self).__init__() self.conv1 = nn.Conv2d(3, 64, 3) self.conv2 = nn.Conv2d(64, 64, 3) self.pool = nn.MaxPool2d(2, 2) def forward(self, x): x = F.relu(self.conv1(x)) x = self.pool(F.relu(self.conv2(x))) return xmodel = Net()

因为Pytorch允许访问Python的所有的类功能而不是简单的函数调用,所以定义网络可以更清晰,包容量更多。这真没有什么不好的,除非你认为,尽可能快地编写网络代码对你来说是最重要的,那么Keras使用起来会更方便。

ecdc0cf93e853c31c6d9ef46a59a16fa.png

张量和计算图对比标准数列

对于随意的程序员来说,Keras API隐藏了许多混乱的细节。定义网络层十分直观,通常默认设置就足够入门。

只有你处理到前沿的、或是奇特的模型时,才需要开始着手处理低级、细节的TensorFlow。

然而麻烦的是,当你处理到更低级别的TensorFlow时,随之而来的是所有具有挑战性的部分。必须保证排好所有的矩阵乘法。你甚至不用尝试打印任何一个图层输出,因为你将在终端得到一个漂亮的Tensor定义。

Pytorch对这些方面的要求往往更加宽松。你必须知道每个层输入和输出的大小,但这是一个可以快速掌握的简单技能。不必构建一个无法在调试中直观看到的抽象计算图。

Pytorch的另一个优点是可以在Torch Tensors和Numpy阵列之间来回切换。如果你要做一些自定义的东西,那么在TF张量和Numpy阵列之间来回切换可能会很麻烦。此时,开发人员需要对TensorFlow会话有充分的了解。

Pytorch的交互操作实际上更简单。你只要知道两个操作:一个是将Torch Tensor(一个变量对象)切换为Numpy,另一个就是切换到相反方向。

当然,如果你不需要执行任何花哨的东西,那么Keras就已经足够好了,因为不会遇到任何TensorFlow的阻碍。但如果你需要执行复杂的编程,那么使用Pytorch可能会更顺畅。

ecdc0cf93e853c31c6d9ef46a59a16fa.png

训练模型

854171b2282ede01c3e8f2c8d920bf71.png

在Keras中训练模型非常简单!仅需一个的‘.fit()’,你就可以甩开步子,享受这场“编程之行”。

history = model.fit_generator( generator=train_generator, epochs=10, validation_data=validation_generator)

在Pytorch中训练模型包括几个步骤:

1. 每批训练开始时初始化梯度

2. 运行前进模式

3. 运行后退模式

4. 计算损失并更新权重

for epoch in range(2): # loop over the dataset multiple times  running_loss = 0.0 for i, data in enumerate(trainloader, 0): # Get the inputs; data is a list of [inputs, labels] inputs, labels = data  # (1) Initialise gradients optimizer.zero_grad()  # (2) Forward pass outputs = net(inputs) loss = criterion(outputs, labels)  # (3) Backward loss.backward() # (4) Compute the loss and update the weights optimizer.step()

这些都不过是运行训练的常见步骤!

如此一来,你总能意识到发生了什么。同时,由于这些模型训练步骤在训练不同模型时基本保持不变,因此它们显得十分不必要。

ecdc0cf93e853c31c6d9ef46a59a16fa.png

控制CPU与GPU模式

1cfb12c9508dc1f979464b7a0448004a.png

如果安装了tensorflow-gpu,你可以选择用Keras的默认设置启动并使用GPU。然后,如果你想把某些操作移动到CPU里,可以执行以下单行操作:

with tf.device('/cpu:0'): y = apply_non_max_suppression(x)

至于Pytorch,你必须为每个torch张量和Numpy变量明确指定运行GPU。如果在CPU和GPU之间来回切换来进行不同的操作,这会使代码变得混乱,且有可能容易出错。

例如,要把以前的模型转移到GPU上运行,我们必须执行以下操作:

# Get the GPU devicedevice = torch.device("cuda:0" if torch.cuda.is_available() else "cpu") # Transfer the network to GPUnet.to(device) # Transfer the inputs and labels to GPUinputs, labels = data[0].to(device), data[1].to(device)

Keras赢在它的简洁和良好的默认设置。

ecdc0cf93e853c31c6d9ef46a59a16fa.png

选择框架的一般建议

通常我们建议从Keras入门。

Keras无疑是最容易使用,理解且快速启动和运行的框架。你不用担心它的GPU设置,不需要摆弄抽象代码,总之,你不必做任何复杂的事情。你甚至可以在不触及任何一行TensorFlow 的情况下,执行自定义图层和损失函数的操作。

如果你开始深入了解深层网络的更精细的方面,或者正在执行一些非标准化的东西,那么Pytorch就是首选深度学习库。用Keras的话,就会多一些额外的工作,但不会太多,只不过这会使你的工作效率降低。可是,你依旧可以快速执行,训练和检测网络,而且还能轻松调试!

cf24081d74ef8cf125b21af98040dc95.png

留言 点赞 关注

我们一起分享AI学习与发展的干货

欢迎关注全平台AI垂类自媒体 “读芯术”

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/297734.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

KlayGE 4.0中Deferred Rendering的改进(五)完结篇:Post process

转载请注明出处为KlayGE游戏引擎上一篇分析了KlayGE中实现实时全动态GI的方法,本篇是这个系列的完结篇,主要讲流水线的最后一段:Post process。 Post process 在KlayGE 4.0的Deferred Rendering中,post process主要有HDR、AA和col…

Centos 手工创建新用户

当我们要创建一个用户时,通常使用useradd命令就可以自动创建了一个用户;实际上,在linux下,一切皆文件,设置好几个文件,也是可以创建出一个用户:文件如下:/etc/passwd :用户/etc/sha…

为了这个羞羞的项目,我差点成为“鉴黄师”

全世界只有3.14 % 的人关注了爆炸吧知识转自:大数据文摘编译:蒋宝尚、魏子敏给男同学们一个机器学习,他们能研究所有他们能想到的问题。当然,根据这本真实存在的畅销书,他们真的能想到的话题也不多????开个玩笑&am…

android管理activity顺序,android activity 六个主要函数以及一些调用顺序

Android中一个Activity一般都需要实现六个函数:onCreate(), onStart(), onResume(),onPause(),onStop(),onDestroy().onCreate函数:注册你要用到的变量,比如说service,receiver,这些变量是无论你的Activity是在前台还是在后台都能够被响应到的…

qt绘制一圈圆_Qt绘制圆形,矩形等图形   绘制同心圆

原来Qt也可以绘制图形啊。利用QPainter类来绘制,再辅以其他类,诸如QPen来说明绘制的画笔,QPoint来说明某个点,QPaletee来说明绘制的颜料等等。在QWidget类中来实现虚拟函数oidpaintEvent(QPaintEvent*)。当调用这个QWidget时&…

到成都去是联想的必然选择

“孔雀东南飞,联想西南飞。” 成都一直是笔者最喜欢的城市之一。它又名“蓉”、“锦城”、“锦官城”和“天府之国”。虽然位于中国的中西部,但是科技水平、电脑技术应用和互联网普及水平却远远高于周边地区,经济水平也位列西部各城市首位。再…

【.NET】实现CI/CD(二)运行镜像,自动化部署

(一重山,两重山。)书接上文,在上回中我们说到了《【Azure Core】实现CI/CD(一)构建镜像并推送仓库今天我们继续往下说,说下CD(持续部署)的流程,也是很简单。…

a*算法的时间复杂度_数据结构(1)——算法和时间复杂度

Data Structure1算法和时间复杂度01.什么是数据结构?程序设计 数据结构 算法数据结构是关系,是数据元素相互之间存在的一种或多种特定关系的集合。数据结构和算法凌驾于任何一种编程语言之上。02.逻辑结构和物理结构数据结构分为逻辑结构和物理结构。逻…

新开博客啦

其实决定开一个技术博客很久了,但一直都没找到合适的,博客园的背景确实不错,好像没有其他的广告,算是比较清新的一个网站了吧。 从这里开始,记录自己的学习心得,把自己的学习历程拿出来分享,与你…

C++的enum hack

从一个例子开始吧 class Game { private:static const int GameTurn 10;int scores[GameTurn]; };对于支持类内初始化的C编译器,这段代码可以编译通过。 但是较老的C编译器,可能不支持类内初始化,这样我们的静态常量,必须要在类外…

android vcard解析代码,Android使用vcard文件的方法简单实例

本文实例讲述了Android使用vcard文件的方法。分享给大家供大家参考,具体如下:FileOutputStream os null;try {os VCardTest.this.openFileOutput("Android.vcf", MODE_PRIVATE);} catch (FileNotFoundException e1) {// TODO Auto-generated…

学会了!如果认错人了,就像这样亲一口!

1 千万不要用曲面屏炒股▼2 谁掏钱多就听谁的准没错▼3 你和你妈的通话记录▼4 em......陷入沉思▼5 人类1994年拍摄到的冥王星人类2018年拍摄到的冥王星▼6 猫:你滚开!劳资不要运动!▼7 吃下去长肉了你来找我我给你送实验室研究研究▼…

短文件名漏洞如何修复_短文件名漏洞修复

短文件名漏洞其实在13年时还是很令人耳熟能详的,不过随着所在公司的编码语言转型,目前使用ASP.NET的新项目基本上没有了,而更多的是对原来的采用ASP.NET语言开发的项目进行维护或打个补丁。事出突然,12月的某个下午被项目组喊去帮…

在MinGW下使用DShow的方法

用MinGW编译DShow的东西,经常遇到没找到IBaseFilter的问题。本质上是MinGW的w32api并没有提供完整的DShow头文件所致。经过一番折腾,得到了下面的解决方案: 1. 从http://sourceforge.net/projects/mingw-w64/下载mingw-w64-headers&#xff0…

十个现象,识别程序员的“水份”

大家好,我是Z哥。下周五正好是国庆,我也给自己放个假,就不发文了。所以今天是节前最后一篇文章,先提前祝大家国庆快乐,可以好好放松一下。今天我们不聊干货了,聊点轻松的,来吐槽一下程序员的那些…

android 更改edittext内容,Android如何实时更改edittext的内容

为此使用TextWatcher。设置它的EditText用户类型:myEditText1.addTextChangedListener(new TextWatcher() {Overridepublic void afterTextChanged(Editable s) {String value s.toString();// Perform computations using this string// For example: parse the v…

python循环语句嵌套_Python 循环语句

循环语句 ​循环语句主要是用于解决某些重复的代码工作,使需要重复的代码只写一遍即可。 Python循环语句主要有两种:while循环和for...in...循环。 一、while循环 主要用于不确定循环的次数时,根据条件进行判断,条件成立&#xff…

linux部署的java应用,浏览器访问时,报域名解析错误

工作中,经常需要在Linux环境中部署Tomcat,配置java应用。在浏览器中访问应用时,却报域名解析错误,该怎么样解决呢? 解决方法:关闭防火墙 iptables -L -n    查看已添加的iptables规则 iptables -F se…

那些年,冒死拍过的老师逗逼搞笑照片 !

全世界只有3.14 % 的人关注了爆炸吧知识「你曾经拍到过老师哪个搞笑的瞬间」哈哈哈哈哈哈啊哈哈哈哈已笑疯了拍照的人最后真的都没有被打死吗_石小麦:这张?wanngsh-:当历史老师谈及日本女人2HyFMm:班主任扔实心球曹梓建&#xff1…

程序员吐槽_产品经理吐槽大会,程序员勿入

前两天网上有个程序员吐槽大会我看挺多人在转的,这么公开黑产品经理,除了娱乐效果之外,确实也反映了很多问题。作为一个前程序员,现产品经理,我觉得还是得说几句。首先以产品经理的角度自省,然后我再吐槽一…