繁体   English   中英

如何在不同的 conda 环境中设置不同的 keras 后端

[英]How to set different keras backend in different conda environments

如何在不同的conda环境中设置不同的 keras 后端? 因为在特定的环境中,如果我改变后端tensorflowkeras.json ,然后在另一个Python环境,keras后端会tensorflow了。 我的文档中只有一个keras.json

用于在 Anaconda 的不同环境中使用不同的 keras 后端 - 'env1' 和 'env2'

  • 激活第一个环境 'env1'
  • 使用默认后端从python导入keras(如果无法加载tensorflow,例如,在该环境中安装tensorflow)成功
  • 在 ~ 文件夹中,将创建一个“.keras”文件夹,其中包含 keras.json 文件
  • 对于其他环境,将“.keras”文件夹的副本创建为“.keras1”
  • 根据要求更改该文件夹中的 keras.json 文件(“后端”字段)
  • 要在“env2”中使用该配置,请转到“~/anaconda3/envs/env2/lib/pythonx.x/site-packages/keras/backend”并编辑__init__.py文件
  • 进行标有##的更改
  • 您将能够在 env1 和 env2 中导入具有不同后端的 keras

 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答案相同的逻辑,但在 Windows 安装(和 Keras 版本)上,位置和文件名可能不同:

1/在目标 Anaconda 环境的文件夹中设置特定的 keras.json文件。 修改“后端”值。

2/然后强制'load_backend.py' (特定于你的anaconda env的那个)加载这个特定的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\\site-packages\\keras\\backend

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 = 'cntk' 替换(在我的例子中是第 28 行,无论如何在你强制 _keras_dir 路径之后)默认后端 _BACKEND = 'tensorflow'。

你应该完成

一种解决方案是为不同的环境创建不同的用户,并为两者放置不同的keras.json文件:

$HOME/.keras/keras.json

这样您就可以独立更改任何 keras 参数。


如果您只需要更改后端,使用KERAS_BACKEND变量会更容易。 以下命令将使用tensorflow ,无论keras.json是什么:

$ KERAS_BACKEND=tensorflow python -c "from keras import backend"
Using TensorFlow backend.

因此,您可以启动一个新的 shell 终端,在其中运行export KERAS_BACKEND=tensorflow并且所有后续命令都将使用tensorflow 您可以进一步设置每个 conda env 激活的变量,如本问题中所述(如果您永久需要它):

$PREFIX/etc/conda/activate.d

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM