【问题标题】:How to set different keras backend in different conda environments如何在不同的conda环境中设置不同的keras后端
【发布时间】:2018-10-24 22:11:44
【问题描述】:

如何在不同的conda 环境中设置不同的 keras 后端?因为在特定的环境下,如果我把keras.json中的后端改成tensorflow,那么在另一个python环境下,keras的后端也会是tensorflow。我的文档中只有一个keras.json

【问题讨论】:

    标签: python tensorflow keras environment-variables anaconda


    【解决方案1】:

    一种解决方案是为不同的环境创建不同的用户,并为两者放置不同的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
    

    【讨论】:

      【解决方案2】:

      用于在 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

      【讨论】:

        【解决方案3】:

        这是我为自己的目的所做的,与 Kedaranswer 相同的逻辑,但在 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 路径之后)。

        你应该完成了

        【讨论】:

          猜你喜欢
          • 2022-08-15
          • 2018-10-25
          • 2016-11-07
          • 2011-04-05
          • 2021-12-02
          • 1970-01-01
          • 2013-01-09
          • 1970-01-01
          • 2017-02-07
          相关资源
          最近更新 更多