2019-05-06

双向LSTM

1、state拼接

state_fw.shape: (32, 128)
state_bw.shape: (32, 128)
state_h_concat=tf.concat(values=[state_fw_h,state_bw_h],axis=1)
state_h_concat.shape:(32, 256)
最后输出

outputs = (output_fw, output_bw)
output_states = (output_state_fw, output_state_bw)

output_states是一个元组的元组,我个人的处理方法是用c_fw,h_fw = output_state_fw和c_bw,h_bw = output_state_bw,最后再分别将c和h状态concat起来,用tf.contrib.rnn.LSTMStateTuple()函数生成decoder端的初始状态

outputs = (output_fw, output_bw)
output_states = (output_state_fw, output_state_bw)

2、tensor

Tensor不允许直接修改

比如,如果是array的话,一句赋值语句就可以将某个元素的值进行修改,但是,如果用同样的方法处理tensor的话,就会报错:

import tensorflow as tf
tensor_1 = tf.constant([x for x in range(1,10)])
# tensor_1 是一个数值为1到9的张量,希望把中间第五个数值改为0 
tensor_1[4] = 0 

这时就会报错,错误类型是:

TypeError: 'Tensor' object does not support item assignment

所以说tensor是可以分段读取,但是不能直接修改的,有点像“只读”的模式。怎么解决呢?从其他博客中我总结了一个方法,后来自己又想了一个:

# 方法一 : 运用concat函数
tensor_1 = tf.constant([x for x in range(1,10)])
# 将原来的张量拆分为3部分,修改位置前的部分,要修改的部分和修改位置之后的部分
i = 4
part1 = tensor_1[:i]
part2 = tensor_1[i+1:]
val = tf.constant([0])
new_tensor = tf.concat([part1,val,part2], axis=0)
这时候再去打印,就可以看到第五个数已经变成了0。

# 方法二:使用one_hot来进行加减运算
tensor_1 = tf.constant([x for x in range(1,10)])
i = 4
# 生成一个one_hot张量,长度与tensor_1相同,修改位置为1
shape = tensor_1.get_shape().as_list()
one_hot = tf.one_hot(i,shape[0],dtype=tf.int32)
# 做一个减法运算,将one_hot为一的变为原张量该位置的值进行相减
new_tensor = tensor_1 - tensor_1[i] * one_hot

当然,tensor有一个assign的函数,但是他每次更新不能针对于相对位置,而是相当于对整个变量的重新赋值,在某些特定场合下,这个自带函数似乎并不是太好用。

3、Tensor打印

在session里打印

with tf.Session() as sess:
    print(sess.run(new_tensor))   

4、bilstm encode

def bidirectional_dynamic_rnn(
cell_fw, # 前向RNN
cell_bw, # 后向RNN
inputs, # 输入
sequence_length=None,# 输入序列的实际长度(可选,默认为输入序列的最大长度)
initial_state_fw=None,  # 前向的初始化状态(可选)
initial_state_bw=None,  # 后向的初始化状态(可选)
dtype=None, # 初始化和输出的数据类型(可选)
parallel_iterations=None,
swap_memory=False, 
time_major=False,
# 决定了输入输出tensor的格式:如果为true, 向量的形状必须为 `[max_time, batch_size, depth]`. 
# 如果为false, tensor的形状必须为`[batch_size, max_time, depth]`. 
scope=None
--------------------- 
作者:Ai_践行者 
来源:CSDN 
原文:https://blog.csdn.net/qq_41424519/article/details/82112904 
版权声明:本文为博主原创文章,转载请附上博文链接!

5、sq2sq

seq2seq学习,其核心是,使用循环神经网络来将变长的输入序列映射成为一个可变长度输出序列。

6、

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1. tf函数 tensorflow 封装的工具类函数 | 操作组 | 操作 ||:-------------| ...
    南墙已破阅读 10,815评论 0 5
  • 发现一个光影的任意门 梦游云端 光晕似曾相识 再见阳光 今天随手拍了四张,生活真的处处都有美景,越跟巨人接触,越发...
    功夫熊猫水上漂阅读 1,046评论 2 1
  • 又是一年花相似, 岁岁年年人不同。 又到了放烟花的季节, 而你在哪里。 烟花灼灼…… 灿若桃花的青春, 心驶向无声...
    营盘阅读 2,675评论 0 3
  • 能说出爱情的人 其实本心已乱 感动自己的誓言 大多只是想当然 共舞时奔放 却转不过生活的弯 失去方向的人 再相望时...
    水摇绢阅读 1,098评论 1 3
  • 好像才刚刚相遇,却又感觉认识了好久。明明觉得已经对你们的所思所想了如指掌,但偶尔你们的一举一动竟也会让我...
    sh雁渡寒潭阅读 3,895评论 0 0