NELSONZHAO / zhihu

This repo contains the source code in my personal column (https://zhuanlan.zhihu.com/zhaoyeyu), implemented using Python 3.6. Including Natural Language Processing and Computer Vision projects, such as text generation, machine translation, deep convolution GAN and other actual combat code.
https://zhuanlan.zhihu.com/zhaoyeyu
3.5k stars 2.14k forks source link

basic seq2seq 模型训练部分validation loss计算问题 #4

Open yuyue9284 opened 6 years ago

yuyue9284 commented 6 years ago

basic seq2seq 模型训练部分validation loss计算的时候使用的是training decoder的输出。

NELSONZHAO commented 6 years ago

我看了下代码,val和train是分开计算的,可以贴下你说的代码位置吗

yuyue9284 commented 6 years ago

您好,就是cost的定义部分是

cost = tf.contrib.seq2seq.sequence_loss(
            training_logits,
            targets,
            masks)

然后在计算validatoin loss 部分还是调用的cost,虽然输入数据时用的是validation data,但是由于上面cost计算用的是training_logits,最后应该还是用的training decoder的输出,而不是用的predicting decoder。

# 计算validation loss
                validation_loss = sess.run(
                [cost],
                {input_data: valid_sources_batch,
                 targets: valid_targets_batch,
                 lr: learning_rate,
                 target_sequence_length: valid_targets_lengths,
                 source_sequence_length: valid_sources_lengths})
NELSONZHAO commented 6 years ago

Hi,当初我的考虑是这样的。因为train和val的数据都是有label的,所以在计算loss,我全部使用trainhelper,保证他们计算loss时分布一样。如果在val使用infer的话,loss要大的很多,而且数据分布也改变了。test阶段使用infer是因为我们没有了label。所以train和val我都用trainhelper是为了让他们loss具有可比性。

yuyue9284 commented 6 years ago

了解了,谢谢,这个系列太好了,对学习很有帮助👍!