python-3.x - 将 Tensorflow 2.0 降级到 1.5 后,结果发生了变化,结果再现不可用
问题描述
你能帮我在不重新启动 Python 内核的情况下使用 Tensorflow 1.15 实现可重现的结果吗?为什么 TF 2.0 和 TF 1.5 的输出结果在参数和数据集完全相同的情况下是不同的?是否有可能实现相同的输出?
更多细节:我试图通过以下方式解释 TF 2.0 中的模型结果:
import shap
background = df3.iloc[np.random.choice(df3.shape[0], 100, replace=False)]
explainer = shap.DeepExplainer(model, background)
我收到一个错误:
`get_session` is not available when using TensorFlow 2.0.`get_session` is not available when using TensorFlow 2.0.
根据SO topic,我尝试通过在我的代码前面使用来设置 TF 2.0 与 TF 1 的兼容性:
import tensorflow.compat.v1 as tf
但是错误又出现了。根据许多用户的建议,我将 TF2 降级到 TF 1.15 它解决了问题,并且 shap 模块解释了结果,但是:1)为了使结果可重现,现在我必须更改 tf.random.set_random_seed 上的 tf.random.set_seed(7) (7)并且每次都重启Python内核!在 TF2 中,我不必重新启动内核。2)预测结果发生了变化,尤其是经济效率(即TF1.5.错误分类比TF2.0更重要的样本)。
TF 2:精度:94.95%,经济效率=64%
TF 1:精度:94.85%,经济效率=56%
模型的代码在这里
解决方案
首先,结果不仅TF1和TF2版本不同,TF2.0和TF2.2版本也不同。可能,它取决于包中不同的内部参数。
其次,TensorFlow2 在以下版本中与 DeepExplainer 配合使用:
import tensorflow
import pandas as pd
import keras
import xgboost
import numpy
import shap
print(tensorflow.__version__)
print(pd.__version__)
print(keras.__version__)
print(xgboost.__version__)
print(numpy.__version__)
print(shap.__version__)
输出:
2.2.0
0.24.2
2.3.1
0.90
1.17.5
0.35.0
但是您在更新库时会遇到一些困难。
在 Python 3.5 中,运行 TF2.2,您将面临错误“DLL 加载失败:找不到指定的模块”。通过安装更新的 C++ 包可以 100% 解决。看到这个:https ://github.com/tensorflow/tensorflow/issues/22794#issuecomment-573297027 下载包的链接:https: //support.microsoft.com/ru-ru/help/2977003/the-latest-支持的视觉 C 下载
在 Python 3.7 中,您将找不到带有 whl 扩展的 shap 0.35.0 版本。只有 tar.gz 扩展会给出错误:“安装 Visual C++ 包”。但是安装没有帮助。然后在此处下载适用于 Python 3.7 的 shap 0.35.0:https ://anaconda.org/conda-forge/shap/files 。运行 Anaconda 外壳。类型:conda install -c conda-forge C:\shap-0.35.0-py37h3bbf574_0.tar.bz2。
推荐阅读
- javascript - 如何计算班级人数?
- flutter - JSON 序列化问题:无法将参数类型“Tracks”分配给参数类型“Map”
' - javascript - flex 容器无法检测到窗口 scrollTop 偏移量
- c++ - 是否有权威的方法来防止 C++ 中的“移动后使用”错误?
- jquery - jQuery Mobile:多选菜单仅传输单个值
- python - 实时显示子流程输出
- swift4.2 - substring(from:)' 已被弃用。使用带有“部分范围”运算符的字符串切片下标
- google-apps-script - 来自 AppMaker 数据源的 SQL 查询
- javascript - 我正在尝试使用 javascript 函数更改 html 链接的样式。为什么我的代码不起作用?
- c# - 在c#中更改字符位置并在它们之间添加空格