Поведение CuDNNLSTM / CuDNNGRU между слоями cuDNN и промежуточным активационным слоем - PullRequest
0 голосов
/ 25 апреля 2020

Контекст

При использовании 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 (в противном случае он выглядит как немного неэффективно реализовано)?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...