tf.keras.layers.GRU理解

#########

tf的官方文档,我根据自己的理解加的注释

##########

encoder_inputs = tf.random.normal([32, 10, 8])

#input_shape=[batch_size, encoder_max_len, embeding_dim]:[32,10,8]

gru = tf.keras.layers.GRU(4)

#return_sequences默认为False,即只返回最后一个单元的output;return_state默认为False,不返回最后一个单元的hidden_state

output = gru(inputs)

print(output.shape)

#只输出最后一个单元的output,所以shape=[32,4]

gru = tf.keras.layers.GRU(4, return_sequences=True, return_state=True)

#return_sequences=True,返回每一个单元的output,encoder_max_len那么长的序列;return_state=True,返回最后一个单元的hidden_state

whole_sequence_output, final_state = gru(inputs)

print(whole_sequence_output.shape)

#输出每个单元的output,所以encoder_output.shape=[32,10,4]

print(final_state.shape)

##########

关于attention接收的是最后一个单元的hidden_state,还是整个序列的hidden_state,还是整个序列的output?

###########

我感觉是没有标准答案的。首选用整个序列的hidden_state,但是老师课上说每个RNN单元的输出就是hidden_state,所以整个序列的hidden_state=整个序列的output(这里是否真的等于我还是怀疑的);其次采用最后一个单元的hidden_state,毕竟包含了前面的序列信息,应该要扩展维度进行计算。但是,我觉得LSTM、GRU是采用了门控机制,最后一个单元的hidden_state过滤了部分信息,所以个人不建议采用。

整个序列的hidden_state=整个序列的output?在GRU里面是肯定的。从下面这个图看得出来


#########

在LSTM里面用什么计算attention?

#########

Attention计算是全局的,每个输出单词都要计算一次。另外,LSTM中,h和c,区别主要是,c可以理解成是记忆主线,h可以理解成短时记忆,h是根据当前输入组合产生的门控信号。H是单个的,c是累积的。

c主要是保存前面单元传过来的记忆信息+这个单元要记忆的,起到记忆作用;h主要还是保存这个单元重要信息的。

所以LSTM用C计算的更好。

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

友情链接更多精彩内容