r - 为 LSTM 使用 cuDNN 内核
问题描述
我想使用 Cudnn 训练我的 RNN 模型:
max_length <- 140
embedding_dim <- 128
model <- keras_model_sequential()
# define model
model %>%
# layer input
layer_embedding(
name = "input",
input_dim = num_words,
input_length = max_length,
output_dim = embedding_dim,
embeddings_initializer = initializer_random_uniform(minval = -0.05, maxval = 0.05, seed = 2)
) %>%
# layer dropout
layer_spatial_dropout_1d(
name = "embedding_dropout",
rate = 0.2
) %>%
# layer lstm 1
bidirectional(layer_lstm(
name = "lstm",
units = 64,
unroll = FALSE,
dropout = 0.2,
use_bias = TRUE,
recurrent_dropout = 0,
return_sequences = TRUE
)) %>%
layer_batch_normalization() %>%
# layer output
layer_dense(
name = "output",
units = 3,
activation = "softmax"
)
当我运行这个时,我得到了这个变暖:
警告:tensorflow:Layer lstm 不会使用 cuDNN 内核,因为它不符合 cuDNN 内核标准。在 GPU 上运行时,它将使用通用 GPU 内核作为后备
我想我已经遵循了所有的要求,不知道我错过了什么。
会话信息:
R version 4.0.0 (2020-04-24)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows 10 x64 (build 18363)
Matrix products: default
locale:
[1] LC_COLLATE=English_United States.1252
[2] LC_CTYPE=English_United States.1252
[3] LC_MONETARY=English_United States.1252
[4] LC_NUMERIC=C
[5] LC_TIME=English_United States.1252
attached base packages:
[1] stats graphics grDevices utils datasets methods base
other attached packages:
[1] keras_2.3.0.0
loaded via a namespace (and not attached):
[1] Rcpp_1.0.4.6 lattice_0.20-41 zeallot_0.1.0 rappdirs_0.3.1
[5] grid_4.0.0 R6_2.4.1 jsonlite_1.6.1 magrittr_1.5
[9] tfruns_1.4 whisker_0.4 Matrix_1.2-18 reticulate_1.15
[13] generics_0.0.2 tools_4.0.0 xfun_0.14 compiler_4.0.0
[17] base64enc_0.1-3 tensorflow_2.2.0 knitr_1.28
解决方案
我遇到了同样的问题,并通过手动设置选项以使用此处指定的 cuDNN 兼容实现来修复它。
“基于可用的运行时硬件和约束,该层将选择不同的实现(基于 cuDNN 或纯 TensorFlow)以最大化性能。如果 GPU 可用并且该层的所有参数都满足 CuDNN 内核的要求(请参阅详情见下文),该层将使用快速 cuDNN 实现。”
使用 cuDNN 实现的要求是:
- 激活 == tanh
- 经常性激活 == sigmoid
- 经常性辍学 == 0
- 展开是 False
- use_bias 是 True
- 输入,如果使用掩码,则严格右填充。
- 在最外层的上下文中启用了急切执行。
特别是,我必须指定recurrent_activation == sigmoid
. 我安装的 Keras/TF 版本默认为recurrent_activation == hard_sigmoid
.
推荐阅读
- php - slim/twig-view 不适用于附加路由中间件
- angularjs - 动态添加联系号码的角度反应
- marklogic - 在marklogic中将数据插入森林
- jquery - 使用jquery验证视图中的空值
- git - 当 Jenkins 从 git origin 获取时,它给出错误“无法锁定 ref”
- javascript - 如何向原型添加属性(javascript)
- c# - Gridview 仅显示 MySQL 数据库中的 1 行 - ASP.net C#
- node.js - 类型错误:getUserInfo 不是函数
- html - 如何在 HTML/CSS 中为视频添加边框半径
- google-sheets - 在 Google 表格中以易于管理的方式汇总学生信息/呈现