我使用TF作为Keras的后端。我正在使用自定义丢失函数,所以我基本上使用Keras作为TF的包装器。我有一个很大的模型,由4个较小的模型组成,其中3个是经过预先训练和装载的,而第4个是受过训练的。
问题是,在调用
时self.session.run(tf.global_variables_initializer())
TF最终会在尝试在GPU上分配太多内存时出错。该模型本身有大约2.8亿个参数(70密耳是可训练的),TF图有1000万个变量。数学没有加起来的地方。
分配10亿个浮点数应该占用大约4 GB的内存。 TF拥有5.3 GB的VRAM。 10亿个变量应该包括所有存储的激活和梯度以及优化器参数(每个训练的参数1个,使用rmsprop)。
激活非常少,因为我只使用非常小的转换层,因此每1个样本的整个事件的激活应该大约为6.5 MB而我只使用32个批量大小,所以总共208 MB。
你知道这里发生了什么吗?模型几乎不适合或某个地方是否存在更大的问题?
任何建议表示赞赏!
编辑:模型定义代码:https://pastebin.com/6FRczTc0(第一个函数用于4个子模型,第二个函数将它们放在更大的网络中)