seq2seq_keras
seq2seq_keras copied to clipboard
encoder,decoder不在用一个函数下定义
您好,最近我也在研究encoder-decoder模型做机器翻译。我看了您的代码,有几个地方我有疑问。
- 如果我在定义train_model和inference_model的时候没有放在用一个函数下,在keras里面是不是就不能保证模型中的参数是共享的? 2.而且我想添加断点训练功能怎么办呢?因为train_model加载断点文件后,inference_model会直接受影响吗?
如果是把train model保存到本地的话,再次训练,需要加载后重新从model里把encoder
和decoder
搭建好:
encoder_inputs = model.input[0] #input_1
encoder_outputs, state_h_enc, state_c_enc = model.layers[2].output # lstm_1
encoder_states = [state_h_enc, state_c_enc]
encoder_model = Model(encoder_inputs, encoder_states)
decoder_inputs = model.input[1] #input_2
decoder_state_input_h = Input(shape=(latent_dim,),name='input_3')
decoder_state_input_c = Input(shape=(latent_dim,),name='input_4')
decoder_states_inputs = [decoder_state_input_h, decoder_state_input_c]
decoder_lstm = model.layers[3]
decoder_outputs, state_h_dec, state_c_dec = decoder_lstm(
decoder_inputs, initial_state=decoder_states_inputs)
decoder_states = [state_h_dec, state_c_dec]
decoder_dense = model.layers[4]
decoder_outputs=decoder_dense(decoder_outputs)
decoder_model = Model(
[decoder_inputs] + decoder_states_inputs,
[decoder_outputs] + decoder_states)
,再次训练的时候指定initial_epoch=last_train_epoch
model.fit([vec_encoder_input,vec_decoder_input],vec_decoder_output,batch_size=BATCH_SIZE,epochs=160,validation_split=0.2,initial_epoch=10)
多谢哈。前两天我自己也想到了一个办法,就是在训练的时候我保存了权重文件,并且把模型都做了持久化。后面我重构模型的时候,我load_weights
时,把by_name这个参数调为了True。
不好意思回复这么晚,之前github竟然没给我提示有Issue,邮箱也没收到消息...
没关系哈,客气了,哈哈。你是一直在研究机器翻译吗?我最近也还遇到一些其他问题
我是做时间序列分析的,刚好遇到了文本数据就用seq2seq来处理的
哦哦,了解。
多谢哈。前两天我自己也想到了一个办法,就是在训练的时候我保存了权重文件,并且把模型都做了持久化。后面我重构模型的时候,我
load_weights
时,把by_name这个参数调为了True。
您好,我最近也在做seq2seq,您说的这种方式我有使用,结果和直接训练完后接推断模型结果是不一样的,而且相差很远,您确定这么做是可行的吗?
@ChiuHsin 这个我还没发现,不过你最后的结果是用的什么方式呢?是直接选取下一个概率最大的字,还是说全局的去考虑?
@laughing429 就按照keras example的例子中的那样,根据推断前一个字更新states_value来预测下一个字,预测出来字的概率选取概率最大的那个。您说的从全局考虑是怎么考虑呢?
@ChiuHsin 就是用beam search的方法