我知道Tensorflow使用了象征性的模型构建API,开发人员可以使用它来构建静态计算图。Pytorch提供了命令式编程范例,它可以根据实际情况执行计算。
有谁能帮助我理解Scikit的发展模式--学习,Keras,Caffe和Theano?它们是使用命令式的开发范式还是象征性的API?
发布于 2020-05-26 03:43:52
我不太清楚你的问题的全貌,所以我会尽力的。
首先,我要做一些假设:
Discamer:我是一个ML框架(基于应用神经科学)作者。我很喜欢PyTorch的设计。我的观点可能有偏见,并且局限于我的领域。同时,神经网络框架的发展是交织在一起的,可能主要的框架本身并没有发明解决方案,而是有一个更好的实现。我只能说出一个简短的时间表。
让我们来看看一个早期的神经网络库-- 利布凡
libfann的S设计非常简单,fann_create_standard(num_layers, ...)创建了一个神经网络,fann_train_on_data训练了神经网络,仅此而已。没有办法添加卷积层,有限激活函数,没有优化器变体(它确实支持我们今天认为不如的算法,比如快速备份和模拟退火)。
代码(用于MNIST)通常如下所示:
FANN* ann = fann_create_standard(4, 784, 128, 128, 10);
// Now somehow read your traning data and put it in fann_train_data
// Or alternatively use fann_read_train_from_file, but it reads text files
fann_train_data * data = somehow_read_data();
// Then we train the network with at most 100 epochs and early terminate
// if loss < 0.001
fann_train_on_data(ann, data, 100, 10, 0.001f);如你所见。像GAN或RNN这样的高级网络空间不大。(准确地说,通过干扰内部指针是可能的。但这不是个好主意。)你用一个小参数定义一个网络,训练它,完成它。这正是sklearn的工作方式。
西亚诺更像是迈特提卡,而不是神经网络库。它不是为神经网络而设计的,但实际上可以使用Theano (Ab)来建立神经网络和计算梯度。西亚诺做象征性的数学。给出方程y = 9*sin(3*x) + a。它应用您在拼贴微积分类中学到的步骤来派生y' = 27*cos(3*x)。连锁规则还有所有爵士音乐。
这种功能可能被滥用于神经网络--并不是因为它的效率或什么,但它是有效的。用这种方法解决微积分的缺点可能需要一段时间。长达几分钟的长而宽的递归神经网络(与使用自动梯度的毫秒相比)。用这种方法解决GPT-2的导数可能需要几个月,如果不是几年,或者只是内存不足。
快进到2014年的深度学习热潮。卡菲通过使用原产定义层并允许层之间使用它们的名称来在设计中向前迈出了一大步(在我的选择中,这是逻辑的)。现在,网络体系结构已从API定义的固定形式中解放出来。这使网络从sklearn和libfann使用的简单网络定义中解脱出来,而无需使用Theano进行所有演算。
TensorFlow是系统设计上的一个很大的飞跃。Caffe的问题是,prototxt非常冗长,代码编写也很慢。TensorFlow在代码和b中通过a. express操作解决了Caffe和Theano的问题。应用自动微分代替符号区分。本质上,自动微分是一种计算函数某一点上的导数的方法,如果我们知道它的所有分量的导数,而不实际做微积分的话。从而使TensorFlow能够将所有可能的神经网络表示为张量运算。
我认为TensorFlow的静态特性来自于这样一个事实:只有在网络完全定义和优化之后才能实现自动区分(GPU在2011年TensorFlow首次开发(或当时称为DistBelief )时没有开发得那么好)。
PyTorch是手电筒、Caffe2和其他项目的联合项目。事实上,火炬在TensorFlow之前就已经采用了自动微分和动态图形的方法。但是它没有得到太多的耀斑,因为火炬运行在Lua上而不是Python上。PyTorch就是这样。一个Python和更好版本的火炬。不需要一个完整的计算图,Torch/PyTorch急切地计算表达式,同时保留返回的能力。
Keras最初只是一个包装器,使TensorFlow更易于使用。这很简单。
老实说,TensorFlow之后的一切都是基于自动区分的。唯一的区别是它们是如何执行的,以及它们的执行的局限性。事实上,大多数框架(TensorFlow、PyTorch、Chainer、MXNet、NLTK、tiny,您可以说是它的名字)和一些在TensorFlow (Torch,aurograd)之前使用自动区分的框架。唯一的区别是它们是否支持动态图。现在它们都支持动态图(TF从Tf2.0开始就支持它)。
https://softwareengineering.stackexchange.com/questions/410565
复制相似问题