阅读(22.4k) 书签 (0)

TensorFlow使用Cudnn实现模型

2018-09-01 15:50 更新

本节的内容是利用 TensorFlow 中的 Cudnn RNN 来实现 GRU 模型、LSTM 模型、RNN-relu 模型以及 RNN-tanh 模型.

Cudnn RNN 有一个不透明的参数缓冲区,可用于推理和训练.但是参数缓冲区的布局可能会在几代之间发生变化.因此,强烈建议使用 RNNParamsSaveable 以规范格式保存和恢复权重和偏差.

下述是一个典型的用例:

  • 用户创建一个 CudnnRNN 模型 
  • 用户查询参数缓冲区大小 
  • 用户创建一个用作参数缓冲区的变量 
  • 用户初始化参数缓冲区,或将规范权重加载到参数缓冲区中. 
  • 用户使用参数缓冲区调用模型进行推理或训练. 
  • 如果训练,用户创建一个包裹对象. 
  • 如果训练,用户从参数缓冲区创建一个 RNNParamsSaveable 对象,以便稍后以规范格式保存.当创建一个 RNNParamsSaveable 对象时,可以提供一个名称,这对于区分多个RNNParams 可访问对象(例如编码器 - 解码器模型)的名称很有用 
  • 一次,用户使用 Saver.save()将参数缓冲区保存到模型检查点. 
  • 还原时, 用户创建 RNNParamsSaveable 对象并使用 Saver.restore() 将参数缓冲区从规范化格式还原为用户定义的格式, 以及还原检查点文件中的其他抢救对象.

tf.contrib.cudnn_rnn.CudnnGRU


tf.contrib.cudnn_rnn.CudnnGRU 类

定义在:tensorflow/contrib/cudnn_rnn/python/ops/cudnn_rnn_ops.py

Cudnn 实现 GRU 模型.

方法


__init__

__init__ (
num_layers ,
NUM_UNITS ,
input_size ,
input_mode = 'auto_select' ,
direction = 'unidirectional' ,
dropout = 0.0 ,
seed = 0
)

从没有隐藏状态的 C 模型创建 Cudnn RNN 模型.

ARGS:

  • num_layers:RNN 模型的层数.
  • num_units:RNN 模型内的单位数.
  • input_size:输入的大小,可能与 NUM_UNITS 不同. 
  • input_mode:表示在第一层之前的输入和实际计算之间是否有线性投影.它可以是 “skip_input”,“linear_input” 或 “auto_select” .只有当 input_size == NUM_UNITS 时才允许 'skip_input';'auto_select' 意味着'skip_input',当input_size == num_units;否则,它意味着 “linear_input”.
  • direction:运行模型的方向模型,可以是“单向”或“双向”
  • dropout:是否启用退出.当它为 0 时,退出被禁用.
  • seed:用于初始化退出.

__call__

__call__ (
input_data ,
input_h ,
PARAMS ,
is_training = True
)

运行 Cudnn LSTM 模型的前一个步骤.

ARGS:

  • input_data:LSTM 模型的输入序列.
  • input_h:h 的初始隐藏状态.
  • params:为此模型创建的参数缓冲区.
  • is_training:这个操作是否用于训练或推理.

返回:

  • output:输出顺序.
  • output_h:h 的最终状态.

canonical_to_params

canonical_to_params (
weights,
biases
)

将规范格式的参数转换为特定格式的 cuDNN.

ARGS:

  • weights:权重参数的张量.
  • biases:偏差参数的张量.

返回:

用于 canonical-to-params-to-specific 转换的函数..

params_size

params_size ()

计算此模型所需的不透明参数缓冲区的大小.

返回:

计算的参数缓冲区大小.

params_to_canonical

params_to_canonical ( params )

将特定格式的 cuDNN 的参数转换为规范格式.

ARGS:

  • params:权重和偏差参数的变量.

返回:

用于 specific-to-canonical 转换的函数.

tf.contrib.cudnn_rnn.CudnnLSTM


tf.contrib.cudnn_rnn.CudnnLSTM 类

定义在:tensorflow/contrib/cudnn_rnn/python/ops/cudnn_rnn_ops.py

Cudnn 实现 LSTM 模型.

方法


__init__

__init__ (
num_layers ,
NUM_UNITS ,
input_size ,
input_mode = 'auto_select' ,
direction = 'unidirectional' ,
dropout = 0.0 ,
seed = 0
)

从模型规范创建 Cudnn LSTM 模型.

ARGS:

  • num_layers:RNN 模型的层数.
  • num_units:RNN 模型内的单位数.
  • input_size:输入的大小,可能与 NUM_UNITS 不同.
  • input_mode:表示在第一层之前的输入和实际计算之间是否有线性投影.它可以是 “skip_input”,“linear_input” 或 “auto_select” ;只有当 input_size == NUM_UNITS 时才允许 'skip_input' ;当 input_size == num_units时,'auto_select' 意味着'skip_input ' ;否则,它意味着“linear_input”.
  • direction:运行模型的方向模型,可以是“单向”或者“双向”
  • dropout:是否启用退出.当它为0时,退出被禁用.
  • seed:用于初始化退出.

__call__

__call__ (
input_data ,
input_h ,
input_c ,
PARAMS ,
is_training = True
)

运行 Cudnn LSTM 模型的前一个步骤.

ARGS:

  • input_data:输入到 LSTM 模型的序列.
  • input_h:h 的初始隐藏状态.
  • input_c:c 的初始隐藏状态.
  • params:为此模型创建的参数缓冲区.
  • is_training:这个操作是否用于训练或推理.

返回:

  • output:输出顺序.
  • output_h:h 的最终状态.
  • output_c:c 的最终状态.

canonical_to_params

canonical_to_params (
weights,
biases
)

将规范格式的参数转换为特定格式的 cuDNN.

ARGS:

  • weights:重量参数的张量.
  • biases:偏差参数的张量.

返回:

用于 canonical-to-params-to-specific 转换的函数..

params_size

params_size ()

计算此模型所需的不透明参数缓冲区的大小.

返回:

计算的参数缓冲区大小.

params_to_canonical

params_to_canonical ( params )

将特定格式的 cuDNN 的参数转换为规范格式.

ARGS:

  • params:权重和偏差参数的变量.

返回:

用于 specific-to-canonical 转换的函数.

tf.contrib.cudnn_rnn.CudnnRNNRelu


tf.contrib.cudnn_rnn.CudnnRNNRelu 类

定义在:tensorflow/contrib/cudnn_rnn/python/ops/cudnn_rnn_ops.py

Cudnn 实现 RNN-relu 模型

方法


__init__

__init__ (
num_layers ,
NUM_UNITS ,
input_size ,
input_mode = 'auto_select' ,
direction= 'unidirectional' ,
dropout = 0.0 ,
seed = 0
)

从没有隐藏状态的 C 模型创建 Cudnn RNN 模型.

ARGS:

  • num_layers:RNN 模型的层数.
  • num_units:RNN 模型内的单位数.
  • input_size:输入的大小,可能与 NUM_UNITS 不同.
  • input_mode:表示在第一层之前的输入和实际计算之间是否有线性投影.它可以是“skip_input”,“linear_input”或“auto_select” ;只有当 input_size == NUM_UNITS 时才允许'skip_input'.当 input_size == num_units时,'auto_select' 意味着 'skip_input ',否则,它意味着 “linear_input”.
  • direction:运行模型的方向模型,可以是“单向”或者“双向”
  • dropout:是否启用退出.当它为0时,退出被禁用.
  • seed:用于初始化退出.

__call__

__call__ (
input_data ,
input_h ,
PARAMS ,
is_training = True
)

运行 Cudnn LSTM 模型的前一个步骤.

ARGS:

  • input_data:输入到 LSTM 模型的序列.
  • input_h:h 的初始隐藏状态.
  • params:为此模型创建的参数缓冲区.
  • is_training:这个操作是否用于训练或推理.

返回:

  • output:输出顺序.
  • output_h:h 的最终状态.

canonical_to_params

canonical_to_params (
weights,
biases
)

将规范格式的参数转换为特定格式的cuDNN.

ARGS:

  • weights:重量参数的张量.
  • biases:偏差参数的张量.

返回:

用于 canonical-to-params-to-specific 转换的函数.

params_size

params_size ()

计算此模型所需的不透明参数缓冲区的大小.

返回:

计算的参数缓冲区大小.

params_to_canonical

params_to_canonical ( params )

将特定格式的 cuDNN 的参数转换为规范格式.

ARGS:

  • params:权重和偏差参数的变量.

返回:

用于 specific-to-canonical 转换的函数.

tf.contrib.cudnn_rnn.CudnnRNNTanh


tf.contrib.cudnn_rnn.CudnnRNNTanh 类

定义在:tensorflow/contrib/cudnn_rnn/python/ops/cudnn_rnn_ops.py

Cudnn 实现 RNN-tanh 模型

方法


__init__

__init__ (
num_layers ,
NUM_UNITS ,
input_size ,
input_mode = 'auto_select' ,
direction = 'unidirectional' ,
dropout = 0.0 ,
seed = 0
)

从没有隐藏状态的 C 模型创建 Cudnn RNN 模型.

ARGS:

  • num_layers:RNN 模型的层数.
  • num_units:RNN 模型内的单位数.
  • input_size:输入的大小,可能与 NUM_UNITS 不同.
  • input_mode:表示在第一层之前的输入和实际计算之间是否有线性投影.它可以是“skip_input”,“linear_input”或“auto_select” .只有当 input_size == NUM_UNITS 时才允许 'skip_input';当 input_size == num_units 时,'auto_select' 意味着 'skip_input ';否则,它意味着“linear_input”.
  • direction:运行模型的方向模型,可以是“单向”或者“双向”
  • dropout:是否启用退出.当它为0时,退出被禁用.
  • seed:用于初始化退出.

__call__

__call__ (
input_data ,
input_h ,
PARAMS ,
is_training = True
)

运行 Cudnn LSTM 模型的前一个步骤.

ARGS:

  • input_data:输入到 LSTM 模型的序列.
  • input_h:h 的初始隐藏状态.
  • params:为此模型创建的参数缓冲区.
  • is_training:这个操作是否用于训练或推理.

返回:

  • output:输出顺序.
  • output_h:h 的最终状态.

canonical_to_params

canonical_to_params (
weights,
biases
)

将规范格式的参数转换为特定格式的 cuDNN.

ARGS:

  • weights:重量参数的张量.
  • biases:偏差参数的张量.

返回:

用于 canonical-to-params-to-specific 转换的函数..

params_size

params_size ()

计算此模型所需的不透明参数缓冲区的大小.

返回:

计算的参数缓冲区大小.

params_to_canonical

params_to_canonical ( params )

将特定格式的 cuDNN 的参数转换为规范格式.

ARGS:

  • params:权重和偏差参数的变量.

返回:

用于 specific-to-canonical 转换的函数.