【发布时间】:2018-10-24 22:11:44
【问题描述】:
如何在不同的conda 环境中设置不同的 keras 后端?因为在特定的环境下,如果我把keras.json中的后端改成tensorflow,那么在另一个python环境下,keras的后端也会是tensorflow。我的文档中只有一个keras.json。
【问题讨论】:
标签: python tensorflow keras environment-variables anaconda
如何在不同的conda 环境中设置不同的 keras 后端?因为在特定的环境下,如果我把keras.json中的后端改成tensorflow,那么在另一个python环境下,keras的后端也会是tensorflow。我的文档中只有一个keras.json。
【问题讨论】:
标签: python tensorflow keras environment-variables anaconda
一种解决方案是为不同的环境创建不同的用户,并为两者放置不同的keras.json 文件:
$HOME/.keras/keras.json
这样您就可以独立更改任何 keras 参数。
如果你只需要更改后端,使用KERAS_BACKEND env 变量会更容易。以下命令将使用tensorflow,无论keras.json 中的内容是什么:
$ KERAS_BACKEND=tensorflow python -c "from keras import backend"
Using TensorFlow backend.
那么你能不能启动一个新的shell终端,在里面运行export KERAS_BACKEND=tensorflow,所有后续的命令都会使用tensorflow。您可以更进一步,并按照this question 中的讨论为每个 conda env 激活设置此变量(如果您永久需要它):
$PREFIX/etc/conda/activate.d
【讨论】:
用于在 Anaconda 的不同环境中使用不同的 keras 后端 - 'env1' 和 'env2'
from __future__ import absolute_import
from __future__ import print_function
import os
import json
import sys
import importlib
from .common import epsilon
from .common import floatx
from .common import set_epsilon
from .common import set_floatx
from .common import cast_to_floatx
from .common import image_data_format
from .common import set_image_data_format
# Set Keras base dir path given KERAS_HOME env variable, if applicable.
# Otherwise either ~/.keras or /tmp.
if 'KERAS_HOME' in os.environ:
_keras_dir = os.environ.get('KERAS_HOME')
else:
_keras_base_dir = os.path.expanduser('~')
if not os.access(_keras_base_dir, os.W_OK):
_keras_base_dir = '/tmp'
_keras_dir = os.path.join(_keras_base_dir, '.keras1')##
# Default backend: TensorFlow.
_BACKEND = 'tensorflow'
# Attempt to read Keras config file.
_config_path = os.path.expanduser(os.path.join(_keras_dir, 'keras.json'))
if os.path.exists(_config_path):
try:
with open(_config_path) as f:
_config = json.load(f)
except ValueError:
_config = {}
_floatx = _config.get('floatx', floatx())
assert _floatx in {'float16', 'float32', 'float64'}
_epsilon = _config.get('epsilon', epsilon())
assert isinstance(_epsilon, float)
_backend = _config.get('backend', _BACKEND)
_image_data_format = _config.get('image_data_format',
image_data_format())
assert _image_data_format in {'channels_last', 'channels_first'}
set_floatx(_floatx)
set_epsilon(_epsilon)
set_image_data_format(_image_data_format)
_BACKEND = _backend
# Save config file, if possible.
if not os.path.exists(_keras_dir):
try:
os.makedirs(_keras_dir)
except OSError:
# Except permission denied and potential race conditions
# in multi-threaded environments.
pass
if not os.path.exists(_config_path):
_config = {
'floatx': floatx(),
'epsilon': epsilon(),
'backend': _BACKEND,
'image_data_format': image_data_format()
}
try:
with open(_config_path, 'w') as f:
f.write(json.dumps(_config, indent=4))
except IOError:
# Except permission denied.
pass
# Set backend based on KERAS_BACKEND flag, if applicable.
if 'KERAS_BACKEND' in os.environ:
_backend = os.environ['KERAS_BACKEND']
_BACKEND = _backend
# Import backend functions.
if _BACKEND == 'cntk':
sys.stderr.write('Using CNTK backend\n')
from .cntk_backend import *
elif _BACKEND == 'theano':
sys.stderr.write('Using Theano backend.\n')
from .theano_backend import *
elif _BACKEND == 'tensorflow':
sys.stderr.write('Using TensorFlow backend.\n')
from .tensorflow_backend import *
else:
# Try and load external backend.
try:
backend_module = importlib.import_module(_BACKEND)
entries = backend_module.__dict__
# Check if valid backend.
# Module is a valid backend if it has the required entries.
required_entries = ['placeholder', 'variable', 'function']
for e in required_entries:
if e not in entries:
raise ValueError('Invalid backend. Missing required entry : ' + e)
namespace = globals()
for k, v in entries.items():
# Make sure we don't override any entries from common, such as epsilon.
if k not in namespace:
namespace[k] = v
sys.stderr.write('Using ' + _BACKEND + ' backend.\n')
except ImportError:
raise ValueError('Unable to import backend : ' + str(_BACKEND))
def backend():
"""Publicly accessible method
for determining the current backend.
# Returns
String, the name of the backend Keras is currently using.
# Example
```python
>>> keras.backend.backend()
'tensorflow'
```
"""
return _BACKEND
【讨论】:
这是我为自己的目的所做的,与 Kedar 的 answer 相同的逻辑,但在 Windows 安装(和 Keras 版本)上,位置和文件名可能不同:
1/ 在目标 Anaconda 环境的文件夹中设置一个特定的 keras.json 文件。修改“后端”值。
2/ 然后强制 'load_backend.py'(特定于您的 anaconda 环境的那个)加载这个特定的 keras.json。 此外,在同一个文件中强制将“默认后端”设置为您想要的那个。
================================================ ========
详情:
1.1 打开您需要特定后端的 Anaconda 环境文件夹。就我而言,它是 C:\ProgramData\Anaconda3\envs\[MyAnacondaEnvironment]\
1.2 在这里创建一个文件夹 .keras,并在该文件夹中复制或创建一个文件 keras.json(我从 C:\Users\[MyWindowsUserProfile]\.keras\keras.json 复制了我的)。
现在在该文件中,将后端更改为您想要的后端,我为一些测试选择了“cntk”。该文件的内容现在应该如下所示:
{
"floatx": "float32",
"epsilon": 1e-07,
"backend": "cntk",
"image_data_format": "channels_last"
}
文件的名称和位置类似于 C:\ProgramData\Anaconda3\envs\[MyAnacondaEnvironment]\.keras\keras.json
2.1 现在打开特定于您正在自定义的环境的文件“load_backend.py”,位于此处(在我的情况下)C:\ProgramData\Anaconda3\envs\[MyAnacondaEnvironment]\Lib\站点包\keras\后端
2.2 在我的 Keras 版本 (2.3.1) 中的第 17 到 25 行,该文件通常在环境变量或当前 Windows 的帮助下从它找到的配置文件中加载后端以用户为例。这就是为什么目前您的后端是跨环境的。
通过强制“load_backend.py”在您的环境特定配置文件(您在步骤 1.2 中创建的那个)中查看要直接加载哪个后端来摆脱这种情况
例如,'load_backend.py' 文件的第 26 行(在我的情况下为第 26 行,无论如何,在尝试自动加载配置文件之后)添加该行(并根据您自己的位置对其进行自定义):
_keras_dir = 'C:\ProgramData\Anaconda3\envs\[MyAnacondaEnvironment]\.keras' ##强制脚本从特定文件获取配置
3.1 然后将默认后端 _BACKEND = 'tensorflow' 替换为 _BACKEND = 'cntk'(在我的情况下是第 28 行,反正在你强制 _keras_dir 路径之后)。
你应该完成了
【讨论】: