为Tensorflow 2.0调整Tensorflow RNN Seq2Seq模型代码 [英] Adapting Tensorflow RNN Seq2Seq model code for Tensorflow 2.0

查看:292
本文介绍了为Tensorflow 2.0调整Tensorflow RNN Seq2Seq模型代码的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我是Tensorflow的新手,并且一直在

I am very new to Tensorflow and have been messing around with a simple chatbot-building project from this link.

有很多警告说,Tensorflow 2.0中将弃用某些东西,我应该升级,所以我做到了.然后,我使用自动的 Tensorflow代码升级程序将所有必需的文件更新为2.0.这有一些错误.

There were many warnings that were saying that things would be deprecated in Tensorflow 2.0 and that I should upgrade, so I did. I then used the automatic Tensorflow code upgrader to update all the necessary files to 2.0. There were a few errors with this.

在处理model.py文件时,它返回以下警告:

When processing the model.py file, it returned these warnings:

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中正常工作?

The main problem I am having is working with the code from the now nonexistent contrib module. How can I adapt the following three code blocks so they work in 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
                )

推荐答案

tf.contrib 基本上是TensorFlow社区做出的贡献,其工作原理如下.

tf.contrib is basically a contribution made by the TensorFlow community, it works like below.

  • 社区成员可以提交代码,然后将其与标准TensorFlow软件包一起分发.他们的代码已由TensorFlow团队并作为TensorFlow测试的一部分进行了测试.

现在在tensorflow 2中,Tensorflow删除了contrib,现在contrib中的每个项目都具有其未来的三个选择之一:移至核心;移至单独的存储库;或删除.

Now in tensorflow 2, Tensorflow removed contrib and now each project in contrib has one of three options for its future: move to core; move to a separate repository; or delete.

您可以从此链接.

作为替代解决方案,从Tensorflow 1到Tensorflow 2的移植代码不会自动发生,您必须手动更改.
您可以改用以下替代方法.

Coming to the alternative solution,migarting code from Tensorflow 1 to Tensorflow 2 will not happen automatically, which you have to change manually.
You can follow the below alternatives instead.

tf.contrib.rnn.DropoutWrapper ,您可以将其更改为 tf.compat.v1.nn.rnn_cell.DropoutWrapper

tf.contrib.rnn.DropoutWrapper you can change it to tf.compat.v1.nn.rnn_cell.DropoutWrapper

要序列化,可以使用 TensorFlow插件.

TensorFlow Addons项目包括许多序列到序列使您可以轻松构建可用于生产环境的编码器-解码器的工具.

The TensorFlow Addons project includes many sequence-to-sequence tools to let you easily build production-ready Encoder–Decoders.

例如,您可以使用类似以下的内容.

For example, you can use something like below.

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将所有方法更改为兼容方法.

Same way you need to change all the methods using tf.contrib to the compatible one's.

我希望这能回答您的问题.

I hope this answeres your question.

这篇关于为Tensorflow 2.0调整Tensorflow RNN Seq2Seq模型代码的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆