python - tensorflow 导入导致numpy计算错误

标签 python numpy tensorflow scikit-learn

我正在通过线性回归示例学习 TensorFlow 的基础知识。使用 scikit-learn 执行线性回归效果很好:

import numpy as np
from sklearn.datasets import fetch_california_housing
from sklearn.linear_model import LinearRegression

housing = fetch_california_housing()

lin_reg = LinearRegression()
lin_reg.fit(housing.data, housing.target.reshape(-1, 1))

print(np.r_[lin_reg.intercept_.reshape(-1, 1), lin_reg.coef_.T])

返回以下结果:

[[ -3.69419202e+01]
 [  4.36693293e-01]
 [  9.43577803e-03]
 [ -1.07322041e-01]
 [  6.45065694e-01]
 [ -3.97638942e-06]
 [ -3.78654265e-03]
 [ -4.21314378e-01]
 [ -4.34513755e-01]]

使用 numpy (正规方程)执行相同的操作也可以正常工作:

m, n = housing.data.shape
housing_data_plus_bias = np.c_[np.ones((m, 1)), housing.data]

X = housing_data_plus_bias
y = housing.target.reshape(-1, 1)
theta_numpy = np.linalg.inv(X.T.dot(X)).dot(X.T).dot(y)

print(theta_numpy)

输出:

[[ -3.69419202e+01]
 [  4.36693293e-01]
 [  9.43577803e-03]
 [ -1.07322041e-01]
 [  6.45065694e-01]
 [ -3.97638942e-06]
 [ -3.78654265e-03]
 [ -4.21314378e-01]
 [ -4.34513755e-01]]

但是,当我在运行线性回归之前导入 TensorFlow 时,我会得到可变且不准确的结果:

import tensorflow as tf
import numpy as np
from sklearn.datasets import fetch_california_housing
from sklearn.linear_model import LinearRegression

housing = fetch_california_housing()

lin_reg = LinearRegression()
lin_reg.fit(housing.data, housing.target.reshape(-1, 1))

print(np.r_[lin_reg.intercept_.reshape(-1, 1), lin_reg.coef_.T])

产生以下结果(每次都有不同的值):

[[  2.91247440e+32]
 [ -1.62971964e+11]
 [  1.42425463e+14]
 [ -4.82459003e+16]
 [ -1.33258747e+17]
 [ -2.04315813e+29]
 [  5.51179654e+14]
 [  5.92729561e+20]
 [  8.86284674e+21]]

如果我在导入 tensorflow 之前运行任一计算,然后导入 tensorflow 并再次重复计算,我会得到正确的结果。

知道原因是什么以及如何确保导入 TensorFlow 后从 numpy/scikit-learn 获得正确的结果吗?

我正在 Ubuntu 上使用tensorflow-gpu 从 Anaconda 4.3.30 运行 Python 3.5.4。

numpy version: 1.12.1
tensorflow version: 1.3.0

最佳答案

Anaconda 发行版默认使用英特尔的数学内核库 (MKL),这似乎会导致 Numpy 和 SciPy 在与 TensorFlow 结合使用时出现多个问题,如 this issue 中所述。以及其他引用的问题。

从 pip 重新安装 Numpy 和 SciPy 可以解决该问题:

首先,使用 conda 创建一个包含所需包的新环境:

$ conda create --name env_name python=3.5 tensorflow-gpu scikit-learn

激活环境:

$ source activate env_name

使用 pip 重新安装 Numpy 和 SciPy:

$ pip install --ignore-installed --upgrade numpy scipy

这样做的缺点是您无法从 MKL 提供的性能提升中受益。举例来说,使用 Scikit-Learn 构建的支持向量机需要 6 分钟才能使用 MKL 进行训练,而在没有 MKL 的环境中只需 11 分钟即可完成训练。不过,您可以创建另一个具有 MKL(默认)的环境,以便在不需要 TensorFlow 时使用。

关于python - tensorflow 导入导致numpy计算错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47725664/

相关文章:

python - 需要帮助解密正则表达式 re.sub

python - 如何在 Python 中仅提取 url 的特定部分并将其值添加为 df 中每一行的另一列?

python - 有效检测大图像中的形状

javascript - tensorflow .js : How to avoid `Your CPU supports instructions ... AVX AVX2` ?

python - 生成 n X n 个非同构二元矩阵的算法

python - 处理基于其他字段的 Django 模型字段的要求

python - 为什么 numpy 中 float128 低于最大值的数字被视为 inf?

python - 回溯查找元素之和小于 K 的 n 元素向量

python - tf.constant 和 tf.Variable 之间的区别(trainable= False)

python - NASNet-A 微调验证精度差