想象一个简单的场景,即拥有一个使用一个框架并与数据/机器人等集成的大型存储库,然后请求一个新功能并且该框架缺少另一个框架中可用的一些重要功能(比如一种新的层)。
对于许多数学库,可以很容易地对想要形成另一个框架的特定函数进行逆向工程,以便不导入整个框架,但在深度学习的情况下,这不是那么简单,也不是那么容易测试.
在这些情况下,是否需要对功能进行逆向工程,或者他们是否尝试组合架构?如果是组合,那么集成的最大问题是什么?
想象一个简单的场景,即拥有一个使用一个框架并与数据/机器人等集成的大型存储库,然后请求一个新功能并且该框架缺少另一个框架中可用的一些重要功能(比如一种新的层)。
对于许多数学库,可以很容易地对想要形成另一个框架的特定函数进行逆向工程,以便不导入整个框架,但在深度学习的情况下,这不是那么简单,也不是那么容易测试.
在这些情况下,是否需要对功能进行逆向工程,或者他们是否尝试组合架构?如果是组合,那么集成的最大问题是什么?
自从我提出这个问题以来,我已经能够很好地结合 Tensorflow 和 Chainer。话虽如此,出于以下几个原因,如果可以的话,应该尽量避免组合深度学习框架:
话虽如此,我将它们结合起来是因为一个研究项目的时间限制,该项目不会进入工业产品。在这个研究环境中,我仍然不建议组合框架,如果可以避免的话,但如果这意味着将项目进行概念验证或实验所需的时间增加一倍,那么它似乎是合理的,并且可以大大加快开发速度,直到缺少的功能被添加到所需的框架中。
集成有两个问题:
抽象网络,使主要的训练/测试脚本不依赖于框架。
如果添加了所需框架的缺失功能,这一点很重要。它还可以帮助新开发人员了解整体算法或实验是什么,而不会被框架细节所困扰。
TensorFlow 和需要 Session 对象的类似框架。
Chainer、PyTorch(来自 Chainer)和任何其他不需要 Tensorflow 的 Session 之类的框架都可以很好地协同工作,并且可以(几乎)互换使用。对于基于 Session 的框架,主脚本/循环/实验都必须在 Session 中进行。通过适当的抽象,我的实验只需要with tf.Session() as sess:
在主实验中使用 a ,并且是使用 Tensorflow 的唯一参考。
尽管出于上述原因我仍然不建议组合框架,但如果将其框架调用抽象得足够多,那么集成深度学习框架几乎是无缝的。