tensorflow keras权重加载过程的源码解析

整体加载过程梳理

1. 读取h5文件中layer_name的内容,并获取layer_name下的weight信息,按先layer_name后weight_name的形式把所有weight存放在数组里。

2. 将图中的layers按照key=layer_name, value=layer的方式重新组织所有内容,并将结果存放到dict里。(多个layer可能公用一个layer_name,这些重名的layers被组织到同一个数组下)

3. 遍历h5下的所有layer,读取特定layer下的所有weight,并找到与之对应的图中的layer,依次判断h5下该layer的各weight的size和图中该layer下weight的size是否匹配。

   若匹配,完成bound;不匹配,跳过或抛出异常。

总结:图中的layer是weight中layer的子集。

          如果想只子图的权重,那么需要找到该子图对应的layer和对应的名称。

细节说明

def load_weights_from_hdf5_group_by_name(
    f, layers, skip_mismatch=False):
  """Implements name-based weight loading.

  (instead of topological weight loading).

  Layers that have no matching name are skipped.

  Arguments:
      f: A pointer to a HDF5 group.
      layers: a list of target layers.
      skip_mismatch: Boolean, whether to skip loading of layers
          where there is a mismatch in the number of weights,
          or a mismatch in the shape of the weights.

  Raises:
      ValueError: in case of mismatch between provided layers
          and weights file and skip_match=False.
  """
  if 'keras_version' in f.attrs:
    original_keras_version = f.attrs['keras_version'].decode('utf8')
  else:
    original_keras_version = '1'
  if 'backend' in f.attrs:
    original_backend = f.attrs['backend'].decode('utf8')
  else:
    original_backend = None

  # New file format.
  layer_names = load_attributes_from_hdf5_group(f, 'layer_names')# 1. 读取h5下layer_names存放的内容

  # Reverse index of layer name to list of layers with name.# 
  index = {}
  for layer in layers: # 2.将layers按照key=layer_name, value=layer的方式组织所有内容,并存放到index里。
    if layer.name:
      index.setdefault(layer.name, []).append(layer)

  # We batch weight value assignments in a single backend call
  # which provides a speedup in TensorFlow.
  weight_value_tuples = []
  for k, name in enumerate(layer_names):
    g = f[name]
    weight_names = load_attributes_from_hdf5_group(g, 'weight_names')
    # 3. 读取h5中layer下的所有weights,并从h5中加载weight相应内容存放到weight_value数组中
    weight_values = [np.asarray(g[weight_name]) for weight_name in weight_names]
    # 4. 获取图中layer对象,分析该对象的len和4中获取的weight_value的len是否对应
      4.1 对应:把weight_value相应的内容赋值给layer对象
      4.2 不对应:如果可以skip_mismatch,跳过不匹配的layer对象;反之,抛出异常。

    for layer in index.get(name, []):
      symbolic_weights = _legacy_weights(layer)
      weight_values = preprocess_weights_for_loading(
          layer, weight_values, original_keras_version, original_backend)
      if len(weight_values) != len(symbolic_weights):
        if skip_mismatch:
          logging.warning('Skipping loading of weights for '
                          'layer {}'.format(layer.name) + ' due to mismatch '
                          'in number of weights ({} vs {}).'.format(
                              len(symbolic_weights), len(weight_values)))
          continue
        raise ValueError('Layer #' + str(k) + ' (named "' + layer.name +
                         '") expects ' + str(len(symbolic_weights)) +
                         ' weight(s), but the saved weights' + ' have ' +
                         str(len(weight_values)) + ' element(s).')
      # Set values.
      for i in range(len(weight_values)):
        if K.int_shape(symbolic_weights[i]) != weight_values[i].shape:
          if skip_mismatch:
            logging.warning('Skipping loading of weights for '
                            'layer {}'.format(layer.name) + ' due to '
                            'mismatch in shape ({} vs {}).'.format(
                                symbolic_weights[i].shape,
                                weight_values[i].shape))
            continue
          raise ValueError('Layer #' + str(k) +' (named "' + layer.name +
                           '"), weight ' + str(symbolic_weights[i]) +
                           ' has shape {}'.format(K.int_shape(
                               symbolic_weights[i])) +
                           ', but the saved weight has shape ' +
                           str(weight_values[i].shape) + '.')

        else:
          weight_value_tuples.append((symbolic_weights[i], weight_values[i]))
  K.batch_set_value(weight_value_tuples)

 keras和tensorflow融合的问题

https://faroit.com/keras-docs/1.2.0/backend/

https://github.com/yuanyuanli85/Keras-Multiple-Process-Prediction

Keras is a model-level library, providing high-level building blocks for developing deep learning models. It does not handle itself low-level operations such as tensor products, convolutions and so on. Instead, it relies on a specialized, well-optimized tensor manipulation library to do so, serving as the "backend engine" of Keras. Rather than picking one single tensor library and making the implementation of Keras tied to that library, Keras handles the problem in a modular way, and several different backend engines can be plugged seamlessly into Keras.

keras是一个上层high-level的框架,其自身并不提供底层实现,而这些实现由tensorflow和theano做支撑。与此同时,Keras本身集成了控制底层框架的API, 如set_session。因此,keras能很好的嵌入到tensorflow,并以我们按照我们希望的方式执行。

但在执行过程中,有如下注意事项:

1.Session不能在不同的进程间共享(https://github.com/keras-team/keras/issues/9964

2. Session在执行结束后一定要及时关闭

3. keras尽量不要在全局位置而是进程代码端内导入。(https://stackoverflow.com/questions/42504669/keras-tensorflow-and-multiprocessing-in-python?answertab=votes#tab-top

# 代码出自于最后一个链接(感谢大佬)
def _training_worker(train_params):
    import keras #在函数内部导入
    model = obtain_model(train_params)
    model.fit(train_params)
    send_message_to_main_process(...)

def train_new_model(train_params):
    training_process = multiprocessing.Process(target=_training_worker, args =train_params)
    training_process.start() #在独立的进程里运行不同的keras模型
    get_message_from_training_process(...)
    training_process.join()
# 控制底层框架的执行方式
def run_keras_model(CPU_num):
    import keras
    sess_config = tf.ConfigProto(device_count={"CPU": CPU_num},
                                intra_op_parallelism_threads=CPU_num,
                                # use_per_session_threads=True,
                                allow_soft_placement=False,
                                log_device_placement=False)
    sess = tf.Session(config=sess_config)
    keras.backend.tensorflow_backend.set_session(sess)
    # .... run model.....
    #  result = sess.run(out,feed_dict=feed}
    sess.close()

if __name__ == '__main__':
    import multiprocessing as mp
    mp.Process(target=run_keras_model,args=(5,)).start()
    mp.Process(target=run_keras_model,args=(1,)).start()

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
### 回答1: 你可以用 pip 安装 TensorFlowKeras:pip install tensorflow 和 pip install keras。如果你想要安装特定的 TensorFlow 版本,你可以使用 pip install tensorflow==<version>。 ### 回答2: tensorflow keras 是一种机器学习框架,在安装之前,我们首先需要安装好 Python 环境。接下来,我们可以通过以下步骤来安装 tensorflow keras: 1. 打开终端或命令行界面,并确保已经安装了 pip,pip 是 Python 包管理器,用于安装第三方软件包。 2. 在终端中输入以下命令来安装 tensorflow keras: `pip install tensorflow` 这会自动安装最新版本的 tensorflow 包。 3. 安装完成后,我们可以在 Python 中导入 tensorflow 包,并验证其安装是否成功: ```python import tensorflow as tf print(tf.__version__) ``` 这将输出 tensorflow 版本号,表示 tensorflow 安装成功。 4. 接下来,我们可以安装 keraskeras 是基于 tensorflow 的高级神经网络 API。在终端中输入以下命令安装 keras: `pip install keras` 这将自动安装最新版本的 keras。 5. 安装完成后,我们可以在 Python 中导入 keras,并验证其安装是否成功: ```python import keras print(keras.__version__) ``` 这将输出 keras 版本号,表示 keras 安装成功。 至此,我们已经成功安装了 tensorflow keras。现在,我们可以开始使用这个强大的机器学习框架来构建和训练深度学习模型了。 ### 回答3: 要安装TensorFlowKeras,你可以按照以下步骤进行操作: 1. 确保你的计算机已经安装好Python,并且Python版本在3.5以上。 2. 打开命令行界面,使用以下命令安装TensorFlow: ``` pip install tensorflow ``` 如果你的计算机上同时安装有GPU并且想要使用GPU加速,可以使用以下命令来安装TensorFlow GPU版本: ``` pip install tensorflow-gpu ``` 3. 安装完成后,使用以下命令来验证TensorFlow的安装情况: ``` python -c "import tensorflow as tf;print(tf.__version__)" ``` 如果成功安装,将会显示出TensorFlow的版本号。 4. 接下来,你可以安装Keras。使用以下命令来安装Keras: ``` pip install keras ``` 另外,Keras已经成为TensorFlow的一部分,如果你已经成功安装了TensorFlow,在导入TensorFlow时,也可以通过调用`tf.keras`来使用Keras。 至此,你已经成功安装了TensorFlowKeras。你可以通过导入相应库和模块来使用它们。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值