最佳的神经网络Python库


130

我正在使用神经网络来解决不同的机器学习问题。我正在使用Python和pybrain,但该库几乎已停产。Python中还有其他好的替代方法吗?



5
现在有了新的竞争者-Scikit Neuralnetwork:有没有人对此有经验?与Pylearn2或Theano相比如何?
Rafael_Espericueta,2015年

1
@Emre:可扩展性与高性能不同。通常,这意味着您可以通过添加更多相同类型的资源来解决更大的问题。当您拥有100台计算机时,即使每台计算机的速度慢20倍,可扩展性仍然胜出。。。(尽管我宁愿为5台机器付出代价,并且同时拥有GPU和多机器规模的优势)。
尼尔·斯莱特

2
因此,使用多个GPU ...在神经网络中没有人会使用CPU进行认真的工作。如果您可以从一两个好的GPU中获得Google级别的性能,那么您将如何处理一千个CPU?
2015年

4
我投票结束这个问题是因为离题,因为这成为了为什么建议和“最佳”问题无法采用这种格式的典型例子。接受的答案在12个月后实际上是不准确的(PyLearn2在那时已从“主动开发”变为“接受补丁”)
Neil Slater

Answers:


116

更新:自从我在14年7月回答这个问题以来,情况已经发生了很大变化,并且一些新玩家进入了这个领域。我特别建议您检查以下内容:

它们每个都有其优点和缺点,因此请全力以赴,看看哪个最适合您的用例。尽管一年前我曾建议使用PyLearn2,但该社区已不再活跃,因此我建议在其他地方使用。我对答案的原始回应包括在下面,但在这一点上与我无关。


PyLearn2通常被认为是python中神经网络和深度学习的首选库。它的设计目的是为了便于进行科学实验,而不是易于使用,因此学习曲线相当陡峭,但是如果您花时间并按照教程进行操作,我想您会对它提供的功能感到满意。从标准的多层感知器到受限的玻尔兹曼机再到卷积网再到自动编码器,应有尽有。它具有强大的GPU支持,并且所有内容都基于Theano构建,因此性能通常都很高。PyLearn2的源代码可以在github上找到

请注意,PyLearn2目前与PyBrain存在相反的问题-PyLearn2并未被抛弃,它正在积极开发中,并且会经常更改。


请注意,nolearn是一个包装,使其他库更易于使用并与sklearn兼容。它本身不是神经网络库,但还是建议使用。在撰写本文时,它主要用于千层面,但是有一些Caffe代码,也许还有其他。
2015年

不确定是否与Marks关于nolearn的评论相同,但是github.com/aigamedev/scikit-neuralnetwork也是某种形式的包装形式。
onaclov2000


哇,这在不到两年的时间里就已经过时了
Martin Thoma

1
为什么省去PyTorch?
Francesco Pegoraro

37

Google的Tensor Flowdocs)是另一个具有自动区分功能的不错的框架。我已经在我的博客上写下了一些有关Google Tensor Flow的快速想法,以及他们在教程中所用的MNIST示例。

另请参阅:我的Tensorflow XOR教程

Lasagnedocs)非常好,因为它使用theano(→您可以使用GPU),并且使其更易于使用。据我所知,烤宽面条的作者赢得了Kaggle Galaxy挑战赛。nolearn很好。这是MNIST的示例网络:

#!/usr/bin/env python

import lasagne
from lasagne import layers
from lasagne.updates import nesterov_momentum
from nolearn.lasagne import NeuralNet

import sys
import os
import gzip
import pickle
import numpy


PY2 = sys.version_info[0] == 2

if PY2:
    from urllib import urlretrieve

    def pickle_load(f, encoding):
        return pickle.load(f)
else:
    from urllib.request import urlretrieve

    def pickle_load(f, encoding):
        return pickle.load(f, encoding=encoding)

DATA_URL = 'http://deeplearning.net/data/mnist/mnist.pkl.gz'
DATA_FILENAME = 'mnist.pkl.gz'


def _load_data(url=DATA_URL, filename=DATA_FILENAME):
    """Load data from `url` and store the result in `filename`."""
    if not os.path.exists(filename):
        print("Downloading MNIST dataset")
        urlretrieve(url, filename)

    with gzip.open(filename, 'rb') as f:
        return pickle_load(f, encoding='latin-1')


def load_data():
    """Get data with labels, split into training, validation and test set."""
    data = _load_data()
    X_train, y_train = data[0]
    X_valid, y_valid = data[1]
    X_test, y_test = data[2]
    y_train = numpy.asarray(y_train, dtype=numpy.int32)
    y_valid = numpy.asarray(y_valid, dtype=numpy.int32)
    y_test = numpy.asarray(y_test, dtype=numpy.int32)

    return dict(
        X_train=X_train,
        y_train=y_train,
        X_valid=X_valid,
        y_valid=y_valid,
        X_test=X_test,
        y_test=y_test,
        num_examples_train=X_train.shape[0],
        num_examples_valid=X_valid.shape[0],
        num_examples_test=X_test.shape[0],
        input_dim=X_train.shape[1],
        output_dim=10,
    )


def nn_example(data):
    net1 = NeuralNet(
        layers=[('input', layers.InputLayer),
                ('hidden', layers.DenseLayer),
                ('output', layers.DenseLayer),
                ],
        # layer parameters:
        input_shape=(None, 28*28),
        hidden_num_units=100,  # number of units in 'hidden' layer
        output_nonlinearity=lasagne.nonlinearities.softmax,
        output_num_units=10,  # 10 target values for the digits 0, 1, 2, ..., 9

        # optimization method:
        update=nesterov_momentum,
        update_learning_rate=0.01,
        update_momentum=0.9,

        max_epochs=10,
        verbose=1,
        )

    # Train the network
    net1.fit(data['X_train'], data['y_train'])

    # Try the network on new data
    print("Feature vector (100-110): %s" % data['X_test'][0][100:110])
    print("Label: %s" % str(data['y_test'][0]))
    print("Predicted: %s" % str(net1.predict([data['X_test'][0]])))


def main():
    data = load_data()
    print("Got %i testing datasets." % len(data['X_train']))
    nn_example(data)

if __name__ == '__main__':
    main()

Caffe是C ++库,但是具有Python绑定。您可以通过配置文件(prototxt)完成大多数工作。它有很多选择,也可以利用GPU。


22

Pylearn依赖Theano,如另一个答案所述,使用该库非常复杂,直到掌握它为止。

同时,我建议使用Theanets。它也建立在Theano之上,但使用起来更容易。确实没有Pylearn的所有功能,但是对于基础工作来说已经足够了。

它也是开源的,因此,您可以根据需要随时添加自定义网络。:)

编辑:2015年12月。最近,我开始使用Keras。它的级别比Theanets低,但功能强大得多。对于基础测试,Theanets是合适的。但是,如果您想在ANN Keras领域进行一些研究,则更加灵活。另外Keras可以使用Tensorflow作为后端。


19

TensorFlow(由Google 发布,于2015-11-09 发布)看起来很有希望。

  • 开源(Apache 2.0许可)(GitHub
  • Python(C ++后端)
  • CPU / GPU
  • 自分化
  • 便携式(甚至适用于移动设备)

在此处输入图片说明

仅供参考:


3
啊!您击败了我:)确实,TensorFlow超级好。比Theano,Torch等大手枪更好的编译时间
Dawny33

@ Dawny33“编译时间”是什么意思?Theano,Torch和大多数情况下,TensorFlow都是以解释方式使用的。
马丁·托马

@moose至少在Theano中,一些代码是用C ++或CUDA编译的。
Franck Dernoncourt 2015年

@FranckDernoncourt好的,但是那段时间真的重要吗?当培训运行约20分钟时,生成CUDA代码所需的时间不只是几秒钟吗?(我该怎么衡量?)
马丁·托马

2
对于合理大小的模型,在Theano中,@ moose生成CUDA / C ++代码大约需要30秒到1分钟。这使调试变得很乏味。要测量CUDA / C ++代码生成时间,可以在Theano函数编译之前/之后进行计时。
Franck Dernoncourt,2015年

8

Pylearn2似乎是选择的库,但是我发现它们的YAML配置文件令人反感。

Python本身被设计为一种简单的原型语言,为什么您使用它自己定义网络属性呢?我们拥有出色的自动补全功能的编辑器,可让您的工作变得更加轻松,而Python不像C ++,在这种情况下,您必须等待较长的构建完成才能运行代码。

另一方面,您必须在没有任何帮助的情况下使用标准文本编辑器来编辑YAML文件,这会使学习曲线更加陡峭。

我可能没有把握大局,但我仍然不明白他们在想什么,我认为代码原型不会慢很多。因此,我正在考虑Theanets或直接使用Theano。


1
起初,YAML文件也让我有点不满意,但是从那以后,我就喜欢配置和代码之间的清晰区分。您可以选择不使用YAML文件的情况下使用Pylearn2,尽管该选项没有充分说明。
麦迪逊2014年5

简而言之,由于这个简单的设计决定,我不会放弃该库。
麦迪逊2014年5

就像麦迪逊所说的,它全部关于分离配置和代码。如果您正在运行一个网络并且知道所有参数,那很好,但是您不知道。通过拆分配置和代码,您可以运行多个网络-不同的隐藏神经元等,并且源代码管理非常简单(如果将其保存在代码中,如何跟踪尝试了哪种配置)。
seanv507

8

我喜欢Blocks,它也是在Theano之上构建的。比PyLearn2更平易近人,比Lasagne更富功能。也写得整整齐齐。

2016年1月更新:

在撰写本文时,Keras的势头最大。它是高度模块化的,可以在Theano和Tensorflow上运行,从而带来了巨大的商机。


是的,如果您可以花点时间来了解Theano,我目前建议您今天在pylearn2上使用块。
麦迪逊

伟大的人建立的伟大的图书馆。
麦迪逊

6

MXNet

  • 用C ++编写,但具有Python(以及其他一些编程语言,如R,Julia和Go)的API
  • 通过自动并行扩展到多GPU和分布式设置。
  • 自动区分
  • 体面的表演:

在此处输入图片说明


5

据我了解,Pylearn2目前可能是大多数人的首选库。这让我想起了一个月前的一篇博客文章,其中列出了所有不同的机器学习库,并有简短说明。

https://www.cbinsights.com/blog/python-tools-machine-learning

您可能对此感兴趣的部分是“深度学习”。关于Pylearn2,他写道

PyLearn2

在Theano之上还建立了一个名为PyLearn2的库,该库为Theano带来了模块化和可配置性,您可以在其中通过不同的配置文件创建神经网络,从而可以更轻松地实验不同的参数。可以说,它通过将神经网络的参数和属性分离到配置文件中来提供更多的模块化。


5

我写了这篇文章,详细介绍了一些我个人的最爱:

Python中最好的机器学习库

由于提到了30多个不同的库,因此我不会在此处全部列出它们,但是它们是最受欢迎的库之一:

(很抱歉,由于我的代表仍小于10,所以无法链接到Github仓库)。

编辑:添加到Github仓库的链接。


您可以在此处评论我的链接吗?我将对其进行编辑并将其添加到您的答案中
Dawny33

现在,我的答案已被批准,我现在拥有所需的代表并能够添加链接。不过谢谢!
srobinson 2015年

您确定scikit-learn是DN软件包吗?
SmallChess


4

只是增加一些资源。最近有一篇论文研究了几种神经网络软件包与深度神经网络之间的差异。

在这里您可以找到信息。看起来TorchTensorFlow是赢家。

注意:并非所有人都在python中。但是,我将其发布以打开讨论。



2

DyNet:动态神经网络工具包。来自{1}:

我们介绍了DyNet,这是一种用于基于网络结构的动态声明来实现神经网络模型的工具包。在Theano,CNTK和TensorFlow等工具包中使用的静态声明策略中,用户首先定义一个计算图(计算的符号表示),然后将示例输入到执行该计算并计算其派生值的引擎中。 。在DyNet的动态声明策略中,计算图的构造大部分是透明的,通过执行计算网络输出的程序代码来隐式构造,并且用户可以自由地为每个输入使用不同的网络结构。因此,动态声明有助于实现更复杂的网络架构,DyNet专门设计为允许用户以其惯用的编程语言(C ++或Python)惯用的方式实现其模型。动态声明的一个挑战是,由于对于每个训练示例都重新定义了符号计算图,因此其构造必须具有较低的开销。为此,DyNet具有优化的C ++后端和轻量级图形表示。实验表明,DyNet的速度比静态声明工具包快或与之相当,并且比另一种动态声明工具包Chainer快得多。DyNet是在Apache 2.0许可下开源发布的,可从以下网站获得:动态声明的一个挑战是,由于对于每个训练示例都重新定义了符号计算图,因此其构造必须具有较低的开销。为此,DyNet具有优化的C ++后端和轻量级图形表示。实验表明,DyNet的速度比静态声明工具包快或与之相当,并且比另一种动态声明工具包Chainer快得多。DyNet是在Apache 2.0许可下开源发布的,可从以下网站获得:动态声明的一个挑战是,由于对于每个训练示例都重新定义了符号计算图,因此其构造必须具有较低的开销。为此,DyNet具有优化的C ++后端和轻量级图形表示。实验表明,DyNet的速度比静态声明工具包快或与之相当,并且比另一种动态声明工具Chainer快得多。DyNet是在Apache 2.0许可下开源发布的,可从以下网站获得:这个http网址

它以前被称为cnn(其python绑定名为pycnn)。


参考文献:

  • {1} Graham Neubig,Chris Dyer,Yoav Goldberg,Austin Matthews,Waleed Ammar,Antonios Anastasopoulos,Miguel Ballesteros,David Chiang,Daniel Clothiaux,Trevor Cohn,Kevin Duh,Manaal Faruqui,Cynthia Gan,Dan Garrette,Yangfeng Ji,Lingpeng Kong ,Adhiguna Kuncoro,Gaurav Kumar,Chaitanya Malaviya,Paul Michel,小田佑介,Matthew Richardson,Naomi Saphra,Swabha Swayamdipta,Pengcheng Yin。DyNet:动态神经网络工具包。https://arxiv.org/abs/1701.03980

2

我建议您使用tensorflow,它正在强大的开发中并支持深度学习。您可以使用高级神经网络API Keras上tensorflow之上运行,是非常简单的使用,仅仅尝试了教程,你一定会喜欢它。


2

火炬

由于它的易用性和与基本Python的相似性,它获得了很多支持。

就像普通的Python一样,它“逐行”运行(通过动态图),并且可以轻松调试-即使使用标准的打印语句。它还与NumPy和其他著名的Python库(例如Scikit Learn)很好地集成在一起。

因为它使建模变得容易,所以它通常适合原型设计和探索新的想法。

它支持多个GPU,并且非常简单。

在此处查看更多功能


尽管以上许多优点使PyTorch比其他常用库更易于使用,但值得一提的是,即将到来的Tensorflow的主要版本默认情况下还将使用动态图创建(也称为eager模式)。这将使其在使用方面可与PyTorch媲美。



1

NeuPy是用于人工神经网络的Python库。NeuPy支持从简单的感知器到深度学习模型的许多不同类型的神经网络。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.