前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >How to Use the TimeDistributed Layer for Long Short-Term Memory Networks in Python 译文

How to Use the TimeDistributed Layer for Long Short-Term Memory Networks in Python 译文

作者头像
Steve Wang
发布于 2018-03-29 03:33:17
发布于 2018-03-29 03:33:17
1.6K00
代码可运行
举报
文章被收录于专栏:从流域到海域从流域到海域
运行总次数:0
代码可运行

How to Use the TimeDistributed Layer for Long Short-Term Memory Networks in Python

如何在Python中将TimeDistributed层用于Long Short-Term Memory Networks

Long Short-Term Memory Networks或LSTM是一种流行的强大的循环神经网络(即RNN)。

对于任意的序列预测(sequence prediction )问题,配置和应用起来可能会相当困难,即使在Python中的Keras深度学习库中提供的定义良好且“易于使用”的接口上也是如此。

在Keras中遇到这种困难的其中一个原因是使用了TimeDistributed装饰器层,并且需要一些LSTM层来返回序列而不是单个值。

在本教程中,您将了解配置LSTM网络进行序列预测的不同方法、TimeDistributed层所扮演的角色以及如何使用它。

完成本教程后,您将知道:

  • 如何设计一个一对一的LSTM进行序列预测。
  • 如何在没有TimeDistributed层的情况下设计一个多对一的LSTM进行序列预测。
  • 如何利用TimeDistributed层设计一个多对多的LSTM进行序列预测。

让我们开始吧。

如何在Python中使用TimeDistributed层实现Long Short-Term Memory Networks

图片由jans canon提供,保留部分权利。

教程概述

本教程分为5个部分; 他们是:

  1. TimeDistributed层
  2. 序列学习问题
  3. 用于序列预测的一对一LSTM
  4. 用于序列预测的多对一LSTM(不含TimeDistributed)
  5. 用于序列预测的多对多LSTM(带TimeDistributed)

环境

本教程假设你已经安装了带SciPy的Python 2或Python 3开发环境,以及NumPy和Pandas。

该教程还假设已经安装了scikit-learn和keras v2.0 +,并且后端有Theano或TensorFlow其中之一。

有关如何配置及您的Python环境的帮助,请参阅以下文章:

TimeDistributed层

LSTM功能强大,但难以使用,难于配置,尤其是对于初学者来说。

TimeDistributed Layer(以前的_TimeDistributedDense_layer)被隐秘地地描述为一个layer装饰器,这是一个额外的复杂因素:

这个装饰器允许我们在输入的每个时间片上应用一个layer。

如何在LSTM上使用该装饰器,应该在何时使用?

当您在Keras GitHub issues和StackOverflow上搜索该包装饰器层的讨论时,您的困惑将会是多个层面的。

例如,在问题“ 何时以及如何使用TimeDistributedDense ”中,fchollet(Keras的作者)解释道:

TimeDistributedDense对3D张量的每个时间步应用相同的Dense(完全连接)操作。

如果您已经理解了TimeDistributed图层的用途以及何时使用它,这是非常有意义的,但这对初学者毫无帮助,。

本教程旨在消除您在LSTM上使用的TimeDistributed装饰器的疑惑,其中包含了您可以检查,运行和把玩的工作示例,以帮助您进行具体的理解。

序列学习问题(Sequence Learning Problem)

我们将使用一个简单的序列学习问题来演示TimeDistributed层。

在这个问题中,序列[0.0, 0.2, 0.4, 0.6, 0.8]将作为输入一次给出一项,并且必须依次作为输出返回,一次一项。

把它想象成学习一个简单回声的程序。我们给出0.0作为输入,我们期望看到0.0作为输出,对序列中的每个项目来说都是如此。

我们可以像下面这样直接生成这个序列:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from numpy import array
length = 5
seq = array([i/float(length) for i in range(length)])
print(seq)

运行这个例子打印生成的序列:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[ 0.   0.2  0.4  0.6  0.8] 

这个例子是可配置的,如果你喜欢,你可以稍后自己用更长/更短的序列来尝试一下。请在评论中告诉我们你的结果。

用于序列预测的一对一LSTM

在我们深入之前,最重要的是要证明这个序列学习问题可以分段地进行学习。

也就是说,我们可以将问题重构为一个(由序列中每个项目的输入-输出对组成的)数据集。给定0,网络应输出0,给定0.2,网络必须输出0.2,依此类推。

这是问题的最简单的表述形式,并且要求将序列分成输-输出对,并且需要一次一步地预测序列然后在网络之外聚集在一起。

输入输出对如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
X,     y
0.0,    0.0
0.2,    0.2
0.4,    0.4
0.6,    0.6
0.8,    0.8

LSTM的输入必须是三维的。我们可以把2D序列重塑一个具有5个样本、1个时间步和1个特征的3D序列。我们将输出定义为具有1个特征的5个样本。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
X = seq.reshape(5, 1, 1)
y = seq.reshape(5, 1)

我们将网络模型定义为1个时间步有1个输出。第一个隐藏层将是一个5个单元的LSTM。输出层具有1个输出的完全连接层。

该模型将适配高效ADAM优化算法和均方误差损失函数。

批大小(或批尺寸,batch size)被设置为迭代次数(epoch)中的样本数量,以避免必须手动配置LSTM处于有状态(模式)和管理状态的重置,尽管(这些操作)在每个样本被显示给网络之后,为了更新权重可以很容易地完成。 (1个epoch等于使用训练集中的全部样本进行一次训练,译者注)

下面提供了完整的代码清单:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from numpy import array
from keras.models import Sequential
from keras.layers import Dense
from keras.layers import LSTM
# prepare sequence
length = 5
seq = array([i/float(length) for i in range(length)])
X = seq.reshape(len(seq), 1, 1)
y = seq.reshape(len(seq), 1)
# define LSTM configuration
n_neurons = length
n_batch = length
n_epoch = 1000
# create LSTM
model = Sequential()
model.add(LSTM(n_neurons, input_shape=(1, 1)))
model.add(Dense(1))
model.compile(loss='mean_squared_error', optimizer='adam')
print(model.summary())
# train LSTM
model.fit(X, y, epochs=n_epoch, batch_size=n_batch, verbose=2)
# evaluate
result = model.predict(X, batch_size=n_batch, verbose=0)
for value in result:
    print('%.1f' % value)

运行该示例首先会打印出配置网络的结构。

我们可以看到LSTM层有140个参数。这是根据输入数量(1)和输出数量(5是隐藏层中有5个单元)计算的,如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
n = 4 * ((inputs + 1) * outputs + outputs^2)
n = 4 * ((1 + 1) * 5 + 5^2)
n = 4 * 35
n = 140

我们还可以看到,完全连接层只有6个输入参数(5代表来自前一层的5个输入),输出数量(1代表该层有1个神经元)以及乖离率(bias)。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
n = inputs * outputs + outputs
n = 5 * 1 + 1
n = 6
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
_________________________________________________________________
Layer (type)                 Output Shape              Param #
=================================================================
lstm_1 (LSTM)                (None, 1, 5)              140
_________________________________________________________________
dense_1 (Dense)              (None, 1, 1)              6
=================================================================
Total params: 146.0
Trainable params: 146
Non-trainable params: 0.0
_________________________________________________________________

网络(将会)正确地学习预测问题。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
0.0
0.2
0.4
0.6
0.8

用于多对一的序列预测的LSTM(不含TimeDistributed)

在本小节中,我们开发了一个LSTM来一次性输出序列,尽管没有TimeDistributed装饰器层。

LSTM的输入必须是三维的。我们可以将2D序列重塑为具有1个样本、5个时间步长和1个特征的3D序列。我们将输出定义为具有5个特征的1个样本。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
X = seq.reshape(1, 5, 1)
y = seq.reshape(1, 5)

马上,您就可以看到问题定义必须稍微调整,以支持没有TimeDistributed装饰器的用于序列预测的网络。具体来说,输出一个矢量,而不是一次一步地构建输出序列。这种差异听起来很微妙,但了解TimeDistributed装饰器的作用还是很重要的。

我们将该模型定义为一个输入具有5个时间步。第一个隐藏层将是一个5个单位的LSTM。输出层是一个具有5个神经元的完全连接层。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# create LSTM
model = Sequential()
model.add(LSTM(5, input_shape=(5, 1)))
model.add(Dense(length))
model.compile(loss='mean_squared_error', optimizer='adam')
print(model.summary())

接下来,我们将模型适配到500 epoches并且训练数据集中的单个样本的批大小(bach size)为1。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# train LSTM
model.fit(X, y, epochs=500, batch_size=1, verbose=2)

综上所述,下面提供了完整的代码清单。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from numpy import array
from keras.models import Sequential
from keras.layers import Dense
from keras.layers import LSTM
# prepare sequence
length = 5
seq = array([i/float(length) for i in range(length)])
X = seq.reshape(1, length, 1)
y = seq.reshape(1, length)
# define LSTM configuration
n_neurons = length
n_batch = 1
n_epoch = 500
# create LSTM
model = Sequential()
model.add(LSTM(n_neurons, input_shape=(length, 1)))
model.add(Dense(length))
model.compile(loss='mean_squared_error', optimizer='adam')
print(model.summary())
# train LSTM
model.fit(X, y, epochs=n_epoch, batch_size=n_batch, verbose=2)
# evaluate
result = model.predict(X, batch_size=n_batch, verbose=0)
for value in result[0,:]:
    print('%.1f' % value)

运行该示例首先打印配置网络的摘要。

我们可以看到LSTM层有140个参数,如上一节所述。

LSTM单元已被瘫痪掉,并且将各自输出一个单值,向完全连接的层提供5个值的向量作为输入。时间维度或序列信息已被丢弃,并坍缩成5个值的向量。

我们可以看到,完全连接的输出层有5个输入,预期输出5个值。我们可以解释30个被学习的权重如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
n = inputs * outputs + outputs
n = 5 * 5 + 5
n = 30 

网络摘要报告如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
_________________________________________________________________
Layer (type)                 Output Shape              Param #
=================================================================
lstm_1 (LSTM)                (None, 5)                 140
_________________________________________________________________
dense_1 (Dense)              (None, 5)                 30
=================================================================
Total params: 170.0
Trainable params: 170
Non-trainable params: 0.0
_________________________________________________________________

在完成和打印预测序列之前,该模型是适配的,会打印出损失信息,。

序列被正确地重现,但是作为一个整体,而不是像逐步地输入数据(那样)。我们可能已经使用一个密集层(Dense layer)作为第一隐藏层而不是LSTM,因为这种LSTM的使用(方式)没有充分利用它们的序列学习和处理的全部性能。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
0.0
0.2
0.4
0.6
0.8

用于序列预测的多对多LSTM(带TimeDistributed)

在本小节中,我们将使用TimeDistributed图层来处理来自LSTM隐藏层的输出。

使用TimeDistributed装饰器层时要记住两点:

  • 输入必须(至少)是3D。这通常意味着您需要在TimeDistributed 装饰的Dense层之前配置上一个LSTM图层以返回序列(例如,将“return_sequences”参数设置为“True”)。
  • 输出将是3D。这意味着如果TimeDistributed包装的Dense层是输出层,并且您正在预测一个序列,则需要将y阵列调整为3D矢量。

我们可以将输出的样式定义为具有1个样本,5个时间步和1个特征,就像输入序列一样,如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
y = seq.reshape(1, length, 1)

通过设置“return_sequences”参数为true,我们可以定义LSTM隐藏层来返回序列而不是单个值。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
model.add(LSTM(n_neurons, input_shape=(length, 1), return_sequences=True))

这样,每个LSTM单元都会返回一个有5个输出的序列,一个(输出)对应输入数据的一个时间步,而不是像前面的例子那样输出单个输出值。

我们也可以在输出层上使用TimeDistributed来装饰一个完全连接的Dense层,并且只带有一个输出。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
model.add(TimeDistributed(Dense(1)))

输出层中的单个输出值是关键。它强调我们打算从输入序列中的每个时间步中输出一个时间步。恰好我们会一次性处理输入序列的5个时间步。

TimeDistributed通过一次一个时间步在LSTM输出上应用相同的Dense层(相同的权重)来实现这个技巧。通过这种方法,输出层只需要一个连接到每个LSTM单元(加上一个bias)的连接。

出于这个考虑,需要增加训练的epoch(迭代次数)以兼顾到较小的网络容量。我把它从500倍增加到1000倍,以匹配起初的一对一的例子。

综上所述,下面提供了完整的代码清单。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from numpy import array
from keras.models import Sequential
from keras.layers import Dense
from keras.layers import TimeDistributed
from keras.layers import LSTM
# prepare sequence
length = 5
seq = array([i/float(length) for i in range(length)])
X = seq.reshape(1, length, 1)
y = seq.reshape(1, length, 1)
# define LSTM configuration
n_neurons = length
n_batch = 1
n_epoch = 1000
# create LSTM
model = Sequential()
model.add(LSTM(n_neurons, input_shape=(length, 1), return_sequences=True))
model.add(TimeDistributed(Dense(1)))
model.compile(loss='mean_squared_error', optimizer='adam')
print(model.summary())
# train LSTM
model.fit(X, y, epochs=n_epoch, batch_size=n_batch, verbose=2)
# evaluate
result = model.predict(X, batch_size=n_batch, verbose=0)
for value in result[0,:,0]:
    print('%.1f' % value)

运行这个例子,我们可以看到配置网络的结构。

我们可以看到,跟前面的例子一样,我们在LSTM隐藏层中有140个参数。

完全连接的输出则层是一个非常不同的结果。实际上,它完全符合一对一的例子。一个神经元对于前一层中的每个LSTM单元有一个权重,另外一个用于bias输入。

这做了两件重要的事情:

  • 允许将问题重构并像它被定义那样来学习,即一个输入对应一个输出,保持每个时间步的内部过程分离。
  • 通过要求少得多的权重来简化网络,使得一次只处理一个时间步。

一个更简单的完全连接层被应用到从前一层提供的序列中的每个时间步骤,以建立输出序列。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
_________________________________________________________________
Layer (type)                 Output Shape              Param #
=================================================================
lstm_1 (LSTM)                (None, 5, 5)              140
_________________________________________________________________
time_distributed_1 (TimeDist (None, 5, 1)              6
=================================================================
Total params: 146.0
Trainable params: 146
Non-trainable params: 0.0
_________________________________________________________________

再次,网络学习到了序列。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
0.0
0.2
0.4
0.6
0.8 

在第一个例子中,我们可以考虑将问题用时间片重构并且将一个Time Distrubuted layer作为一个更为紧密的实现一对一网络的方法。它甚至可能在更大的规模(空间或时间)上更有效率。

进一步阅读

以下是您可能想要深入了解的TimeDistributed layer的一些资源和讨论。

概要

在本教程中,您了解了如何开发用于序列预测的LSTM网络以及TimeDistributed层的作用。

具体来说,你了解到:

  • 如何设计一对一的LSTM进行序列预测。
  • 如何在不使用TimeDistributed层的情况下设计多对一的LSTM进行序列预测。
  • 如何利用TimeDistributed层设计一个多对多的LSTM进行序列预测。a
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
Linux运维人,该醒醒了,2019年要变天了
外界都说运维只是处于被动低效率手工救火的状态,企业对其重视程度不高,提起运维很多人能联想到的字眼就有“苦逼”、“辛苦”、“加班”、“背锅”。在大数据、人工智能、容器技术的强力加持下,运维这个传统的技术工种已经从“机械劳动”这样的刻板印象中蜕变出来,成为了任何一家技术公司所必须依赖和大力投入的核心技术能力。
马哥linux运维
2019/07/09
2.1K1
Linux运维人,该醒醒了,2019年要变天了
Linux 运维工程师 必掌握的技能 ?
本文探讨了Linux运维工程师必须掌握的关键技能,以满足不断增长的技术需求。涵盖了操作系统管理、网络配置、安全性、脚本编程等方面的技能要求,旨在为Linux运维工程师提供指导,并帮助他们在竞争激烈的IT行业中脱颖而出。
猫头虎
2024/04/07
5360
零基础学Python,推荐本入门书籍帮你打基础!
Python现在非常火,语法简单而且功能强大,很多同学都想学Python!所以小的给各位看官们准备了高价值Python学习视频教程及相关电子版书籍,欢迎前来领取!
python学习教程
2019/07/18
7320
零基础学Python,推荐本入门书籍帮你打基础!
限时领取!全套Linux运维教程,200集实战教学,让你从入门到精通!
根据场主了解,Linux高级运维工程师的起薪在8-10K,1-3年工作经验能拿12-16K,3-5年工作经验能拿年薪30-50W。
养码场
2018/08/10
1.4K0
学神事纪linux运维云计算SER架构师2024分享k8s架构运维微服务
嵌入式项目开发主要涉及硬件与软件的结合,通过嵌入式系统实现特定功能。常见的开发流程包括:
weiranit.fun
2025/04/27
460
想拿高薪?云计算或许是你的跳板!
随着科技的不断进步,云计算作为一项重要的技术趋势,正引领着整个行业的快速发展。越来越多的人开始关注云计算领域,希望通过学习和掌握这一技能来获得更高的薪资。那么,为什么选择云计算作为职业发展方向?学习云计算又能帮助你拿取高薪呢?本文将从多个角度为您全面解析。
网络豆
2024/04/06
1010
想拿高薪?云计算或许是你的跳板!
一篇文章带你解读从初级运维工程师到资深运维专家的学习路线
对于一个不了解运维究竟是做什么的同学,可能或多或少的有听过相关话题的讨论和经过一番搜索所知有了短浅的认识。原来运维就是每天很苦逼的在机房工作,甚至可能干着一些搬服务器、上架服务器、整理网线、打标签、调试网络设备等一系列环节。
杰哥的IT之旅
2020/06/18
4.6K0
6000字带你揭开ICT和云计算技术的神秘面纱!
近年来,随着信息技术的不断发展,诞生出越来越多的新型技术,不管是在校大学生还是在职工作人员,对于新型技术和传统技术的学习是必不可少的,在众多技术当中,ICT和云计算技术成了基石,ICT涵盖了信息技术和通信技术,云计算成为了当今IT领域最热门的技术。所以本文将给大家详细介绍一下ICT和云计算技术,在此过程中,我还会分别介绍华为认证的体系,让我们直接开始。
网络技术联盟站
2023/03/01
2.9K0
6000字带你揭开ICT和云计算技术的神秘面纱!
零基础到精通Linux,从这篇文章开始
正好在最近,看到了一篇不错的资料,其中对于Linux入门学习的描述极其详尽,因此特别摘抄其中段落,制作成思维导图分享给大家。
马哥教育
2018/03/29
2.7K9
零基础到精通Linux,从这篇文章开始
云计算热度不减,如何高效掌握云计算技能?
在“互联网+”、《 中国制造2025》等一系列战略推动和企业自身转型升级的迫切需求下,上云是企业顺应数字经济发展潮流,实现数字化转型的重要路径,企业上云已经成为大势所趋,而云计算无疑是企业更快部署信息化应用的“利器”。
SDNLAB
2019/08/29
8.2K1
云计算热度不减,如何高效掌握云计算技能?
怒肝 Linux 学习路线,这回不难
大家好,我是鱼皮,又花 1 周肝出了 Linux 学习资料全家桶,包括学习路线、命令手册、视频、书籍、文档、实战教程、社区、工具、大厂面试题等,完整分享给大家!
程序员鱼皮
2021/10/11
1.3K0
Linux运维工程师学习成长路线
企鹅号小编
2018/01/03
5K1
Linux运维工程师学习成长路线
2022网络安全技术自学路线图及职业选择方向
每天都有新闻报道描述着新技术对人们的生活和工作方式带来的巨大乃至压倒性影响。与此同时有关网络攻击和数据泄露的头条新闻也是日益频繁。
技术zhai
2022/05/10
2K0
2022网络安全技术自学路线图及职业选择方向
什么是linux云计算?用来做什么?
什么是linux云计算?云计算基于互联网的相关服务的增加、使用和交付模式,涉及通过互联网来提供动态容易扩展而且虚拟化的资源。随时随地、便捷地、随需应变从可配置计算资源共享获取所需的资源,资源可以快速释放。
用户8639654
2021/08/17
2.5K0
Linux运维工程师的就业前景分析
随着移动互联网、O2O、云计算、大数据的发展,Linux运维岗位越来越火爆,薪资不比开发低,学习起来比开发容易很多,许多从事IT行业的朋友纷纷转行,甚至一些小白也开始进行Linux运维培训,通过几个月的学习,进军IT行业。
马哥linux运维
2018/10/25
3.1K0
Linux运维工程师的就业前景分析
云计算职业生涯的四个选择
随着IT技术的日益普及,IT就业市场对云计算的工作岗位需求与日俱增。以下对四个常见的职业生涯以及如何准备面试进行探索。 近年来,许多IT专业人员已经将其简历进行了修改,并微调了他们在云计算方面的职业生涯。 云计算业务将会继续快速增长。根据调研机构Gartner公司的研究报告,公共云服务市场在2017年将增长18%,达到2486亿美元,高于2016年的2092亿美元。各种规模的组织将其业务继续迁移到云端,以利用新的服务和技术。但是,他们需要具备云计算技能的人才来满足他们的业务需求。 想要从事云计算方面的职业
静一
2018/03/27
2.4K0
腾讯CSIG求职加油包!云计算学习启航 | 从基础入门到进阶实战
在技术创新浪潮的推动下,全球云计算领域正在经历一场翻天覆地的变革,云计算生态面临着新的挑战与机遇。
腾讯产业互联网学堂1
2024/06/16
2500
腾讯CSIG求职加油包!云计算学习启航 | 从基础入门到进阶实战
想学云计算,这份入门诀窍请收好
说起云计算,只要在IT行业混,你都不得不竖起耳朵听几下。 是啊,云计算的在IT行业里的热门程度,堪比娱乐圈新一轮影帝诞生。 云计算这个技术,到底有多厉害?可以这么说,对普通开发者而言,了解新技术,是你加薪的第一步。 这个技术到底是什么样的?这个行业到底适不适合现在进场深耕?带着好奇,往下看。 01 这么热门 到底啥是云计算? 网上有好多种关于云计算技术的解释,让人看的着实有点眼花缭乱。 比如,@搜狗百科 这么解释到: 云计算(英文名:Cloud Computing)是通过网络“云”将巨大的数据计算处理程序分
腾讯产业互联网学堂1
2023/05/29
4290
想学云计算,这份入门诀窍请收好
成为鹿晗背后的男人,做高薪微博Linux运维工程师
相信你才被鹿晗搞死微博服务器小惊动了会儿,相信你也为立即处理了微博服务瘫痪的运维小哥点赞,有没有也想成为这样的一个人,一行代码指挥上前台服务器,服务成千上万的网民。 他就是Linux运维工程师。 最近三年来,随着大数据与云计算的应用,Linux运维工程师已经越来越成为业界的宠儿,相关岗位数量增长了150%,平均薪资增长了16%。而相应的,由于这些概念才方兴未艾,大多数运维工程师又没办法自学,只好眼睁睁看着这些高薪岗位被其他人占据。 而自己依旧从事着一些其他的互联网基础工作,被大量加班挤压学习时间,周而复
小小科
2018/05/02
1.6K0
成为鹿晗背后的男人,做高薪微博Linux运维工程师
有钱没人!人才短缺将成云计算快速发展的致命弱点
整理 | 褚杏娟 瑞银分析师将人才短缺风险评为“中等”,但其他人警告:一场人才争夺战即将来临。 受疫情影响,全球大多数企业线下活动受到明显冲击,线上服务的需求激增,也因此带动了云服务市场。赛迪数据显示,2020 年全球云计算市场销售额为 2957. 6 亿美元,增速为 9.8%。在政策推动与市场需求的刺激下,分析者普遍认为,未来几年云市场的强劲发展势头有望保持下去。 但近期,瑞银分析师指出,人才问题可能成为阻碍云计算发展的一个重要因素。瑞银警告称,随着云迁移在疫情期间加速,相关人才需求也在增加。但需求可能超
深度学习与Python
2023/04/01
4730
有钱没人!人才短缺将成云计算快速发展的致命弱点
推荐阅读
相关推荐
Linux运维人,该醒醒了,2019年要变天了
更多 >
LV.1
中国科学院
目录
  • How to Use the TimeDistributed Layer for Long Short-Term Memory Networks in Python
  • 如何在Python中将TimeDistributed层用于Long Short-Term Memory Networks
  • 教程概述
    • 环境
  • TimeDistributed层
  • 序列学习问题(Sequence Learning Problem)
  • 用于序列预测的一对一LSTM
  • 用于多对一的序列预测的LSTM(不含TimeDistributed)
  • 用于序列预测的多对多LSTM(带TimeDistributed)
  • 进一步阅读
  • 概要
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档