Seq2Seq(keras)的理解:关于encoder_model和decoder_model

本文详细解读了Keras中的Seq2Seq模型,涉及MLP模型、LSTM的使用、return_sequences和return_state概念,以及三个模型的关系。通过实例和可视化,深入剖析了编码器与解码器的工作原理和关键参数设置。

一、三个model

(一)Seq2Seq之前的keras model:

1、创建模型

# 多层感知机(MLP)模型
from keras.models import Model
from keras.layers import Input, Dense
from keras.utils import plot_model

mnist_input = Input(shape=(784,), name='input')
hidden1 = Dense(512, activation='relu', name='hidden1')(mnist_input)
hidden2 = Dense(216, activation='relu', name='hidden2')(hidden1)
hidden3 = Dense(128, activation='relu', name='hidden3')(hidden2)
output = Dense(10, activation='softmax', name='output')(hidden3)

model = Model(inputs=mnist_input, outputs=output)

# 打印网络结构
model.summary()
model.save(r"xxx.h5")
# 產生網絡拓撲圖
plot_model(model, to_file='模型.png')

在这里插入图片描述

2、模型预测

model = load_model(r"xxx.h5")
model.predict()

(二)Seq2Seq的keras model

完整代码链接: 十分钟介绍 Keras 中的序列到序列学习.
此处会有三个模型需要进行保存

1.训练模型:
from keras.models import Model
from keras.layers import Input, LSTM, Dense

# Define an input sequence and process it.
encoder_inputs = Input(shape=(None, num_encoder_tokens))
encoder = LSTM(latent_dim, return_state=True)
encoder_outputs, state_h, state_c = encoder(encoder_inputs)
# We discard `encoder_outputs` and only keep the states.
encoder_states = [state_h, state_c]

# Set up the decoder, using `encoder_states` as initial state.
decoder_inputs = Input(shape=(None, num_decoder_tokens))
# We set up our decoder to return full output sequences,
# and to return internal states as well. We don't use the 
# return states in the training model, but we will use them in inference.
decoder_lstm = LSTM(latent_dim, return_sequences=True, return_state=True)
decoder_outputs, _, _ = decoder_lstm(decoder_inputs,
                                     initial_state=encoder_states)
decoder_dense = Dense(num_decoder_tokens, activation='softmax')
decoder_outputs = decoder_dense(decoder_outputs)

# Define the model that will turn
# `encoder_input_data` & `decoder_input_data` into `decoder_target_data`
model = Model([encoder_inputs, decoder_inputs], decoder_outputs)



2.推理模型
2.1编码模型
encoder_model = Model(encoder_inputs, encoder_states)
2.2解码模型
decoder_state_input_h = Input(shape=(latent_dim,))
decoder_state_input_c = Input(shape=(latent_dim,))
decoder_states_inputs = [decoder_state_input_h, decoder_state_input_c]
decoder_outputs, state_h, state_c = decoder_lstm(
    decoder_inputs, initial_state=decoder_states_inputs)
decoder_states = [state_h, state_c]
decoder_outputs = decoder_dense(decoder_outputs)
decoder_model = Model(
    [decoder_inputs] + decoder_states_inputs,
    [decoder_outputs] + decoder_states)

总共三个模型!!!!!
初见,抓狂!!!
里面的lstm,state_h, state_c已经特别难理解了,后面还要三个模型,于是放弃治疗了。

二、再次遇见seq2seq

理解seq2seq有几个难点

难点一:lstm

通过可视化的操作理解了lstm
在这里插入图片描述

可视化的理解链接: LSTM这一篇就够了.

难点二:return_sequences和return_state

return_sequences:即返回序列,若为True,则返回每一个序列
要理解这一点,首先要明白rnn的基本原理

以自然语言处理为例:
1、我们的输入通常为字符级即一个一个字输入rnn中,
正常来说每个输入就有一个输出。
2、但是在文本分类或者情感分类中,
我们得到的结果为几个类别,如积极、消极,
从字符上来说明显不对应
3、这就是因为return_sequences=False的结果,
因为RNN会将预测的每个输入作为下一个输入的一起进行输入,
即输入为[y(上一个x的输出),x(当前输入)]
如下图:

在这里插入图片描述

return_sequences=True
就是每个时间步也就是每个x的y都输出来
如下文实验所展示的:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

而return_state则为计算每一个时间步的y即return_sequences的计算方式
如下文实验
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值