Scikit-learn: t-SNE失败,数组不能包含infs或NaN(特定于OSX)

创建于 2016-04-15  ·  108评论  ·  资料来源: scikit-learn/scikit-learn

Darwin-15.0.0-x86_64-i386-64bit
('Python', '2.7.11 |Anaconda custom (x86_64)| (default, Dec  6 2015, 18:57:58) \n[GCC 4.2.1 (Apple Inc. build 5577)]')
('NumPy', '1.11.0')
('SciPy', '0.17.0')
('Scikit-Learn', '0.17.1')

尝试运行t-SNE时

proj = TSNE().fit_transform(X)
ValueError: array must not contain infs or NaNs

然而

np.isfinite(X).all() # True 
np.isnan(X).all() # False
np.isinf(X).all() # False

全栈跟踪:


ValueError                                Traceback (most recent call last)
<ipython-input-16-c25f35fd042c> in <module>()
----> 1 plot(X, y)

<ipython-input-1-72bdb7124d13> in plot(X, y)
     74 
     75 def plot(X, y):
---> 76     proj = TSNE().fit_transform(X)
     77     scatter(proj, y)

/Users/joelkuiper/anaconda/lib/python2.7/site-packages/sklearn/manifold/t_sne.pyc in fit_transform(self, X, y)
    864             Embedding of the training data in low-dimensional space.
    865         """
--> 866         embedding = self._fit(X)
    867         self.embedding_ = embedding
    868         return self.embedding_

/Users/joelkuiper/anaconda/lib/python2.7/site-packages/sklearn/manifold/t_sne.pyc in _fit(self, X, skip_num_points)
    775                           X_embedded=X_embedded,
    776                           neighbors=neighbors_nn,
--> 777                           skip_num_points=skip_num_points)
    778 
    779     def _tsne(self, P, degrees_of_freedom, n_samples, random_state,

/Users/joelkuiper/anaconda/lib/python2.7/site-packages/sklearn/manifold/t_sne.pyc in _tsne(self, P, degrees_of_freedom, n_samples, random_state, X_embedded, neighbors, skip_num_points)
    830         opt_args['momentum'] = 0.8
    831         opt_args['it'] = it + 1
--> 832         params, error, it = _gradient_descent(obj_func, params, **opt_args)
    833         if self.verbose:
    834             print("[t-SNE] Error after %d iterations with early "

/Users/joelkuiper/anaconda/lib/python2.7/site-packages/sklearn/manifold/t_sne.pyc in _gradient_descent(objective, p0, it, n_iter, objective_error, n_iter_check, n_iter_without_progress, momentum, learning_rate, min_gain, min_grad_norm, min_error_diff, verbose, args, kwargs)
    385     for i in range(it, n_iter):
    386         new_error, grad = objective(p, *args, **kwargs)
--> 387         grad_norm = linalg.norm(grad)
    388 
    389         inc = update * grad >= 0.0

/Users/joelkuiper/anaconda/lib/python2.7/site-packages/scipy/linalg/misc.pyc in norm(a, ord, axis, keepdims)
    127     """
    128     # Differs from numpy only in non-finite handling and the use of blas.
--> 129     a = np.asarray_chkfinite(a)
    130 
    131     # Only use optimized norms if axis and keepdims are not specified.

/Users/joelkuiper/anaconda/lib/python2.7/site-packages/numpy/lib/function_base.pyc in asarray_chkfinite(a, dtype, order)
   1020     if a.dtype.char in typecodes['AllFloat'] and not np.isfinite(a).all():
   1021         raise ValueError(
-> 1022             "array must not contain infs or NaNs")
   1023     return a
   1024 

ValueError: array must not contain infs or NaNs

最有用的评论

对于受此影响的任何人,这应该解决它:

conda remove numpy --force -y
pip uninstall numpy -y
conda install numpy

让我知道这是否不适合您。

所有108条评论

与('Scikit-Learn','0.18.dev0')相同

您介意与我共享您的数据X吗?

当然,您要在哪里以什么格式?

2016年4月17日,09:11,康洋[email protected]写道:

您介意与我共享您的数据X吗?


您收到此消息是因为您创建了线程。
直接回复此电子邮件或在GitHub上查看它https://github.com/scikit-learn/scikit-learn/issues/6665#issuecomment -210968577

我的电子邮件是[email protected]
据我所知,有一个函数numpy.save用于将数组保存为.npy格式的二进制文件~~

我在ubuntu 14.04 LTS中测试您的数据
的Python == 2.7.6
scikit学习== 0.17.1
numpy == 1.8.2
scipy == 0.13.3
很好,不会引发ValueError。 测试代码为:
`import numpy
一个= numpy.load('/ root / test.npy')
打印形状
打印numpy.isnan(a).all()#False
打印numpy.isfinite(a).all()#True
打印numpy.isinf(a).all()#False

从sklearn.manifold导入TSNE
proj = TSNE()。fit_transform(a)#[[2.35503527e + 00 1.15976751e + 01] .... [3.29832591e + 00 8.98212513e + 00]]
打印项目


然后,我将numpy,scipy升级到1.11.0、0.17.0,并使用相同的代码进行测试,它也不会引发任何错误。

在OS X El Capitan下与anaconda一起复制为3.5。

Darwin 15.4.0
Python 3.5.1 :: Anaconda custom (x86_64)
numpy 1.10.4
scipy 0.17.0
scikit-learn 0.17.1

示例运行:

import random
from sklearn.manifold import TSNE
random.seed(1)
a = np.random.uniform(size=(100,20))
TSNE(n_components=2).fit_transform(a)

感谢@ ivan-krukov,但我无法在Python 3.3中进行复制。 会尝试3.5

这不适用于linux (4.4.0-21,Ubuntu 16.04)和3.5下的相同软件包。

我使用的是El-Capitan,但无法启动并运行Python 3.5。

有什么更新吗?

我在Anaconda,Py 3.5,sklearn 0.17.1,OSX El Capitan的数据集中遇到了问题。
我可以使用@ ivan-krukov提供的示例重现该错误。

同样的问题。 OS X El Capitan上的Python 2.7.6(0.17)。 在使用Python 2.7.6和0.17的Linux上尝试了相同的代码,并且可以正常工作。

同样的问题。
OSX El Capitan Python 3.5.1
scikit学习== 0.17.1
scipy == 0.17.1

我有同样的问题,非常感谢您解决(或解决方法?)
系统版本:OS X 10.11.5
Python 3.5.1 :: Anaconda 4.0.0(x86_64)
numpy.version.version 1.11.0
scipy.version 0.17.1
sklearn。 版本0.17.1

我还可以使用ivan-krukov的代码示例重现该错误。

使用Python 3.5的OS X EI Capitan出现相同问题

系统版本:OS X 10.11.5
Python 3.5.1 :: Continuum Analytics,Inc.
麻木版本1.11.1
卑鄙的版本0.16.0
sklearn。 版本0.17.1

同样的问题。 尽管我已经注意到,它仅出现在我的数据集的一个子集中,而不是整个事件。 也就是说,如果我对整个数据集执行TSNE,则可以工作,如果我对简化的数据集执行TSNE,则不会。

O_o ;; 只是在这种情况下,如果我重复无法使用的相同“破碎”子集(通过list * 10),那么它将起作用。 将每个向量乘以10无效,但复制日期即可。 仅将列表长度加倍是不够的。 也许这是某种程度的自由运行检查?

@ ivan-krukov我今天忍住了子弹并安装了El Capitan VM。 不幸的是,我无法重现您的问题。

@Concomitant是否可以在https://github.com/scikit-learn/scikit-learn/issues/6665#issuecomment -218365487中给出的独立示例中重现错误?

我使用的是El-Capitan,但无法启动并运行Python 3.5。

@jnothman它似乎并非仅在Python 3.5上发生过,因此,如果您可以尝试使用Python 2.7进行复制(摘录:https://github.com/scikit-learn/scikit-learn/issues/6665#issuecomment-218365487 ) 那很好啊。

@lesteve我可以重现该问题。

import numpy as np
import random
from sklearn.manifold import TSNE
random.seed(1)
a = np.random.uniform(size=(100,20))
TSNE(n_components=2).fit_transform(a)

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/Users/dshank/miniconda3/envs/python3/lib/python3.5/site-packages/sklearn/manifold/t_sne.py", line 866, in fit_transform
    embedding = self._fit(X)
  File "/Users/dshank/miniconda3/envs/python3/lib/python3.5/site-packages/sklearn/manifold/t_sne.py", line 777, in _fit
    skip_num_points=skip_num_points)
  File "/Users/dshank/miniconda3/envs/python3/lib/python3.5/site-packages/sklearn/manifold/t_sne.py", line 832, in _tsne
    params, error, it = _gradient_descent(obj_func, params, **opt_args)
  File "/Users/dshank/miniconda3/envs/python3/lib/python3.5/site-packages/sklearn/manifold/t_sne.py", line 387, in _gradient_descent
    grad_norm = linalg.norm(grad)
  File "/Users/dshank/miniconda3/envs/python3/lib/python3.5/site-packages/scipy/linalg/misc.py", line 115, in norm
    a = np.asarray_chkfinite(a)
  File "/Users/dshank/miniconda3/envs/python3/lib/python3.5/site-packages/numpy/lib/function_base.py", line 1033, in asarray_chkfinite
    "array must not contain infs or NaNs")
ValueError: array must not contain infs or NaNs

但是,遵循相同的代码:

>>> a = np.random.uniform(size=(10000,20))
>>> TSNE(n_components=2).fit_transform(a)
array([[  3.25766047e+11,  -2.74708004e+11],
       [  2.43498802e+11,  -7.68189047e+10],
       [ -6.00107639e+09,  -1.13548763e+11],
       ..., 
       [  3.02794039e+10,   6.64402020e+11],
       [  2.55855781e+10,   5.67932400e+10],
       [  1.42040378e+11,  -7.55188994e+10]])

奇怪

我无法在OSX El Capitan的virtualbox上使用miniconda(带有MKL)从python 3.5.1,numpy 1.11.1,scipy 0.17.1和scikit-learn 0.17.1复制。 稍后,我将尝试使用真正的mac硬件。

另外, @ joelkuiper@Concomitant是否可以请您检查一下是否可以在scikit-learn master分支的当前状态下重现该问题?

@lesteve和其他人,我无法使用先前发布在最新的python 2.7母版上的

系统信息:

Darwin-15.0.0-x86_64-i386-64bit
('Python', '2.7.10 (v2.7.10:15c95b7d81dc, May 23 2015, 09:33:12) \n[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)]')
('NumPy', '1.11.0')
('SciPy', '0.17.0')
('Scikit-Learn', '0.18.dev0')

我在运行OSX El Capitan 10.11.3的真实Mac上再次尝试(带有anaconda的最新numpy scipy和scikit-learn,与@Concomitant在https://github.com/scikit-learn/scikit-learn/issues中报告的设置相同) / 6665#issuecomment-229703129),但也无法重现该问题(尝试运行摘要几次)。

尽管有np.random.seed(1)行,但对于fit_transform的输出却得到了不同的结果,这很奇怪。 这本身可能是一个错误。

尽管有np.random.seed(1)行,但对于fit_transform的输出却得到了不同的结果,这很奇怪。 这本身可能是一个错误。

实际上,我读@Concomitant的代码片段的速度太快了:它应该是np.random.seed(1)而不是random.seed(1) ,否则numpy RNG不能适当地重新播种并且无法获得确定性的结果。

现在我还意识到我太快地阅读了整个讨论,并且该错误仅发生在python 2.7中。 会再试一次。

我也无法在OSX 10.11.3上使用conda的python 2.7.12进行复制。

实际上@Ekliptor可以从

我无法使用OSX 10.11.5复制。 我尝试将Python 2.7.12和3.5.2与conda以及numpy 1.11.1,scipy 0.17.1和scikit-learn 0.17.1一起安装。

我不知道该怎么办。 如果其中一个可以重现该问题,请尝试找到引发该问题的numpy随机种子(使用np.random.seed(my_seed)而不是上述代码段中的random.seed(1) ),并在此处传达值(以及OSX的版本和python软件包)。

我可以确认此问题已在最新版本中解决。 我再也不能像以前那样复制它了。
我只更新了numpy:
numpy.version.version 1.11.1

对于使用Tensorflow的所有人,我可以添加:
当我尝试绘制一个非常小的样本(<200点)时,有时仍然会遇到此错误。 增加样本量后,我将其传递到tsne.fit_transform()中,它始终有效。

感谢@Ekliptor检查它是否与scikit-learn master一起使用。 @joelkuiper@Concomitant是否确认scikit-learn master也适用于您? 如果是这样,我们可以解决此问题。

我安装了master,该代码段现在可以正常运行。

似乎现在适合每个人。 关闭。

抱歉,但在Mac OS 10.11.5上的Python 3.5.1,scikit 0.17,scikit-learn 0.18(提交9e913c04d748)和Numpy 1.11.1上仍然可以找到它。

@dmyersturnbullhttps://github.com/scikit-learn/scikit-learn/issues/6665#issuecomment -218365487运行代码片段时出现错误?

@lesteve我使用了确切的片段,是的。 但是,在清除Anaconda安装并使用Python 3.5.2从头开始重新安装后,我不再得到它。

我在Mac OS X El Capitan 10.11.3上遇到了Python 3.5.2,scikit-learn 0.17.1,scipy 0.17.1,numpy 1.11.1相同的问题。 当我的得分超过2100点时,它可以工作,但对于较低的值却不能。

我在Mac OS X El Capitan 10.11.3上遇到了Python 3.5.2,scikit-learn 0.17.1,scipy 0.17.1,numpy 1.11.1相同的问题。 当我的得分超过2100点时,它可以工作,但对于较低的值却不能。

类似地,低点值失败

请重新打开

我在OS X 10.11.6,python 3.5.1,sklearn 0.17.1和numpy 1.11.1上遇到相同的问题。
在此数据集上: https ://dl.dropboxusercontent.com/u/103591/vals.out(带有np.savetxt)

类似地,低点值失败

@Lucidyan我不明白你的意思。

我在OS X 10.11.6,python 3.5.1,sklearn 0.17.1和numpy 1.11.1上遇到相同的问题。
在此数据集上: https ://dl.dropboxusercontent.com/u/103591/vals.out(带有np.savetxt)

@pbnsilva您可以尝试下面发布的此代码段吗? 您可能需要运行多次,因为不幸的是种子设置不正确(您需要使用np.random.seed而不是random.seed )。

import random
from sklearn.manifold import TSNE
random.seed(1)
a = np.random.uniform(size=(100,20))
TSNE(n_components=2).fit_transform(a)

奖励积分,如果你能找到一个种子参数np.random.seedrandom_state参数TSNE ,使片断确定性。

或者,有些人报告此错误已在master中修复。 您能否尝试构建scikit-learn master来查看问题是否消失?

@lesteve我的意思是,在少数实例中,使用相同的系统参数,我会遇到相同的错误(在Mac OS X El Capitan上,Python 3.5.2,scikit-learn 0.17.1,scipy 0.17.1,numpy 1.11.1 10.11.3)

@pbnsilva您可以尝试下面发布的此代码段吗? 您可能需要运行多次,因为不幸的是种子设置不正确(您需要使用np.random.seed而不是random.seed)。

我尝试了它,但由于X_SIZE <= 1750(Y_SIZE = 20,n_components = 2成为常量)而失败。 如果我开始以固定的X_SIZE = 1750更改常量(增加),它也会失败。

@Lucidyan您可以使用scikit-learn master尝试相同的代码段,看看是否也失败了吗?

是的,对我不起作用(numpy 1.11.1,El capitan.10.11,sklearn 0.17.1,python 3.5.2)令人讨厌的是,它破坏了起作用的旧代码。 你们改变了什么...?

@ act65我们非常渴望深入了解这个问题,但是我们一直无法复制,很不幸,到目前为止,似乎我们收到的用户报告还很多。

因此,如果您还没有(不幸的是,我们不是介意读者,并且“不为我工作”不会告诉我们您尝试了什么),那么您可以尝试运行上面https://github.com/scikit-learn中提到的代码段

然后,如果您可以尝试直接安装的0.18发行候选版本,那真是太棒了(强烈建议在单独的virtualenv或conda env中进行安装):

pip install --pre scikit-learn -U

编辑:0.18已发布,因此您可以使用(无需使用--pre ):

pip install scikit-learn -U

然后重新运行该代码段,以查看该代码是否已在0.18中修复,因为某些用户已经在此线程中进行了报告。

0.18将会在几周内发布,如果不是几天的话,因此,如果您想帮助我们在发布之前深入了解此问题,您将知道该怎么做;-)。

是的,我不好,应该更清楚了。 (我只是在MNIST上尝试过其他人也做过的事情)。

无论如何,它有效! 谢谢 :)
pip install --pre scikit-learn -U修复了它

好的,感谢您的回复,很高兴得知此问题已在0.18版本中为您解决了! 这似乎与其他人说的已在master中修复的报告相匹配。

不过,出于完整性考虑,建议坚持使用生产代码的发布版本,因此您可能需要再等一会儿,直到0.18版本发布。

@lesteve
我在0.18rc2版本上尝试了该代码段

pip install --pre scikit-learn -U

看来可行! 干杯!

感谢@Lucidyan尝试一下。

抱歉,在conda env中升级到scikit-learn 0.18( pip install --pre scikit-learn -U )后,上面的代码片段仍然出现此错误。

这是我的系统信息:
OS X El Capitan版本10.11.4
Python 2.7.12
sklearn 0.18(在sklearn 0.17.1上也得到了相同的错误)
numpy 1.11.1(在numpy 1.11.2上也遇到了相同的错误)
scipy 0.18.1

但是,我在Linux系统上运行了相同的代码段,但没有收到错误。
Linux系统的系统信息为:
Ubuntu 14.04.5 LTS(GNU / Linux 3.13.0-91-通用x86_64)
Python 2.7.6
斯克莱恩0.18
numpy的1.11.2
scipy 0.13.3

尝试卸载并重新安装numpy,scipy和scikit-learn。 如果仍然失败,请尝试使用其他virtualenv(如果使用的是conda,则尝试使用conda环境),以确保Python环境中没有问题。

仍然通过conda在sklearn 0.18( 0.18-np111py35_0 )中得到相同的错误( ValueError: array must not contain infs or NaNs )。 拨轮似乎工作正常!

仍然通过conda在sklearn 0.18(0.18-np111py35_0)中得到相同的错误(ValueError:数组不能包含infs或NaN)。 拨轮似乎工作正常!

嗯,很有意思。。。您可以尝试不使用mkl的conda软件包,例如conda create -n sklearn_nomkl python scikit-learn nomkl这样的东西,以便我们看看这是MKL还是openblas吗?

如果您可以提供一个片段以固定随机种子(例如,使用np.random.RandomState(some_int) )重现该问题,则还可以加分,该种子可以用作以后的参考片段。 到目前为止,我们拥有的代码段是不确定的(使用random.seed ,并且不影响numpy.random种子)。

好没问题。 确实这可能是BLAS问题, conda create -n sklearn_nomkl python scikit-learn nomkl env可以正常工作。

关于摘要...这变得很有趣。 例如,

from sklearn.manifold import TSNE
from sklearn.model_selection import train_test_split
from sklearn.datasets import load_digits

digits = load_digits()

X_train, X_test, y_train, y_test = train_test_split(digits.data, 
                                                    digits.target, 
                                                    random_state=1)

tsne = TSNE(random_state=1)
digits_tsne_train = tsne.fit_transform(X_train)

在我的机器上重现该问题。 但是,当我将digits_tsne_train = tsne.fit_transform(X_train)替换digits_tsne_train = tsne.fit_transform(digits.data)这似乎很好。 可能会找到一个更轻量的示例,将此特殊情况添加到travis测试中将是一个很好的选择。

编辑:虹膜也是如此。 iris.data可在fit_transform中工作,但拆分后的数据集( X_train )无效。 也许在train_test_split有一些有趣的事情。 但是, X_trainiris.data似乎都是float 64数组...

那么来自https://github.com/scikit-learn/scikit-learn/issues/6665#issuecomment -243782185的代码片段又如何呢?您没有找到一种确定性的方法,但仍然无法在您的计算机上运行?

片段

import numpy as np
from sklearn.manifold import TSNE

np.random.seed(1)

a = np.random.uniform(size=(100, 20))
TSNE(n_components=2, random_state=1).fit_transform(a)

重现错误(但在nomkl env上可以正常工作)

好,非常感谢,至少现在有了确定性代码段。 作为记录,您是否可以发布此代码段的输出:

import platform; print(platform.platform())
import sys; print("Python", sys.version)
import numpy; print("NumPy", numpy.__version__)
import scipy; print("SciPy", scipy.__version__)
import sklearn; print("Scikit-Learn", sklearn.__version__)

此外,仅出于理智考虑,您是否可以确保可以在新的conda环境中重现该问题。

老实说,我不确定我们从那里去了。 此后我还没有尝试过,但是我无法在El Capital Virtual盒子上进行复制, @ ogrisel也无法在OSX笔记本电脑上进行复制,因此他当时说可能涉及某些特定于硬件的问题。

当然,

导致此问题的机器:

Darwin-16.1.0-x86_64-i386-64bit
Python 3.5.2 |Continuum Analytics, Inc.| (default, Jul  2 2016, 17:52:12) 
[GCC 4.2.1 Compatible Apple LLVM 4.2 (clang-425.0.28)]
NumPy 1.11.2
SciPy 0.18.1
Scikit-Learn 0.18

(在新鲜的conda环境中测试过)

可能涉及某些特定于硬件的问题。

我认为您可能正在做某事! 我在另一台Mac上尝试过,在那儿工作正常。 唯一的区别是上面的输出运行在较旧的内核( Darwin-15.6.0-x86_64-i386-64bit )上。 尚未将第二台Mac更新为macOS Sierra,后者正在存在此问题的前一台计算机上运行。 可能与操作系统有关。 我将在下个月左右将第二台计算机升级到Sierra(我在项目的中间,不想破坏事情),但是我可以告诉您Sierra的更新是否导致此问题。第二台机器(或者其他使用macOS Sierra的人可以对其进行测试,以便我们现在就可以确定它是操作系统)

鉴于已经在不同的OSX版本上报告了该问题,我有点怀疑这只是OSX版本的问题。 IIRC @ogrisel的直觉是它与CPU体系结构有关。

调试此问题的另一种(更耗时的)方法是跟踪NaN在代码中出现的位置。

IIRC @ogrisel的直觉是它与CPU体系结构有关。

嗯,conda scikit-learn版本与pip wheel有何不同? 因为后者似乎可以在同一台机器上工作。 也许与co​​nda有某种关系

调试此问题的另一种(更耗时的)方法是跟踪NaN在代码中出现的位置。

我注意到https://github.com/scikit-learn/scikit-learn/blob/master/sklearn/manifold/t_sne.py#L387中的渐变爆炸,直到它在一个位置变成-infhttps://github.com/scikit-learn/scikit-learn/blob/master/sklearn/manifold/t_sne.py#L386 for循环中的第25次迭代

...
   0.00000000e+00   0.00000000e+00   0.00000000e+00   0.00000000e+00
   0.00000000e+00   0.00000000e+00   6.06587795e+32  -1.10699515e+33
  -1.55245133e+34              inf  -1.52569936e+33  -3.43926080e+33
  -1.92332051e+32  -2.73996151e+32  -2.57570880e+33  -3.64962271e+33
...

在另一台机器(运行良好的那台机器)上,在相同的迭代之后,梯度都<0。 因此,某种程度上_gradient_descent函数无法正常工作(可能是由于BLAS引起的)。

嗯,conda scikit-learn版本与pip wheel有何不同? 因为后者似乎可以在同一台机器上工作。 也许与co​​nda有某种关系

小齿轮正在使用OpenBLAS,并且在使用带有conda的OpenBLAS时(通过nomkl技巧),您没有问题,所以这看起来确实像MKL问题,最重要的是它可能与CPU有关。

很好,调试问题的方式! 如果您设法进一步隔离问题(例如,在迭代inf出现之前对数据进行腌制),则

鉴于最新发现,是否应该重新开始这个问题? 我也打了它,也设法用nomkl技巧克服了它,但是感觉像是一个活动的bug,而不是一个封闭的bug,不是吗?

其他遇到这种情况的人: https :

你是对的,重新打开。 这是一个严肃的问题,似乎是特定于硬件的,没有一个核心开发人员可以复制它。 可以解决此问题的唯一方法是,如果有问题的人花一些时间进一步调试问题。

很好,调试问题的方式! 如果您设法进一步隔离问题(例如,在迭代出现之前对数据进行腌制),则可获得加分。 该问题很可能出现在sklearn / manifold / _barnes_hut_tsne.pyx中的某些cython代码中。

在11月的所有截止日期之后,我很高兴在12月进一步研究它。但是,即使可以将其进一步隔离,我很好奇是否有针对此类硬件特定问题的解决方案。 也许,在此问题完全解决之前,如果渐变包含有关此问题的infs可能值得提出更具体的例外/警告?

我刚刚创建了一个新的conda virtualenv,并从sciki-learn master分支中新创建的源代码中构建了sklearn的devp版本,该错误消失了。 devp sklearn是使用OpenBLAS而非MKL从源代码构建的吗?

在11月的所有截止日期之后,我很高兴在12月进一步调查...

听起来不错,非常感谢!

但是,即使可以进一步隔离,我也想知道是否存在针对此类硬件特定问题的修复程序。

不确定是否有修复程序,但希望将隔离后的cython代码更改为可解决的问题。 同样,这很可能是openblas的问题,并且在上游进行报告非常有用,尤其是因为车轮使用openblas。

也许,在此问题完全解决之前,如果渐变包含有关此问题的infs可能值得提出更具体的例外/警告?

向错误消息添加一些建议(仅在OS X上),听起来像是个好主意,但我不确定应该说什么,也许是“考虑使用conda并在MKL中安装scikit-learn”或类似的内容。

devp sklearn是使用OpenBLAS而非MKL从源代码构建的吗?

@zhongyuk取决于您已安装的库。 一个办法知道从源一旦你已经建立scikit学习是运行相当于ldd (谷歌似乎在说otool -L )在sklearn/cluster/_k_means.so (名称将是,如果不同您正在使用Python 3,例如sklearn/cluster/_k_means.cpython-35m-x86_64-linux-gnu.so )。 例如,在我的Ubuntu计算机上,我得到以下信息:

sklearn/cluster/_k_means.so:
        linux-vdso.so.1 =>  (0x00007ffc2312a000)
        libmkl_intel_lp64.so => /home/lesteve/miniconda3/envs/py27/lib/libmkl_intel_lp64.so (0x00007fadc2865000)
        libmkl_intel_thread.so => /home/lesteve/miniconda3/envs/py27/lib/libmkl_intel_thread.so (0x00007fadc0ee4000)
        libmkl_core.so => /home/lesteve/miniconda3/envs/py27/lib/libmkl_core.so (0x00007fadbf483000)
        libiomp5.so => /home/lesteve/miniconda3/envs/py27/lib/libiomp5.so (0x00007fadbf139000)
        libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fadbeeeb000)
        libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fadbebe1000)
        libpython2.7.so.1.0 => /home/lesteve/miniconda3/envs/py27/lib/libpython2.7.so.1.0 (0x00007fadbe7fa000)
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fadbe431000)
        libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fadbe22c000)
        libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007fadbe016000)
        /lib64/ld-linux-x86-64.so.2 (0x0000563bdeda1000)
        libutil.so.1 => /lib/x86_64-linux-gnu/libutil.so.1 (0x00007fadbde12000)

因此,您可以从第三行看到它正在使用MKL。

但是我不确定应该说什么,也许是“考虑使用conda并在MKL中安装scikit-learn”或类似的内容。

我只想写信,我想您是对的:轮转找到了,问题只在我与MKL一起通过conda使用时发生了……现在,我认为我在某种程度上有个好消息:我只是想重新运行以前导致此问题确认的上述示例

import numpy as np
from sklearn.manifold import TSNE

np.random.seed(1)

a = np.random.uniform(size=(100, 20))
TSNE(n_components=2, random_state=1).fit_transform(a)

而且我不再遇到这个问题。 我记得前一周由于其他一些问题而重新安装了miniconda。 您是否认为这可能与旧conda中的某些问题有关? 如果其他遇到此问题的人也可以尝试更新/重新安装conda并检查是否为他们解决了问题,那将是很好的。 同时,我将尝试查看是否可以找到旧的备份状态来确定以前安装的conda版本。 (现在,我有conda 4.2.12)

只是想说我在sklearn/manifold/_barnes_hut_tsne.so otool -L上运行了

我拥有的conda版本是4.2.13,抛出错误的env和带有源构建的sklearn(不会抛出错误)的env都在conda内部。

嗯,很有趣,所以毕竟这不是一个conda问题...很好奇为什么现在对我有用:/
(我能想到的一切都改变了(重新安装conda除外)是重新启动:P)

我只是想写一个我想你把它弄翻了:发现轮子正常工作,而这个问题仅在我通过MKL通过conda使用它时发生。

是的,对此感到抱歉。 我将编辑问题标题以尝试下次记住它。

嗯,很有趣,所以毕竟这不是一个conda问题...很好奇为什么现在对我有用:/
(我能想到的一切都改变了(重新安装conda除外)是重新启动:P)

嗯,随机猜测也许是mkl版本,尽管如果我相信conda info mkl的输出是最新的mkl版本(11.3.3)来自2016-05-13。

@zhongyuk尝试在使用mkl的conda env中构建scikit-learn,我相信这应该足以使mkl被拿起(在这种情况下,可能先执行make clean然后make in从头开始重建)。

@lesteve我从源代码(分支0.18版本)在两个conda虚拟环境中构建了scikit-learn,一个使用MKL确实引发了错误; 使用libBLAS的不会抛出错误。

sklearn/manifold/_barnes_hut_tsne.so otool -L上运行

@ rpath / libmkl_intel_lp64.dylib(兼容版本0.0.0,当前版本0.0.0)
@ rpath / libmkl_intel_thread.dylib(兼容版本0.0.0,当前版本0.0.0)
@ rpath / libmkl_core.dylib(兼容版本0.0.0,当前版本0.0.0)
@ rpath / libiomp5.dylib(兼容版本5.0.0,当前版本5.0.0)
/usr/lib/libSystem.B.dylib(兼容版本1.0.0,当前版本1226.10.1)

@zhongyuk太好了! 为了完整起见,您可以在MKL conda环境中过帐conda list '(mkl|cython|numpy|scipy)$'的输出吗? 当我们使用它时,您的CPU信息(根据Google表示sysctl -n machdep.cpu.brand_string )和您的平台信息( python -c 'import platform; print(platform.platform())' )将非常有用。

真正好的是继续在@rabst停下的地方进一步隔离问题:
https://github.com/scikit-learn/scikit-learn/issues/6665#issuecomment -258311980

由于这与BLAS有关,因此我的直觉是该出现了问题,导致渐变具有一些非有限值。

@lesteve conda MKL环境信息的输出:

Cython                    0.25.1                    <pip>
mkl                       11.3.3                        0  
numpy                     1.11.1                    <pip>
numpy                     1.11.1                   py27_0 
scipy                     0.18.1              np111py27_0 

CPU信息: Intel(R) Core(TM) i5-5257U CPU @ 2.70GHz
平台信息: Darwin-15.4.0-x86_64-i386-64bit

我将研究@rabst在其他评论中发现的梯度爆炸问题以及您在本周和/或下周的某个时间所指出的那行,我将为大家提供任何有趣的发现。

@zhongyuk如果有帮助,我有一个非常相似的设置(自从重新安装miniconda之后就无法重现该问题),除了我使用的是macOS Sierra而不是OS X El Capitan,并且我使用的是numpy 1.11.2而不是1.11.1 。

@rasbt嗯...因为我不记得我在哪里或多久以前读过它了? 而且我不想用TF依赖关系破坏我的项目

@zhongyuk嗯,我认为这不太可能相关。 在重新安装miniconda之前,我在macOS Sierra中也遇到了问题。 PS:Tensorflow在Sierra上对我来说很好用,但是我只在Mac上做CPU和原型制作,所以我不知道与Sierra相关的GPU问题

@rasbt hmm,很高兴知道TF在Sierra上可以正常工作。 您是否要在平台中的sklearn/manifold/_barnes_hut_tsne.so文件上运行otool -L ,以查看在下面使用哪个数学库sklearn? 至少以这种方式,我们可能知道重新安装miniconda后问题是否消失了,而该问题从根本上与数学库相关联?

我在_barnes_hut_tsne.cpython-35m-darwin.so上获得以下内容:

    @rpath/libmkl_intel_lp64.dylib (compatibility version 0.0.0, current version 0.0.0)
    @rpath/libmkl_intel_thread.dylib (compatibility version 0.0.0, current version 0.0.0)
    @rpath/libmkl_core.dylib (compatibility version 0.0.0, current version 0.0.0)
    @rpath/libiomp5.dylib (compatibility version 5.0.0, current version 5.0.0)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1197.1.1)

@rasbt嗯,那真的很有趣。 它也在使用MKL。 我对数学库了解不足,无法推测这是什么意思…… @lesteve可能能够从中推断出更多信息?

我注意到在我的平台中libmkl_intel_lp64.dylib未加载...是否可能导致此问题?

哇,是的! 它是由未加载libmkl_intel_lp64.dylib引起的!!! 我在堆栈溢出时发现了sklearn/manifold/_barnes_hut_tsne.so文件上运行conda install --debug mkl ,然后运行otool -L ,然后加载了libmkl_intel_lp64.dylib ,并运行了代码片段,错误消失了! 有五个团队合作! @rasbt

如果其他任何人都可以在确保加载libmkl_intel_lp64.dylib后检查其平台并查看错误是否消失了,那就太好了!

@lesteve因为它看起来确实像很多ppl都解决了这个问题,并且看起来确实与(某些版本的?)conda没有提取完整的MKL库有关(到目前为止我对情况的理解),即使它不是一个scikit学习错误,我确实认为向(OS X)用户添加某种备注或警告或错误消息会很好吗? 这样至少他们可以检查MKL库是否已在其平台中完全提取,然后进行修复(如果不是)?

@zhongyuk很棒,很高兴得知您能够缩小范围! 希望这只是libmkl_intel_lp64.dylib链接断开/安装不完整-会很棒(就知道发生了什么而言):)。 这也可以解释为什么在重新安装Miniconda之后它现在对我有效。如果其他人可以尝试“修复”,那将很好。

如果上述libmkl_intel_lp64.dylib确实引起了此问题,剩下的问题将是如何在scikit-learn中处理。 我的意思是,这个“错误”有点可怕,对于人们来说,弄清楚这是由于libmkl_intel_lp64.dylib造成的,可能有些棘手。 我可能不会在scikit-learn的代码中插入额外的“如果渐变包含inf提高错误+消息”,因为这可能会在性能上令人讨厌。 但是,我认为在安装和/或T-SNE文档中添加注释或注释将是一个好主意。

只是想添加一个快速更新:我在conda中有两个虚拟环境,都使用MKL。 其中一个装有numpy 1.11.1 ,另一个装有numpy 1.11.2 。 运行otool -L表示它们都没有加载libmkl_intel_lp64.dylib 。 确保装入libmkl_intel_lp64.dylib之后,该错误在带有numpy 1.11.2的虚拟环境中消失numpy 1.11.1 。 将numpy升级到1.11.2之后,我无法再在任一conda虚拟环境中重现该错误。 由于听起来很复杂,而且错误的确切原因仍然不清楚,我推测这可能是由于MKL库加载不完整和scikit-learn相关库(可能是numpy?)交织在一起的一种复杂情况。 (尽管我没有尝试使用MKL和numpy 1.11.1创建一个virtualenv,以查看是否会重现该错误。)

我建议添加一些注释,评论或文档,然后再推荐@rasbt

@zhongyuk很高兴您已解决问题! 似乎用conda重新安装软件包可能会有所帮助,但恐怕对于问题的原因似乎还不是很清楚:(。

这是一个conda错误,对不对? 还是有人遇到不使用conda的错误?

我设法找到一种方法来重现我的想法,方法是先安装numpy滚轮,然后在其顶部通过conda进行scikit学习(从https://github.com/scikit-的conda list输出中获得了提示) Learn / scikit-learn / issues / 6665#issuecomment-262800762,其中列出了两个numpy )。

conda create -n tmp python=3 -y
. activate tmp
pip install numpy -y
conda install scikit-learn -y

然后从https://github.com/scikit-learn/scikit-learn/issues/6665#issuecomment -262800762执行该代码段。

所以当混合通过pip和conda安装的numpy时似乎正在发生这种情况。 在我的书中,将pip和conda混合到给定的包中绝不是一个好主意,但是我想这可能会在没有很容易实现的情况下发生(例如,您通过pip安装了一个依赖numpy的项目,然后通过conda进行了scikit-learn )。

为什么我不知道到底发生了什么……而且它似乎仅在OSX上发生(即不在我的Ubuntu机器上)。

对于受此影响的任何人,这应该解决它:

conda remove numpy --force -y
pip uninstall numpy -y
conda install numpy

让我知道这是否不适合您。

感谢再次深潜@lesteve

老实说,我以为我们永远也不会陷入困境:)! 好吧,这还不算是最低点,但就我而言,它已经足够低了。

我不得不承认我仍然想了解同时安装了pip和conda的numpy中发生了什么...

你好
我尝试了两种设置,

  • TSNE与一种设置(在停用Tensorflow,Python-3.x)中很好地配合使用,但是,

  • TSNE不适用于其他设置(已激活Tensorflow的Python 2.x)。

TSNE运作良好的设置:

终奌站:

Macbook:~ BG$ which jupyter
/Users/BG/anaconda/bin/jupyter

Jupyer笔记本:

import sys
print (sys.version)

>

3.5.2 |Anaconda 4.2.0 (x86_64)| (default, Jul  2 2016, 17:52:12) 
[GCC 4.2.1 Compatible Apple LLVM 4.2 (clang-425.0.28)]

注意:我尝试过

conda remove numpy --force -y
pip uninstall numpy -y
conda install numpy

在停用Tensorflow的情况下使TSNE正常工作。
但是,使用下面的新设置(我必须在其中使用Tensorflow),此功能不再起作用。
--------------------------

TSNE不起作用的设置:

终奌站:

Macbook:~$ source activate tensorflow
(tensorflow) Macbook:~$ which jupyter
/Users//anaconda/envs/tensorflow/bin/jupyter
(tensorflow) Macbook:~$ 

Jupyer笔记本:

import sys
print (sys.version)

>

2.7.13 |Continuum Analytics, Inc.| (default, Dec 20 2016, 23:05:08) 
[GCC 4.2.1 Compatible Apple LLVM 6.0 (clang-600.0.57)]

错误
ValueError: array must not contain infs or NaNs

有什么建议 ? 非常感谢

有趣。 我认为这与张量流无关。 我的猜测是

[GCC 4.2.1兼容的Apple LLVM 4.2(clang-425.0.28)]

[GCC 4.2.1兼容的Apple LLVM 6.0(clang-600.0.57)]

是罪魁祸首!?

感谢您的答复:)任何建议的解决方案/ to_do_list?

需要同时使用
Tensorflow和
东北电力公司
在Jupyter笔记本中..

顺便说一句:刚尝试在Python 2.x中“来自__future__导入部门”,但没有解决问题。

嗯,不确定是否有帮助-就我个人而言,我不再遇到这个神秘问题

Python 3.5.3 |Continuum Analytics, Inc.| (default, Feb 22 2017, 20:51:01) 
[GCC 4.2.1 Compatible Apple LLVM 6.0 (clang-600.0.57)] on darwin

我也正在使用Tf(现在是1.0),执行时我再也没有这个Error: ValueError: array must not contain infs or NaNs问题

import numpy as np
from sklearn.manifold import TSNE

np.random.seed(1)

a = np.random.uniform(size=(100, 20))
TSNE(n_components=2, random_state=1).fit_transform(a)

以前没有用。

也许尝试创建一个新的python 3.5 env并尝试上面提到的代码片段,看看它是否可以正常工作:

conda create -n yourenv python=3.5 numpy scipy scikit-learn
source activate yourenv
pip install tensorflow(-gpu)

嗨,rasbt,
是的,我使TSNE在Python 3.5上工作。
但是,由于其他原因,我最好使用Python 2.7,因此我必须继续探索...

谢谢你的帮助。

您是否安装了旧的Miniconda / Anaconda 2.7发行版? 在这种情况下,可以考虑安装较新的版本之一,或更新conda根目录或默认python并再次尝试(或通过在conda create -n yourenv python=3.5 numpy scipy scikit-learn中用3.5乘以2.7创建新的py 27 env)? (不知道这是否是真正的原因,但我认为LLVM 4.2 (clang-425.0.28)可能是一个问题;因为似乎不会通过[GCC 4.2.1 Compatible Apple LLVM 6.0 (clang-600.0.57)]发生错误)

更新:TSNE(perplexity = 30,n_components = 2,init ='pca',n_iter = 1000, method ='exact' )使它工作...
method ='exact'是诀窍。

也一直有这个问题。 使用method ='exact'似乎对我有用,但是它是如此缓慢。 人们真的没有找到其他解决方案吗?

您是否已阅读https://github.com/scikit-learn/scikit-learn/issues/6665#issuecomment -264029983和https://github.com/scikit-learn/scikit-learn/issues/6665#issuecomment -264087057 ?

我设法重现此问题的唯一方法是在同一个conda环境中同时安装numpy和pip和conda。 如果从头开始创建conda环境,则不应出现此问题。

如果您的问题似乎与该描述不符,请张贴您创建conda环境所运行的确切命令,以便我们尝试重现。

你好
我阅读了以上评论,并可以重现此评论。 我从几周前重新运行了代码,现在出现此问题。 这是一个最小的示例,现在可以重现此问题:

from sklearn.manifold import TSNE
a = [[1,2,3],[4,5,6], [7,8,9]]
TSNE(n_components=2,).fit_transform(a)

和输出

import platform; print(platform.platform())
import sys; print("Python", sys.version)
import numpy; print("NumPy", numpy.__version__)
import scipy; print("SciPy", scipy.__version__)
import sklearn; print("Scikit-Learn", sklearn.__version__)

Darwin-16.5.0-x86_64-i386-64bit
Python 3.6.0 |Anaconda 4.3.0 (x86_64)| (default, Dec 23 2016, 13:19:00) 
[GCC 4.2.1 Compatible Apple LLVM 6.0 (clang-600.0.57)]
NumPy 1.12.1
SciPy 0.19.0
Scikit-Learn 0.18.1

同样,将方法更改为精确( TSNE(method='exact') )可以消除该错误。

更笼统地说,当我使用Laurens van der Maaten出版的bh实现和MATLAB版本的sklearn的TSNE(具有相同的困惑和其他参数)时,结果截然不同。 我想知道是否可能存在连接?

这样就解决了。 抱歉,我已经分别卸载了重新安装的numpy,scikit learning和scipy,但与6665并不一样。

我遇到的问题与此处报告的相同,并且我不使用conda。

我的Python版本是通过brew在macOS Sierra 10.12.4上安装的

Python 3.6.1
scipy==0.19.0
scikit-learn==0.18.1
numpy==1.11.1

添加mode='exact'解决了我的问题。

@lesteve :使用您描述的安装程序,我出现了此错误(安装了两个版本的numpy)。 只需将numpy的conda安装更新为与pip install(1.12.1)相同的版本就可以了。 我确实删除了pip numpy安装,因为我不打算有两个版本:)

@lesteve :谢谢您的解决方案! 我碰巧遇到了这个错误,然后我找到了讨论。 删除重复的numpy版本后,请立即修复。

复制我删除了numpy的pip安装并更新了conda。

达尔文16.7.0-x86_64-i386-64bit
('Python','2.7.13 | Anaconda自定义(x86_64)|(默认,2016年12月20日,23:05:08)\ n [GCC 4.2.1兼容Apple LLVM 6.0(clang-600.0.57)]')
(“ NumPy”,“ 1.13.1”)
(“ SciPy”,“ 0.19.0”)
(“ Scikit-Learn”,“ 0.18.1”)

在我的Linux机器Linux上看起来还不错:
Linux-3.0.101-0.47.71-default-x86_64-with-SuSE-11-x86_64
('Python','2.7.12 | Anaconda 2.3.0(64位)|(默认,2016年7月2日,17:42:40)\ n [GCC 4.4.7 20120313(Red Hat 4.4.7-1) ]')
(“ NumPy”,“ 1.12.1”)
(“ SciPy”,“ 0.19.1”)
(“ Scikit-Learn”,“ 0.18.1”)

@wolfiex所以你做到了

conda remove numpy --force -y
pip uninstall numpy -y
conda install numpy

有点相关,我建议您更新到scikit-learn 0.19,它在t-SNE中有一些修复

现在得到相同的错误

@rahulsnair ,您介意以可复制的代码,您的回溯和您使用的版本来发行新刊物吗? 这个问题已经很老了,代码已经改变了很多。 谢谢!

此页面是否有帮助?
0 / 5 - 0 等级