TensorFlow使用Cudnn实现模型
本节的内容是利用 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 转换的函数.