我正在使用神经网络来解决不同的机器学习问题。我正在使用Python和pybrain,但该库几乎已停产。Python中还有其他好的替代方法吗?
我正在使用神经网络来解决不同的机器学习问题。我正在使用Python和pybrain,但该库几乎已停产。Python中还有其他好的替代方法吗?
Answers:
更新:自从我在14年7月回答这个问题以来,情况已经发生了很大变化,并且一些新玩家进入了这个领域。我特别建议您检查以下内容:
它们每个都有其优点和缺点,因此请全力以赴,看看哪个最适合您的用例。尽管一年前我曾建议使用PyLearn2,但该社区已不再活跃,因此我建议在其他地方使用。我对答案的原始回应包括在下面,但在这一点上与我无关。
PyLearn2通常被认为是python中神经网络和深度学习的首选库。它的设计目的是为了便于进行科学实验,而不是易于使用,因此学习曲线相当陡峭,但是如果您花时间并按照教程进行操作,我想您会对它提供的功能感到满意。从标准的多层感知器到受限的玻尔兹曼机再到卷积网再到自动编码器,应有尽有。它具有强大的GPU支持,并且所有内容都基于Theano构建,因此性能通常都很高。PyLearn2的源代码可以在github上找到。
请注意,PyLearn2目前与PyBrain存在相反的问题-PyLearn2并未被抛弃,它正在积极开发中,并且会经常更改。
Google的Tensor Flow(docs)是另一个具有自动区分功能的不错的框架。我已经在我的博客上写下了一些有关Google Tensor Flow的快速想法,以及他们在教程中所用的MNIST示例。
另请参阅:我的Tensorflow XOR教程
Lasagne(docs)非常好,因为它使用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。
TensorFlow(由Google 发布,于2015-11-09 发布)看起来很有希望。
仅供参考:
Pylearn2似乎是选择的库,但是我发现它们的YAML配置文件令人反感。
Python本身被设计为一种简单的原型语言,为什么您不使用它自己定义网络属性呢?我们拥有出色的自动补全功能的编辑器,可让您的工作变得更加轻松,而Python不像C ++,在这种情况下,您必须等待较长的构建完成才能运行代码。
另一方面,您必须在没有任何帮助的情况下使用标准文本编辑器来编辑YAML文件,这会使学习曲线更加陡峭。
我可能没有把握大局,但我仍然不明白他们在想什么,我认为代码原型不会慢很多。因此,我正在考虑Theanets或直接使用Theano。
据我了解,Pylearn2目前可能是大多数人的首选库。这让我想起了一个月前的一篇博客文章,其中列出了所有不同的机器学习库,并有简短说明。
https://www.cbinsights.com/blog/python-tools-machine-learning
您可能对此感兴趣的部分是“深度学习”。关于Pylearn2,他写道
PyLearn2
在Theano之上还建立了一个名为PyLearn2的库,该库为Theano带来了模块化和可配置性,您可以在其中通过不同的配置文件创建神经网络,从而可以更轻松地实验不同的参数。可以说,它通过将神经网络的参数和属性分离到配置文件中来提供更多的模块化。
我写了这篇文章,详细介绍了一些我个人的最爱:
由于提到了30多个不同的库,因此我不会在此处全部列出它们,但是它们是最受欢迎的库之一:
(很抱歉,由于我的代表仍小于10,所以无法链接到Github仓库)。
编辑:添加到Github仓库的链接。
霓虹灯:
只是增加一些资源。最近有一篇论文研究了几种神经网络软件包与深度神经网络之间的差异。
在这里您可以找到信息。看起来Torch和TensorFlow是赢家。
注意:并非所有人都在python中。但是,我将其发布以打开讨论。
Microsoft Cognition Toolkit(以前称为CNTK)具有 Python API。除其他外,它对于多GPU来说应该是不错的选择:
示例和教程可以在https://github.com/Microsoft/CNTK/tree/master/bindings/python找到
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)。
参考文献:
我建议您使用tensorflow,它正在强大的开发中并支持深度学习。您可以使用高级神经网络API Keras上tensorflow之上运行,是非常简单的使用,仅仅尝试了教程,你一定会喜欢它。
由于它的易用性和与基本Python的相似性,它获得了很多支持。
就像普通的Python一样,它“逐行”运行(通过动态图),并且可以轻松调试-即使使用标准的打印语句。它还与NumPy和其他著名的Python库(例如Scikit Learn)很好地集成在一起。
因为它使建模变得容易,所以它通常适合原型设计和探索新的想法。
它支持多个GPU,并且非常简单。
尽管以上许多优点使PyTorch比其他常用库更易于使用,但值得一提的是,即将到来的Tensorflow的主要版本默认情况下还将使用动态图创建(也称为eager模式)。这将使其在使用方面可与PyTorch媲美。
如果您对性能比较感兴趣,那么Soumith Chintala维护了一组convnet基准,这些基准涵盖了一些已经提到的python框架(TensorFlow,chainer,neon,Theano):