RNN学习笔记(疑惑点)

1.RNN中的input:batch_size,time_steps,input_size.
batch_size是数据的批次,将全部数据划分为n批进行训练;
time_steps为时间步,比如输入为一句话,每一步则为每一个字;
input_size为输入数据本身的维度;
(1) 1行数据 * batch = 全部数据
(2) 1行数据被分为了 n个timestep
所以要把输入数据转化为三维。

input_rnn=tf.reshape(input_rnn,[-1,time_step,rnn_unit]) 

2.RNN中层和步的概念:层就是像其余神经网络那样的层;步为时间步。t为时间步time_step,depth为层。相关函数分别是:
tf.nn.rnn_cell.MultiRNNCell 多层
tf.nn.dynamic_rnn 多步
在这里插入图片描述
3.RNN中需要训练的参数:
W、U、V:状态向量、输入向量、输出向量的参数。
在这里插入图片描述

4.RNN中一个cell中并不是只有一个神经元。如图为LSTM架构。(可以看成是神经网络的宽度。)

rnn_cell=tf.nn.rnn_cell.BasicRNNCell(hidden_num)

hidden_num就是每一个里面包含的神经元。
在这里插入图片描述
5.RNN权值共享:a.减少参数;b.看到一种说法:权值共享意味着 RNN 中的每一步都在做相同的事,只是输入不同,因此大大地降低了网络中需要学习的参数。
6.RNN无法解决长期依赖,使用激活函数为softmax会导致梯度消失;激活函数为relu会导致梯度爆炸。
7.RNN如何接纳不定长输入?存疑:
实现层面,可以有两种方式实现处理变长模型,因为是batch输入,所以batch中的样本仍然需要你做padding或者裁剪形成等长的形式。但是对于padding的样本,其实是可以控制它们输入到Lstm中的长度的。tf.nn.dynamic_rnn(basic_cell, X, dtype=tf.float32,
sequence_length=seq_length)

这个API中有一个sequence_length的输入就是做这个的。比如你的batch中有三个样本:
样本1:[5, 3, 6, 3, 5, -1, -1, -1, -1, -1]
样本2:[4, 3, 5, 2, 7, 9, 9, 9, 0, -1]
样本3:[5, 4, 6, 7, 2, 8, 3, 7, 6, 0]
那么对应的length就是[5, 9, 10],这样Lstm就知道你的batch内的每个样本的输入长度是多少了。 另外一种方法是加mask,同样是对于上面三个样本,可以做一个这样的mask[1,1,1,1,1,0,0,0,0,0][1,1,1,1,1,1,1,1,1,0][1,1,1,1,1,1,1,1,1,1]
然后将这个mask矩阵乘到损失函数上去。这样,padding部分的内容就不会有梯度传下来。也能达到处理变长的效果。
另一个例子:

X_batch = np.array([
[[0, 1, 2], [9, 8, 7]], # instance 0
[[3, 4, 5], [0, 0, 0]], # instance 1 (padded with a zero vector)
[[6, 7, 8], [6, 5, 4]], # instance 2
[[9, 0, 1], [3, 2, 1]], # instance 3
])
seq_length_batch = np.array([2, 1, 2, 2])
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值