Контекст
При использовании CuDNNLSTM
или CuDNNGRU
в Keras (с tensorflow
-backend) я осознаю тот факт, что вы должны использовать жестко закодированный tanh -активация функции. Есть несколько вопросов и обсуждений по этому поводу, например, на gitHub или здесь и здесь на Stackoverflow. Тем не менее, следующая модель компилируется и рассчитывается в CuDNN-скорости:
# If using tensorflow > 2.0 use keras = tf.compat.v1.keras
from keras.layers import CuDNNGRU, PReLU
model.add(CuDNNGRU(200, return_sequences=True, input_shape=input_shape, name="GRU1"))
model.add(PReLU(name="PReLU1"))
model.add(CuDNNGRU(200, return_sequences=True, input_shape=input_shape, name="GRU2"))
model.add(PReLU(name="PReLU2"))
model.add(CuDNNGRU(2, return_sequences=False, input_shape=input_shape, name="GRU1"))
model.compile(optimizer=optimizer, loss=loss)
###################################################################
model.summary()
# Model: "sequential"
# _________________________________________________________________
# Layer (type) Output Shape Param #
# =================================================================
# GRU1 (CuDNNGRU) (None, 200, 200) 125400
# _________________________________________________________________
# PReLU1 (PReLU) (None, 200, 200) 40000
# _________________________________________________________________
# GRU2 (CuDNNGRU) (None, 200, 200) 241200
# _________________________________________________________________
# PReLU2 (PReLU) (None, 200, 200) 40000
# _________________________________________________________________
# GRU_OUT (CuDNNGRU) (None, 2) 1224
# =================================================================
# Total params: 447,824
# Trainable params: 447,824
# Non-trainable params: 0
Вопросы
1. Относительно слоя PReLU
: правильно ли я понимаю, что сначала CuDNNGRU
применяется в слоях *1029*, а после этого применения дополнительно проходит активацию PReLU
?
2. Относительно скорости вычислений: я удивился, почему добавление PReLU
не повлияло на скорость вычислений (по общему признанию, PReLU не самый интенсивный для вычислений слой ...), так как данные должны «покинуть» cuDNN-API.
Является ли уровень cuDNN фактически закрытым модулем в модели, и нескольким уровням cuDNN приходится передавать данные для расчета, или Keras распознает несколько напрямую связанных уровней cuDNN как один вызов API (в противном случае он выглядит как немного неэффективно реализовано)?