我在GPU实例上训练了一个深度学习模型,以加快训练过程。 但不幸的是,我们的产品实例是纯CPU实例。 当我尝试在仅限CPU的实例上使用经过GPU训练的模型与CuDNNGRU配合使用时,出现以下错误。
ValueError: CuDNNGRU is not compatible with GRU(reset_after=False)
如果使用CuDNNLSTM,则会出现类似的错误
ValueError: CuDNNLSTM is not compatible with LSTM(reset_after=False)
答案 0 :(得分:1)
不使用CuDNNGRU或CuDNNLSTM,而是使用具有以下选项的普通GRU或LSTM
在GPU上训练的CuDNNGRU或CuDNNLSTM模型在推理仅用于CPU的实例时抛出错误时引发错误的代码。
CuDNNGRU
if tf.test.is_gpu_available():
return tf.keras.layers.CuDNNGRU(units,
return_sequences=True,
return_state=True,
recurrent_initializer='glorot_uniform')
else:
return tf.keras.layers.GRU(units,
return_sequences=True,
return_state=True,
recurrent_initializer='glorot_uniform')
或
CuDNNLSTM
if tf.test.is_gpu_available():
return tf.keras.layers.CuDNNLSTM(units,
return_sequences=True,
return_state=True,
recurrent_initializer='glorot_uniform')
else:
return tf.keras.layers.LSTM(units,
return_sequences=True,
return_state=True,
recurrent_initializer='glorot_uniform')
请使用以下代码,以便可以将GPU训练的模型用于仅CPU实例的推断。
GRU
if tf.test.is_gpu_available():
return tf.compat.v1.keras.layers.CuDNNGRU(units,
return_sequences=True,
return_state=True,
recurrent_initializer='glorot_uniform')
else:
return tf.keras.layers.GRU(units,
return_sequences=True,
return_state=True,
recurrent_activation='sigmoid',
reset_after='True',
recurrent_initializer='glorot_uniform')
或
LSTM
if tf.test.is_gpu_available():
return tf.compat.v1.keras.layers.CuDNNLSTM(units,
return_sequences=True,
return_state=True,
recurrent_initializer='glorot_uniform')
else:
return tf.keras.layers.LSTM(units,
return_sequences=True,
return_state=True,
recurrent_activation='sigmoid',
reset_after='True',
recurrent_initializer='glorot_uniform')
因此,只需使用 reset_after = True 和 recurrent_activation ='Sigmoid'选项,即可解决我的问题。