我正在使用TensorFlow开发NLP模型。这是Tensorboard上显示的模型图。这个模型被称为“简单模型”。
为了改善结果,我想训练一个联合模型,我在上面的图中复制了标有“模板模型以复制”的块。该块包括两个双向LSTM。联合模型如下所示。
在关节模型中,我们有两个来自简单模型的模板块实例,在上面显示的联合模型图中用“REPLICA 1”和“REPLICA 2”标记。简单模型和联合模型之间的唯一区别在于,在联合模型中,“CRF”块的输入是两个副本的输出的平均值。因此,如果我们在关节模型中只有一个副本,那么它应该产生与简单模型相同的结果。
对于此平均值,我只使用tf.stack
和tf.reduce_mean
,如下所示:
with tf.name_scope("average_logits"):
# Stack the list of logits tensors with rank R into a single
# tensor with rank R+1
logits = tf.stack(logits,
axis=0,
name="stacked_logits")
# Average out this tensor over dimension 0 (models dimension)
self.logits = tf.reduce_mean(logits,
axis=0,
name="average_logits")
现在,在GPU上运行,简单模型占用大约700MB的空间,而联合模型占用大约4GB,我无法找到解释,因为“context_bi-lstm”和“chars”中的变量“块总共最多需要200MB。这个过度分配对我来说是一个问题,因为我有一个8GB的GPU并且想要运行一个包含2个以上副本的模型,并且会产生OOM错误。
所以我不知道记忆力的急剧增加来自何处。我可能会使用tf.stack
和tf.mean_reduce
执行一些非常耗费内存的操作吗?