Адаптация кода модели Tensorflow RNN Seq2Seq для Tensorflow 2.0

Я новичок в Tensorflow и возился с простым проектом по созданию чат-бота из эту ссылку.

Было много предупреждений, в которых говорилось, что в Tensorflow 2.0 что-то будет устаревшим и что мне следует обновить его, поэтому я и сделал. Затем я использовал автоматическое средство обновления кода Tensorflow, чтобы обновить все необходимые файлы до версии 2.0. С этим было несколько ошибок.

При обработке файла model.py он выдал следующие предупреждения:

133:20: WARNING: tf.nn.sampled_softmax_loss requires manual check. `partition_strategy` has been removed from tf.nn.sampled_softmax_loss.  The 'div' strategy will be used by default.
148:31: WARNING: Using member tf.contrib.rnn.DropoutWrapper in deprecated module tf.contrib.rnn. (Manual edit required) tf.contrib.rnn.* has been deprecated, and widely used cells/functions will be moved to tensorflow/addons repository. Please check it there and file Github issues if necessary.
148:31: ERROR: Using member tf.contrib.rnn.DropoutWrapper in deprecated module tf.contrib. tf.contrib.rnn.DropoutWrapper cannot be converted automatically. tf.contrib will not be distributed with TensorFlow 2.0, please consider an alternative in non-contrib TensorFlow, a community-maintained repository such as tensorflow/addons, or fork the required code.
171:33: ERROR: Using member tf.contrib.legacy_seq2seq.embedding_rnn_seq2seq in deprecated module tf.contrib. tf.contrib.legacy_seq2seq.embedding_rnn_seq2seq cannot be converted automatically. tf.contrib will not be distributed with TensorFlow 2.0, please consider an alternative in non-contrib TensorFlow, a community-maintained repository such as tensorflow/addons, or fork the required code.
197:27: ERROR: Using member tf.contrib.legacy_seq2seq.sequence_loss in deprecated module tf.contrib. tf.contrib.legacy_seq2seq.sequence_loss cannot be converted automatically. tf.contrib will not be distributed with TensorFlow 2.0, please consider an alternative in non-contrib TensorFlow, a community-maintained repository such as tensorflow/addons, or fork the required code.

Основная проблема, с которой я столкнулся, - это работа с кодом из несуществующего модуля contrib. Как я могу адаптировать следующие три блока кода, чтобы они работали в Tensorflow 2.0?

# Define the network
        # Here we use an embedding model, it takes integer as input and convert them into word vector for
        # better word representation
        decoderOutputs, states = tf.contrib.legacy_seq2seq.embedding_rnn_seq2seq(
            self.encoderInputs,  # List<[batch=?, inputDim=1]>, list of size args.maxLength
            self.decoderInputs,  # For training, we force the correct output (feed_previous=False)
            encoDecoCell,
            self.textData.getVocabularySize(),
            self.textData.getVocabularySize(),  # Both encoder and decoder have the same number of class
            embedding_size=self.args.embeddingSize,  # Dimension of each word
            output_projection=outputProjection.getWeights() if outputProjection else None,
            feed_previous=bool(self.args.test)  # When we test (self.args.test), we use previous output as next input (feed_previous)
        )
# Finally, we define the loss function
            self.lossFct = tf.contrib.legacy_seq2seq.sequence_loss(
                decoderOutputs,
                self.decoderTargets,
                self.decoderWeights,
                self.textData.getVocabularySize(),
                softmax_loss_function= sampledSoftmax if outputProjection else None  # If None, use default SoftMax
            )
encoDecoCell = tf.contrib.rnn.DropoutWrapper(
                    encoDecoCell,
                    input_keep_prob=1.0,
                    output_keep_prob=self.args.dropout
                )

person Adalex3    schedule 10.10.2019    source источник


Ответы (1)


tf.contrib - это в основном вклад сообщества TensorFlow, он работает, как показано ниже.

  • Члены сообщества могут отправлять код, который затем распространяется со стандартным пакетом TensorFlow. Их код проверяется командой TensorFlow и тестируется в рамках тестов TensorFlow.

Теперь в tensorflow 2 Tensorflow удалил contrib, и теперь у каждого проекта в contrib есть один из трех вариантов будущего: перейти в ядро; переместить в отдельный репозиторий; или удалить.

Вы можете проверить все списки проектов, попадающих в какую категорию из этого ссылка.

Переходя к альтернативному решению, перенос кода с Tensorflow 1 на Tensorflow 2 не будет происходить автоматически, и вам придется изменить это вручную.
Вместо этого вы можете использовать следующие альтернативы.

tf.contrib.rnn.DropoutWrapper вы можете изменить его на tf.compat.v1.nn.rnn_cell.DropoutWrapper

Для перехода от последовательности к последовательности вы можете использовать TensorFlow Addons.

Проект TensorFlow Addons включает в себя множество инструментов для преобразования последовательности в последовательность, позволяющих легко создавать готовые к работе кодеры-декодеры.

Например, вы можете использовать что-то вроде ниже.

import tensorflow_addons as tfa
encoder_inputs = keras.layers.Input(shape=[None], dtype=np.int32)
decoder_inputs = keras.layers.Input(shape=[None], dtype=np.int32)
sequence_lengths = keras.layers.Input(shape=[], dtype=np.int32)
embeddings = keras.layers.Embedding(vocab_size, embed_size)
encoder_embeddings = embeddings(encoder_inputs)
decoder_embeddings = embeddings(decoder_inputs)
encoder = keras.layers.LSTM(512, return_state=True)
encoder_outputs, state_h, state_c = encoder(encoder_embeddings)encoder_state = [state_h, state_c]
sampler = tfa.seq2seq.sampler.TrainingSampler()
decoder_cell = keras.layers.LSTMCell(512)
output_layer = keras.layers.Dense(vocab_size)
decoder = tfa.seq2seq.basic_decoder.BasicDecoder(decoder_cell, sampler,
output_layer=output_layer)
final_outputs, final_state, final_sequence_lengths = decoder(
decoder_embeddings, initial_state=encoder_state,
sequence_length=sequence_lengths)
Y_proba = tf.nn.softmax(final_outputs.rnn_output)
model = keras.Model(inputs=[encoder_inputs, decoder_inputs,
sequence_lengths],
outputs=[Y_proba])

Таким же образом вам нужно изменить все методы с помощью tf.contrib на совместимые.

Надеюсь, это ответ на ваш вопрос.

person Tensorflow Warrior    schedule 15.05.2020
comment
@ Adalex3 - Если вы думаете, что я ответил на ваш вопрос, примите ответ и проголосуйте за него. - person Tensorflow Warrior; 15.05.2020
comment
не могли бы вы объяснить здесь вызов функции decoder( decoder_embeddings, initial_state=encoder_state, sequence_length=sequence_lengths)? Я не видел sequence_length как аргумент функции в строке 159 исходного кода github.com/tensorflow/addons/blob/ - person thinkdeep; 14.07.2020