Я пытаюсь выяснить причину, по которой скорость отличается от двух разных моделей.
- модель LSTM RNN, построенная с использованием tenorflow 1.x:
self.input_placeholder = tf.placeholder(
tf.int32, shape=[self.config.batch_size, self.config.num_steps], name='Input')
self.labels_placeholder = tf.placeholder(
tf.int32, shape=[self.config.batch_size, self.config.num_steps], name='Target')
embedding = tf.get_variable(
'Embedding', initializer = self.embedding_matrix, trainable = False)
inputs = tf.nn.embedding_lookup(embedding, self.input_placeholder)
inputs = [tf.squeeze(x, axis = 1) for x in tf.split(inputs, self.config.num_steps, axis = 1)]
self.initial_state = tf.zeros([self.config.batch_size, self.config.hidden_size])
lstm_cell = tf.contrib.rnn.BasicLSTMCell(self.config.hidden_size)
outputs, _ = tf.contrib.rnn.static_rnn(
lstm_cell, inputs, dtype = tf.float32,
sequence_length = [self.config.num_steps]*self.config.batch_size)
with tf.variable_scope('Projection'):
proj_U = tf.get_variable('Matrix', [self.config.hidden_size, self.config.vocab_size])
proj_b = tf.get_variable('Bias', [self.config.vocab_size])
outputs = [tf.matmul(o, proj_U) + proj_b for o in rnn_outputs]
та же модель (по крайней мере, насколько я понимаю), построенная с использованием тензор потока 2.0 кера:
def setup_model():
model = Sequential()
model.add(Embedding(input_dim=vocab_size,
output_dim=embedding_dim,
weights=[embedding_matrix],
input_length=4,
trainable=False))
model.add(LSTM(config.hidden_size, activation="tanh"))
model.add(Dense(vocab_size, activation="softmax"))
return model
Архитектура:
Model: "sequential"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
embedding (Embedding) (None, 4, 100) 55400
_________________________________________________________________
lstm (LSTM) (None, 100) 80400
_________________________________________________________________
dense (Dense) (None, 554) 55954
=================================================================
Total params: 191,754
Trainable params: 136,354
Non-trainable params: 55,400
_________________________________________________________________
Я ожидал подобного времени выполнения логического вывода, но тот, который построен на tenorflow 1.x, намного быстрее. Я пытался преобразовать модель тензорного потока 1.х в тензорный поток 2, используя только собственные функции тензорного потока, но у меня возникли проблемы с преобразованием из-за большого изменения тензорного потока с 1.х до 2, и я смог создать его только с помощью tf.keras. .
С точки зрения скорости, так как я использую оба для генерации текстовых последовательностей + получения вероятностей слов, поэтому у меня нет единой разницы во времени логического вывода (я не могу изменить существующий API из тензорного потока 1. х модель, чтобы получить это). Но в целом я вижу как минимум двукратную разницу во времени по сравнению с моими вариантами использования.
Какие могут быть возможные причины такой разницы в скорости вывода? Я рад предоставить больше информации, если это необходимо.