TensorFlow学习-下

循环神经网络

概念与适用

传统ML算法需要人工提取特征信息,而全连接NN参数太多。而RNN有着挖掘数据中时序信息和语义含义的深度表达的能力。

全连接NN都是从上层到下层,而每层之间的节点没有连接。要预测下一个单词是什么,需要用到当前单词,和之前的单词(如小学语文的补全句子:天空很__)。循环神经网络为了刻画一个序列当前的输出与之前信息的关系。网络会记忆之前的信息,并利用之前的信息影响后面节点的输出。RNN的隐藏层之间的节点是有连接的。

在RNN中,一个重要的概念是:时刻。RNN会对于每一个时刻的输入结合当前模型的状态给出一个输出。

这里写图片描述

RNN中主体结构A的输入除了来自输入层Xt,还有一个循环的边来提供当前时刻的状态。在每一个时刻,RNN的模块A会读取t时刻的输入Xt,并输出一个值ht。同时A的状态会从当前步传递到下一步。因此,RNN理论上可以被看作是同一神经网络结构被无限复制的结果。

但一般会将循环体展开,而不是无限循环,如下图。
这里写图片描述

RNN在每一个时刻会有一个输入Xt,然后根据RNN当前的状态At,提供一个输出ht。而RNN当前的状态At是根据上一时刻的状态A(t-1)和当前的输入Xt共同决定的。从RNN的结构特征可以很容易得出他最擅长解决的问题是与时间序列有关的。

适用于语言识别,语言模型,机器翻译,时序分析

前向传播模型

这里写图片描述
这里写图片描述

LTSM:长短时记忆网络结构

针对不同场景,网络需要记忆的时间长短也是不一样的。有的场景中,有效的上下文很短。如小学的填词,今天天气很好,天空是__的,很容易就知道是蓝色的。而上升到高中的阅读,需要联系上下几段,才能填出一个词语。

LTSM的设计就是为了解决这个问题。LSTM是一个拥有三个“门”结构的特殊网络结构。
这里写图片描述

LSTM就是靠一些“门”结构让信息有选择地影响RNN中每个时刻的状态。“门”结构就是一个使用sigmoid节点和按位做乘法的操作。sigmoid会将输出映射为一个0-1之间的数值,描述有多少信息量可以通过这个结构。

遗忘门:让RNN忘记之前没有用的信息,如看到“被污染”三个字,无论之前再怎么蓝,再怎么好,现在也不会是蓝色的。(但是对于推测情感,还是需要的,可以表示惋惜嘛)。“遗忘门”会根据当前的输入Xt,上一时刻状态Ct-1和上一时刻输出Ht-1共同决定那一部分需要被遗忘。在RNN“忘记”了部分之前的状态后,它还需要从当前的输入补充最新的记忆,这要通过“输入门”完成

输入门:输入门会根据Xt,Ct-1,Ht-1决定哪些部分将进入当前状态Ct。看到“被污染”后,就决定要以及这些信息,这对预测下文有帮助。

https://zhuanlan.zhihu.com/p/27345523
https://www.leiphone.com/news/201701/UIlrDBnwiqoQUbqB.html

In TF

lstm = tf.nn.rnn_cell.BasicLSTMCell(size)

RNN的变种

https://www.cnblogs.com/vpegasus/p/rnn.html

双向循环神经网络

这里写图片描述

深度循环神经网络

这里写图片描述

tf.nn.rnn_cell.MultiLSTMCell()
dropout
tf.nn,rnn_cell.DropoutWrapper()

TensorBoard

保存模型

writer = tf.train.SummaryWriter("/path/to/log/", 
                    tf.get_default_graph())

启动模型

tensorboard --logdir=/path/to/log

加速与并行

使用GPU

with tf.device("/cpu:0"):
    ...
with tf.device("/gpu:1"):
    ...

分布式

cluster = tf.train.ClusterSpec({
    "local" : ["localhost:2222","localhost:2223"]
    })
# 第一个任务
server = tf.train.Server(cluster, 
                        job_name="local", 
                        task_index=0)
/* 第二个任务
server = tf.train.Server(cluster, 
                        job_name="local", 
                        task_index=1)
*/

# 通过server.target生成会话使用TF集群中的资源
sess = tf.Session(
    server.target, config=tf.ConfigProto(
        log_device_placement=True
    )
)

sess.run(job)
server.join()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值