aboutsummaryrefslogtreecommitdiffhomepage
path: root/tensorflow/python/kernel_tests/seq2seq_test.py
diff options
context:
space:
mode:
Diffstat (limited to 'tensorflow/python/kernel_tests/seq2seq_test.py')
-rw-r--r--tensorflow/python/kernel_tests/seq2seq_test.py770
1 files changed, 0 insertions, 770 deletions
diff --git a/tensorflow/python/kernel_tests/seq2seq_test.py b/tensorflow/python/kernel_tests/seq2seq_test.py
deleted file mode 100644
index 03b5f68659..0000000000
--- a/tensorflow/python/kernel_tests/seq2seq_test.py
+++ /dev/null
@@ -1,770 +0,0 @@
-# Copyright 2015 The TensorFlow Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-# ==============================================================================
-
-"""Tests for functional style sequence-to-sequence models."""
-from __future__ import absolute_import
-from __future__ import division
-from __future__ import print_function
-
-import math
-import random
-
-import numpy as np
-import tensorflow as tf
-
-
-class Seq2SeqTest(tf.test.TestCase):
-
- def testRNNDecoder(self):
- with self.test_session() as sess:
- with tf.variable_scope("root", initializer=tf.constant_initializer(0.5)):
- inp = [tf.constant(0.5, shape=[2, 2])] * 2
- _, enc_state = tf.nn.rnn(
- tf.nn.rnn_cell.GRUCell(2), inp, dtype=tf.float32)
- dec_inp = [tf.constant(0.4, shape=[2, 2])] * 3
- cell = tf.nn.rnn_cell.OutputProjectionWrapper(
- tf.nn.rnn_cell.GRUCell(2), 4)
- dec, mem = tf.nn.seq2seq.rnn_decoder(dec_inp, enc_state, cell)
- sess.run([tf.global_variables_initializer()])
- res = sess.run(dec)
- self.assertEqual(3, len(res))
- self.assertEqual((2, 4), res[0].shape)
-
- res = sess.run([mem])
- self.assertEqual((2, 2), res[0].shape)
-
- def testBasicRNNSeq2Seq(self):
- with self.test_session() as sess:
- with tf.variable_scope("root", initializer=tf.constant_initializer(0.5)):
- inp = [tf.constant(0.5, shape=[2, 2])] * 2
- dec_inp = [tf.constant(0.4, shape=[2, 2])] * 3
- cell = tf.nn.rnn_cell.OutputProjectionWrapper(
- tf.nn.rnn_cell.GRUCell(2), 4)
- dec, mem = tf.nn.seq2seq.basic_rnn_seq2seq(inp, dec_inp, cell)
- sess.run([tf.global_variables_initializer()])
- res = sess.run(dec)
- self.assertEqual(3, len(res))
- self.assertEqual((2, 4), res[0].shape)
-
- res = sess.run([mem])
- self.assertEqual((2, 2), res[0].shape)
-
- def testTiedRNNSeq2Seq(self):
- with self.test_session() as sess:
- with tf.variable_scope("root", initializer=tf.constant_initializer(0.5)):
- inp = [tf.constant(0.5, shape=[2, 2])] * 2
- dec_inp = [tf.constant(0.4, shape=[2, 2])] * 3
- cell = tf.nn.rnn_cell.OutputProjectionWrapper(
- tf.nn.rnn_cell.GRUCell(2), 4)
- dec, mem = tf.nn.seq2seq.tied_rnn_seq2seq(inp, dec_inp, cell)
- sess.run([tf.global_variables_initializer()])
- res = sess.run(dec)
- self.assertEqual(3, len(res))
- self.assertEqual((2, 4), res[0].shape)
-
- res = sess.run([mem])
- self.assertEqual(1, len(res))
- self.assertEqual((2, 2), res[0].shape)
-
- def testEmbeddingRNNDecoder(self):
- with self.test_session() as sess:
- with tf.variable_scope("root", initializer=tf.constant_initializer(0.5)):
- inp = [tf.constant(0.5, shape=[2, 2])] * 2
- cell = tf.nn.rnn_cell.BasicLSTMCell(2, state_is_tuple=True)
- _, enc_state = tf.nn.rnn(cell, inp, dtype=tf.float32)
- dec_inp = [tf.constant(i, tf.int32, shape=[2]) for i in range(3)]
- dec, mem = tf.nn.seq2seq.embedding_rnn_decoder(
- dec_inp, enc_state, cell, num_symbols=4, embedding_size=2)
- sess.run([tf.global_variables_initializer()])
- res = sess.run(dec)
- self.assertEqual(3, len(res))
- self.assertEqual((2, 2), res[0].shape)
-
- res = sess.run([mem])
- self.assertEqual(1, len(res))
- self.assertEqual((2, 2), res[0].c.shape)
- self.assertEqual((2, 2), res[0].h.shape)
-
- def testEmbeddingRNNSeq2Seq(self):
- with self.test_session() as sess:
- with tf.variable_scope("root", initializer=tf.constant_initializer(0.5)):
- enc_inp = [tf.constant(1, tf.int32, shape=[2]) for i in range(2)]
- dec_inp = [tf.constant(i, tf.int32, shape=[2]) for i in range(3)]
- cell = tf.nn.rnn_cell.BasicLSTMCell(2, state_is_tuple=True)
- dec, mem = tf.nn.seq2seq.embedding_rnn_seq2seq(
- enc_inp, dec_inp, cell, num_encoder_symbols=2,
- num_decoder_symbols=5, embedding_size=2)
- sess.run([tf.global_variables_initializer()])
- res = sess.run(dec)
- self.assertEqual(3, len(res))
- self.assertEqual((2, 5), res[0].shape)
-
- res = sess.run([mem])
- self.assertEqual((2, 2), res[0].c.shape)
- self.assertEqual((2, 2), res[0].h.shape)
-
- # Test with state_is_tuple=False.
- with tf.variable_scope("no_tuple"):
- cell1 = tf.nn.rnn_cell.BasicLSTMCell(2, state_is_tuple=False)
- dec, mem = tf.nn.seq2seq.embedding_rnn_seq2seq(
- enc_inp, dec_inp, cell1, num_encoder_symbols=2,
- num_decoder_symbols=5, embedding_size=2)
- sess.run([tf.global_variables_initializer()])
- res = sess.run(dec)
- self.assertEqual(3, len(res))
- self.assertEqual((2, 5), res[0].shape)
-
- res = sess.run([mem])
- self.assertEqual((2, 4), res[0].shape)
-
- # Test externally provided output projection.
- w = tf.get_variable("proj_w", [2, 5])
- b = tf.get_variable("proj_b", [5])
- with tf.variable_scope("proj_seq2seq"):
- dec, _ = tf.nn.seq2seq.embedding_rnn_seq2seq(
- enc_inp, dec_inp, cell, num_encoder_symbols=2,
- num_decoder_symbols=5, embedding_size=2, output_projection=(w, b))
- sess.run([tf.global_variables_initializer()])
- res = sess.run(dec)
- self.assertEqual(3, len(res))
- self.assertEqual((2, 2), res[0].shape)
-
- # Test that previous-feeding model ignores inputs after the first.
- dec_inp2 = [tf.constant(0, tf.int32, shape=[2]) for _ in range(3)]
- with tf.variable_scope("other"):
- d3, _ = tf.nn.seq2seq.embedding_rnn_seq2seq(
- enc_inp, dec_inp2, cell, num_encoder_symbols=2,
- num_decoder_symbols=5, embedding_size=2,
- feed_previous=tf.constant(True))
- sess.run([tf.global_variables_initializer()])
- tf.get_variable_scope().reuse_variables()
- d1, _ = tf.nn.seq2seq.embedding_rnn_seq2seq(
- enc_inp, dec_inp, cell, num_encoder_symbols=2,
- num_decoder_symbols=5, embedding_size=2, feed_previous=True)
- d2, _ = tf.nn.seq2seq.embedding_rnn_seq2seq(
- enc_inp, dec_inp2, cell, num_encoder_symbols=2,
- num_decoder_symbols=5, embedding_size=2, feed_previous=True)
- res1 = sess.run(d1)
- res2 = sess.run(d2)
- res3 = sess.run(d3)
- self.assertAllClose(res1, res2)
- self.assertAllClose(res1, res3)
-
- def testEmbeddingTiedRNNSeq2Seq(self):
- with self.test_session() as sess:
- with tf.variable_scope("root", initializer=tf.constant_initializer(0.5)):
- enc_inp = [tf.constant(1, tf.int32, shape=[2]) for i in range(2)]
- dec_inp = [tf.constant(i, tf.int32, shape=[2]) for i in range(3)]
- cell = tf.nn.rnn_cell.BasicLSTMCell(2, state_is_tuple=True)
- dec, mem = tf.nn.seq2seq.embedding_tied_rnn_seq2seq(
- enc_inp, dec_inp, cell, num_symbols=5, embedding_size=2)
- sess.run([tf.global_variables_initializer()])
- res = sess.run(dec)
- self.assertEqual(3, len(res))
- self.assertEqual((2, 5), res[0].shape)
-
- res = sess.run([mem])
- self.assertEqual((2, 2), res[0].c.shape)
- self.assertEqual((2, 2), res[0].h.shape)
-
- # Test when num_decoder_symbols is provided, the size of decoder output
- # is num_decoder_symbols.
- with tf.variable_scope("decoder_symbols_seq2seq"):
- dec, mem = tf.nn.seq2seq.embedding_tied_rnn_seq2seq(
- enc_inp, dec_inp, cell, num_symbols=5, num_decoder_symbols=3,
- embedding_size=2)
- sess.run([tf.global_variables_initializer()])
- res = sess.run(dec)
- self.assertEqual(3, len(res))
- self.assertEqual((2, 3), res[0].shape)
-
- # Test externally provided output projection.
- w = tf.get_variable("proj_w", [2, 5])
- b = tf.get_variable("proj_b", [5])
- with tf.variable_scope("proj_seq2seq"):
- dec, _ = tf.nn.seq2seq.embedding_tied_rnn_seq2seq(
- enc_inp, dec_inp, cell, num_symbols=5, embedding_size=2,
- output_projection=(w, b))
- sess.run([tf.global_variables_initializer()])
- res = sess.run(dec)
- self.assertEqual(3, len(res))
- self.assertEqual((2, 2), res[0].shape)
-
- # Test that previous-feeding model ignores inputs after the first.
- dec_inp2 = [tf.constant(0, tf.int32, shape=[2])] * 3
- with tf.variable_scope("other"):
- d3, _ = tf.nn.seq2seq.embedding_tied_rnn_seq2seq(
- enc_inp, dec_inp2, cell, num_symbols=5, embedding_size=2,
- feed_previous=tf.constant(True))
- sess.run([tf.global_variables_initializer()])
- tf.get_variable_scope().reuse_variables()
- d1, _ = tf.nn.seq2seq.embedding_tied_rnn_seq2seq(
- enc_inp, dec_inp, cell, num_symbols=5, embedding_size=2,
- feed_previous=True)
- d2, _ = tf.nn.seq2seq.embedding_tied_rnn_seq2seq(
- enc_inp, dec_inp2, cell, num_symbols=5, embedding_size=2,
- feed_previous=True)
- res1 = sess.run(d1)
- res2 = sess.run(d2)
- res3 = sess.run(d3)
- self.assertAllClose(res1, res2)
- self.assertAllClose(res1, res3)
-
- def testAttentionDecoder1(self):
- with self.test_session() as sess:
- with tf.variable_scope("root", initializer=tf.constant_initializer(0.5)):
- cell = tf.nn.rnn_cell.GRUCell(2)
- inp = [tf.constant(0.5, shape=[2, 2])] * 2
- enc_outputs, enc_state = tf.nn.rnn(cell, inp, dtype=tf.float32)
- attn_states = tf.concat(1, [tf.reshape(e, [-1, 1, cell.output_size])
- for e in enc_outputs])
- dec_inp = [tf.constant(0.4, shape=[2, 2])] * 3
- dec, mem = tf.nn.seq2seq.attention_decoder(
- dec_inp, enc_state,
- attn_states, cell, output_size=4)
- sess.run([tf.global_variables_initializer()])
- res = sess.run(dec)
- self.assertEqual(3, len(res))
- self.assertEqual((2, 4), res[0].shape)
-
- res = sess.run([mem])
- self.assertEqual((2, 2), res[0].shape)
-
- def testAttentionDecoder2(self):
- with self.test_session() as sess:
- with tf.variable_scope("root", initializer=tf.constant_initializer(0.5)):
- cell = tf.nn.rnn_cell.GRUCell(2)
- inp = [tf.constant(0.5, shape=[2, 2])] * 2
- enc_outputs, enc_state = tf.nn.rnn(cell, inp, dtype=tf.float32)
- attn_states = tf.concat(1, [tf.reshape(e, [-1, 1, cell.output_size])
- for e in enc_outputs])
- dec_inp = [tf.constant(0.4, shape=[2, 2])] * 3
- dec, mem = tf.nn.seq2seq.attention_decoder(
- dec_inp, enc_state,
- attn_states, cell, output_size=4,
- num_heads=2)
- sess.run([tf.global_variables_initializer()])
- res = sess.run(dec)
- self.assertEqual(3, len(res))
- self.assertEqual((2, 4), res[0].shape)
-
- res = sess.run([mem])
- self.assertEqual((2, 2), res[0].shape)
-
- def testDynamicAttentionDecoder1(self):
- with self.test_session() as sess:
- with tf.variable_scope("root", initializer=tf.constant_initializer(0.5)):
- cell = tf.nn.rnn_cell.GRUCell(2)
- inp = tf.constant(0.5, shape=[2, 2, 2])
- enc_outputs, enc_state = tf.nn.dynamic_rnn(cell, inp, dtype=tf.float32)
- attn_states = enc_outputs
- dec_inp = [tf.constant(0.4, shape=[2, 2])] * 3
- dec, mem = tf.nn.seq2seq.attention_decoder(
- dec_inp, enc_state,
- attn_states, cell, output_size=4)
- sess.run([tf.global_variables_initializer()])
- res = sess.run(dec)
- self.assertEqual(3, len(res))
- self.assertEqual((2, 4), res[0].shape)
-
- res = sess.run([mem])
- self.assertEqual((2, 2), res[0].shape)
-
- def testDynamicAttentionDecoder2(self):
- with self.test_session() as sess:
- with tf.variable_scope("root", initializer=tf.constant_initializer(0.5)):
- cell = tf.nn.rnn_cell.GRUCell(2)
- inp = tf.constant(0.5, shape=[2, 2, 2])
- enc_outputs, enc_state = tf.nn.dynamic_rnn(cell, inp, dtype=tf.float32)
- attn_states = enc_outputs
- dec_inp = [tf.constant(0.4, shape=[2, 2])] * 3
- dec, mem = tf.nn.seq2seq.attention_decoder(
- dec_inp, enc_state,
- attn_states, cell, output_size=4,
- num_heads=2)
- sess.run([tf.global_variables_initializer()])
- res = sess.run(dec)
- self.assertEqual(3, len(res))
- self.assertEqual((2, 4), res[0].shape)
-
- res = sess.run([mem])
- self.assertEqual((2, 2), res[0].shape)
-
- def testAttentionDecoderStateIsTuple(self):
- with self.test_session() as sess:
- with tf.variable_scope("root", initializer=tf.constant_initializer(0.5)):
- cell = tf.nn.rnn_cell.BasicLSTMCell(2, state_is_tuple=True)
- cell = tf.nn.rnn_cell.MultiRNNCell(cells=[cell] * 2,
- state_is_tuple=True)
- inp = [tf.constant(0.5, shape=[2, 2])] * 2
- enc_outputs, enc_state = tf.nn.rnn(cell, inp, dtype=tf.float32)
- attn_states = tf.concat(1, [tf.reshape(e, [-1, 1, cell.output_size])
- for e in enc_outputs])
- dec_inp = [tf.constant(0.4, shape=[2, 2])] * 3
- dec, mem = tf.nn.seq2seq.attention_decoder(
- dec_inp, enc_state,
- attn_states, cell, output_size=4)
- sess.run([tf.global_variables_initializer()])
- res = sess.run(dec)
- self.assertEqual(3, len(res))
- self.assertEqual((2, 4), res[0].shape)
-
- res = sess.run([mem])
- self.assertEqual(2, len(res[0]))
- self.assertEqual((2, 2), res[0][0].c.shape)
- self.assertEqual((2, 2), res[0][0].h.shape)
- self.assertEqual((2, 2), res[0][1].c.shape)
- self.assertEqual((2, 2), res[0][1].h.shape)
-
- # pylint: disable=unused-variable,invalid-name
- def testDynamicAttentionDecoderStateIsTuple(self):
- with self.test_session() as sess:
- with tf.variable_scope(
- "root", initializer=tf.constant_initializer(0.5)):
- cell = tf.nn.rnn_cell.BasicLSTMCell(2, state_is_tuple=True)
- cell = tf.nn.rnn_cell.MultiRNNCell(cells=[cell] * 2,
- state_is_tuple=True)
- inp = tf.constant(0.5, shape=[2, 2, 2])
- enc_outputs, enc_state = tf.nn.rnn(cell, inp, dtype=tf.float32)
- attn_states = tf.concat(1, [tf.reshape(e, [-1, 1, cell.output_size])
- for e in enc_outputs])
- dec_inp = [tf.constant(0.4, shape=[2, 2])] * 3
- dec, mem = tf.nn.seq2seq.attention_decoder(
- dec_inp, enc_state,
- attn_states, cell, output_size=4)
- sess.run([tf.global_variables_initializer()])
- res = sess.run(dec)
- self.assertEqual(3, len(res))
- self.assertEqual((2, 4), res[0].shape)
-
- res = sess.run([mem])
- self.assertEqual(2, len(res[0]))
- self.assertEqual((2, 2), res[0][0].c.shape)
- self.assertEqual((2, 2), res[0][0].h.shape)
- self.assertEqual((2, 2), res[0][1].c.shape)
- self.assertEqual((2, 2), res[0][1].h.shape)
-
- def testEmbeddingAttentionDecoder(self):
- with self.test_session() as sess:
- with tf.variable_scope("root", initializer=tf.constant_initializer(0.5)):
- inp = [tf.constant(0.5, shape=[2, 2])] * 2
- cell = tf.nn.rnn_cell.GRUCell(2)
- enc_outputs, enc_state = tf.nn.rnn(cell, inp, dtype=tf.float32)
- attn_states = tf.concat(1, [tf.reshape(e, [-1, 1, cell.output_size])
- for e in enc_outputs])
- dec_inp = [tf.constant(i, tf.int32, shape=[2]) for i in range(3)]
- dec, mem = tf.nn.seq2seq.embedding_attention_decoder(
- dec_inp, enc_state, attn_states, cell, num_symbols=4,
- embedding_size=2, output_size=3)
- sess.run([tf.global_variables_initializer()])
- res = sess.run(dec)
- self.assertEqual(3, len(res))
- self.assertEqual((2, 3), res[0].shape)
-
- res = sess.run([mem])
- self.assertEqual((2, 2), res[0].shape)
-
- def testEmbeddingAttentionSeq2Seq(self):
- with self.test_session() as sess:
- with tf.variable_scope("root", initializer=tf.constant_initializer(0.5)):
- enc_inp = [tf.constant(1, tf.int32, shape=[2]) for i in range(2)]
- dec_inp = [tf.constant(i, tf.int32, shape=[2]) for i in range(3)]
- cell = tf.nn.rnn_cell.BasicLSTMCell(2, state_is_tuple=True)
- dec, mem = tf.nn.seq2seq.embedding_attention_seq2seq(
- enc_inp, dec_inp, cell, num_encoder_symbols=2,
- num_decoder_symbols=5, embedding_size=2)
- sess.run([tf.global_variables_initializer()])
- res = sess.run(dec)
- self.assertEqual(3, len(res))
- self.assertEqual((2, 5), res[0].shape)
-
- res = sess.run([mem])
- self.assertEqual((2, 2), res[0].c.shape)
- self.assertEqual((2, 2), res[0].h.shape)
-
- # Test with state_is_tuple=False.
- with tf.variable_scope("no_tuple"):
- cell = tf.nn.rnn_cell.BasicLSTMCell(2, state_is_tuple=False)
- dec, mem = tf.nn.seq2seq.embedding_attention_seq2seq(
- enc_inp, dec_inp, cell, num_encoder_symbols=2,
- num_decoder_symbols=5, embedding_size=2)
- sess.run([tf.global_variables_initializer()])
- res = sess.run(dec)
- self.assertEqual(3, len(res))
- self.assertEqual((2, 5), res[0].shape)
-
- res = sess.run([mem])
- self.assertEqual((2, 4), res[0].shape)
-
- # Test externally provided output projection.
- w = tf.get_variable("proj_w", [2, 5])
- b = tf.get_variable("proj_b", [5])
- with tf.variable_scope("proj_seq2seq"):
- dec, _ = tf.nn.seq2seq.embedding_attention_seq2seq(
- enc_inp, dec_inp, cell, num_encoder_symbols=2,
- num_decoder_symbols=5, embedding_size=2, output_projection=(w, b))
- sess.run([tf.global_variables_initializer()])
- res = sess.run(dec)
- self.assertEqual(3, len(res))
- self.assertEqual((2, 2), res[0].shape)
-
- # Test that previous-feeding model ignores inputs after the first.
- dec_inp2 = [tf.constant(0, tf.int32, shape=[2]) for _ in range(3)]
- with tf.variable_scope("other"):
- d3, _ = tf.nn.seq2seq.embedding_attention_seq2seq(
- enc_inp, dec_inp2, cell, num_encoder_symbols=2,
- num_decoder_symbols=5, embedding_size=2,
- feed_previous=tf.constant(True))
- sess.run([tf.global_variables_initializer()])
- tf.get_variable_scope().reuse_variables()
- d1, _ = tf.nn.seq2seq.embedding_attention_seq2seq(
- enc_inp, dec_inp, cell, num_encoder_symbols=2,
- num_decoder_symbols=5, embedding_size=2, feed_previous=True)
- d2, _ = tf.nn.seq2seq.embedding_attention_seq2seq(
- enc_inp, dec_inp2, cell, num_encoder_symbols=2,
- num_decoder_symbols=5, embedding_size=2, feed_previous=True)
- res1 = sess.run(d1)
- res2 = sess.run(d2)
- res3 = sess.run(d3)
- self.assertAllClose(res1, res2)
- self.assertAllClose(res1, res3)
-
- def testOne2ManyRNNSeq2Seq(self):
- with self.test_session() as sess:
- with tf.variable_scope("root", initializer=tf.constant_initializer(0.5)):
- enc_inp = [tf.constant(1, tf.int32, shape=[2]) for i in range(2)]
- dec_inp_dict = {}
- dec_inp_dict["0"] = [
- tf.constant(i, tf.int32, shape=[2]) for i in range(3)]
- dec_inp_dict["1"] = [
- tf.constant(i, tf.int32, shape=[2]) for i in range(4)]
- dec_symbols_dict = {"0": 5, "1": 6}
- cell = tf.nn.rnn_cell.BasicLSTMCell(2, state_is_tuple=True)
- outputs_dict, state_dict = tf.nn.seq2seq.one2many_rnn_seq2seq(
- enc_inp, dec_inp_dict, cell, 2, dec_symbols_dict, embedding_size=2)
-
- sess.run([tf.global_variables_initializer()])
- res = sess.run(outputs_dict["0"])
- self.assertEqual(3, len(res))
- self.assertEqual((2, 5), res[0].shape)
- res = sess.run(outputs_dict["1"])
- self.assertEqual(4, len(res))
- self.assertEqual((2, 6), res[0].shape)
- res = sess.run([state_dict["0"]])
- self.assertEqual((2, 2), res[0].c.shape)
- self.assertEqual((2, 2), res[0].h.shape)
- res = sess.run([state_dict["1"]])
- self.assertEqual((2, 2), res[0].c.shape)
- self.assertEqual((2, 2), res[0].h.shape)
-
- # Test that previous-feeding model ignores inputs after the first, i.e.
- # dec_inp_dict2 has different inputs from dec_inp_dict after the first
- # time-step.
- dec_inp_dict2 = {}
- dec_inp_dict2["0"] = [
- tf.constant(0, tf.int32, shape=[2]) for _ in range(3)]
- dec_inp_dict2["1"] = [
- tf.constant(0, tf.int32, shape=[2]) for _ in range(4)]
- with tf.variable_scope("other"):
- outputs_dict3, _ = tf.nn.seq2seq.one2many_rnn_seq2seq(
- enc_inp, dec_inp_dict2, cell, 2, dec_symbols_dict,
- embedding_size=2, feed_previous=tf.constant(True))
- sess.run([tf.global_variables_initializer()])
- tf.get_variable_scope().reuse_variables()
- outputs_dict1, _ = tf.nn.seq2seq.one2many_rnn_seq2seq(
- enc_inp, dec_inp_dict, cell, 2, dec_symbols_dict,
- embedding_size=2, feed_previous=True)
- outputs_dict2, _ = tf.nn.seq2seq.one2many_rnn_seq2seq(
- enc_inp, dec_inp_dict2, cell, 2, dec_symbols_dict,
- embedding_size=2, feed_previous=True)
- res1 = sess.run(outputs_dict1["0"])
- res2 = sess.run(outputs_dict2["0"])
- res3 = sess.run(outputs_dict3["0"])
- self.assertAllClose(res1, res2)
- self.assertAllClose(res1, res3)
-
- def testSequenceLoss(self):
- with self.test_session() as sess:
- logits = [tf.constant(i + 0.5, shape=[2, 5]) for i in range(3)]
- targets = [tf.constant(i, tf.int32, shape=[2]) for i in range(3)]
- weights = [tf.constant(1.0, shape=[2]) for i in range(3)]
-
- average_loss_per_example = tf.nn.seq2seq.sequence_loss(
- logits, targets, weights,
- average_across_timesteps=True,
- average_across_batch=True)
- res = sess.run(average_loss_per_example)
- self.assertAllClose(1.60944, res)
-
- average_loss_per_sequence = tf.nn.seq2seq.sequence_loss(
- logits, targets, weights,
- average_across_timesteps=False,
- average_across_batch=True)
- res = sess.run(average_loss_per_sequence)
- self.assertAllClose(4.828314, res)
-
- total_loss = tf.nn.seq2seq.sequence_loss(
- logits, targets, weights,
- average_across_timesteps=False,
- average_across_batch=False)
- res = sess.run(total_loss)
- self.assertAllClose(9.656628, res)
-
- def testSequenceLossByExample(self):
- with self.test_session() as sess:
- output_classes = 5
- logits = [tf.constant(i + 0.5, shape=[2, output_classes])
- for i in range(3)]
- targets = [tf.constant(i, tf.int32, shape=[2]) for i in range(3)]
- weights = [tf.constant(1.0, shape=[2]) for i in range(3)]
-
- average_loss_per_example = tf.nn.seq2seq.sequence_loss_by_example(
- logits, targets, weights,
- average_across_timesteps=True)
- res = sess.run(average_loss_per_example)
- self.assertAllClose(np.asarray([1.609438, 1.609438]), res)
-
- loss_per_sequence = tf.nn.seq2seq.sequence_loss_by_example(
- logits, targets, weights,
- average_across_timesteps=False)
- res = sess.run(loss_per_sequence)
- self.assertAllClose(np.asarray([4.828314, 4.828314]), res)
-
- def testModelWithBucketsScopeAndLoss(self):
- """Test that variable scope reuse is not reset after model_with_buckets."""
- classes = 10
- buckets = [(4, 4), (8, 8)]
-
- with self.test_session():
- # Here comes a sample Seq2Seq model using GRU cells.
- def SampleGRUSeq2Seq(enc_inp, dec_inp, weights, per_example_loss):
- """Example sequence-to-sequence model that uses GRU cells."""
- def GRUSeq2Seq(enc_inp, dec_inp):
- cell = tf.nn.rnn_cell.MultiRNNCell([tf.nn.rnn_cell.GRUCell(24)] * 2,
- state_is_tuple=True)
- return tf.nn.seq2seq.embedding_attention_seq2seq(
- enc_inp, dec_inp, cell, num_encoder_symbols=classes,
- num_decoder_symbols=classes, embedding_size=24)
- targets = [dec_inp[i+1] for i in range(len(dec_inp) - 1)] + [0]
- return tf.nn.seq2seq.model_with_buckets(
- enc_inp, dec_inp, targets, weights, buckets, GRUSeq2Seq,
- per_example_loss=per_example_loss)
-
- # Now we construct the copy model.
- inp = [tf.placeholder(tf.int32, shape=[None]) for _ in range(8)]
- out = [tf.placeholder(tf.int32, shape=[None]) for _ in range(8)]
- weights = [tf.ones_like(inp[0], dtype=tf.float32) for _ in range(8)]
- with tf.variable_scope("root"):
- _, losses1 = SampleGRUSeq2Seq(inp, out, weights, per_example_loss=False)
- # Now check that we did not accidentally set reuse.
- self.assertEqual(False, tf.get_variable_scope().reuse)
- # Construct one more model with per-example loss.
- tf.get_variable_scope().reuse_variables()
- _, losses2 = SampleGRUSeq2Seq(inp, out, weights, per_example_loss=True)
- # First loss is scalar, the second one is a 1-dimensinal tensor.
- self.assertEqual([], losses1[0].get_shape().as_list())
- self.assertEqual([None], losses2[0].get_shape().as_list())
-
- def testModelWithBuckets(self):
- """Larger tests that does full sequence-to-sequence model training."""
- # We learn to copy 10 symbols in 2 buckets: length 4 and length 8.
- classes = 10
- buckets = [(4, 4), (8, 8)]
- perplexities = [[], []] # Results for each bucket.
- tf.set_random_seed(111)
- random.seed(111)
- np.random.seed(111)
-
- with self.test_session() as sess:
- # We use sampled softmax so we keep output projection separate.
- w = tf.get_variable("proj_w", [24, classes])
- w_t = tf.transpose(w)
- b = tf.get_variable("proj_b", [classes])
- # Here comes a sample Seq2Seq model using GRU cells.
- def SampleGRUSeq2Seq(enc_inp, dec_inp, weights):
- """Example sequence-to-sequence model that uses GRU cells."""
- def GRUSeq2Seq(enc_inp, dec_inp):
- cell = tf.nn.rnn_cell.MultiRNNCell([tf.nn.rnn_cell.GRUCell(24)] * 2,
- state_is_tuple=True)
- return tf.nn.seq2seq.embedding_attention_seq2seq(
- enc_inp, dec_inp, cell, num_encoder_symbols=classes,
- num_decoder_symbols=classes, embedding_size=24,
- output_projection=(w, b))
- targets = [dec_inp[i+1] for i in range(len(dec_inp) - 1)] + [0]
- def SampledLoss(labels, inputs):
- labels = tf.reshape(labels, [-1, 1])
- return tf.nn.sampled_softmax_loss(w_t, b, inputs, labels, 8, classes)
- return tf.nn.seq2seq.model_with_buckets(
- enc_inp, dec_inp, targets, weights, buckets, GRUSeq2Seq,
- softmax_loss_function=SampledLoss)
-
- # Now we construct the copy model.
- batch_size = 8
- inp = [tf.placeholder(tf.int32, shape=[None]) for _ in range(8)]
- out = [tf.placeholder(tf.int32, shape=[None]) for _ in range(8)]
- weights = [tf.ones_like(inp[0], dtype=tf.float32) for _ in range(8)]
- with tf.variable_scope("root"):
- _, losses = SampleGRUSeq2Seq(inp, out, weights)
- updates = []
- params = tf.global_variables()
- optimizer = tf.train.AdamOptimizer(0.03, epsilon=1e-5)
- for i in range(len(buckets)):
- full_grads = tf.gradients(losses[i], params)
- grads, _ = tf.clip_by_global_norm(full_grads, 30.0)
- update = optimizer.apply_gradients(zip(grads, params))
- updates.append(update)
- sess.run([tf.global_variables_initializer()])
- steps = 6
- for _ in range(steps):
- bucket = random.choice(np.arange(len(buckets)))
- length = buckets[bucket][0]
- i = [np.array([np.random.randint(9) + 1 for _ in range(batch_size)],
- dtype=np.int32) for _ in range(length)]
- # 0 is our "GO" symbol here.
- o = [np.array([0] * batch_size, dtype=np.int32)] + i
- feed = {}
- for i1, i2, o1, o2 in zip(inp[:length], i[:length],
- out[:length], o[:length]):
- feed[i1.name] = i2
- feed[o1.name] = o2
- if length < 8: # For the 4-bucket, we need the 5th as target.
- feed[out[length].name] = o[length]
- res = sess.run([updates[bucket], losses[bucket]], feed)
- perplexities[bucket].append(math.exp(float(res[1])))
- for bucket in range(len(buckets)):
- if len(perplexities[bucket]) > 1: # Assert that perplexity went down.
- self.assertLess(perplexities[bucket][-1], perplexities[bucket][0])
-
- def testModelWithBooleanFeedPrevious(self):
- """Test the model behavior when feed_previous is True.
-
- For example, the following two cases have the same effect:
- - Train `embedding_rnn_seq2seq` with `feed_previous=True`, which contains
- a `embedding_rnn_decoder` with `feed_previous=True` and
- `update_embedding_for_previous=True`. The decoder is fed with "<Go>"
- and outputs "A, B, C".
- - Train `embedding_rnn_seq2seq` with `feed_previous=False`. The decoder
- is fed with "<Go>, A, B".
- """
- num_encoder_symbols = 3
- num_decoder_symbols = 5
- batch_size = 2
- num_enc_timesteps = 2
- num_dec_timesteps = 3
-
- def TestModel(seq2seq):
- with self.test_session(graph=tf.Graph()) as sess:
- tf.set_random_seed(111)
- random.seed(111)
- np.random.seed(111)
-
- enc_inp = [tf.constant(i + 1, tf.int32, shape=[batch_size])
- for i in range(num_enc_timesteps)]
- dec_inp_fp_true = [tf.constant(i, tf.int32, shape=[batch_size])
- for i in range(num_dec_timesteps)]
- dec_inp_holder_fp_false = [tf.placeholder(tf.int32, shape=[batch_size])
- for _ in range(num_dec_timesteps)]
- targets = [tf.constant(i + 1, tf.int32, shape=[batch_size])
- for i in range(num_dec_timesteps)]
- weights = [tf.constant(1.0, shape=[batch_size])
- for i in range(num_dec_timesteps)]
-
- def ForwardBackward(enc_inp, dec_inp, feed_previous):
- scope_name = "fp_{}".format(feed_previous)
- with tf.variable_scope(scope_name):
- dec_op, _ = seq2seq(enc_inp, dec_inp, feed_previous=feed_previous)
- net_variables = tf.get_collection(tf.GraphKeys.GLOBAL_VARIABLES,
- scope_name)
- optimizer = tf.train.AdamOptimizer(0.03, epsilon=1e-5)
- update_op = optimizer.minimize(
- tf.nn.seq2seq.sequence_loss(dec_op, targets, weights),
- var_list=net_variables)
- return dec_op, update_op, net_variables
-
- dec_op_fp_true, update_fp_true, variables_fp_true = ForwardBackward(
- enc_inp, dec_inp_fp_true, feed_previous=True)
- _, update_fp_false, variables_fp_false = ForwardBackward(
- enc_inp, dec_inp_holder_fp_false, feed_previous=False)
-
- sess.run(tf.global_variables_initializer())
-
- # We only check consistencies between the variables existing in both
- # the models with True and False feed_previous. Variables created by
- # the loop_function in the model with True feed_previous are ignored.
- v_false_name_dict = {v.name.split("/", 1)[-1]: v
- for v in variables_fp_false}
- matched_variables = [(v, v_false_name_dict[v.name.split("/", 1)[-1]])
- for v in variables_fp_true]
- for v_true, v_false in matched_variables:
- sess.run(tf.assign(v_false, v_true))
-
- # Take the symbols generated by the decoder with feed_previous=True as
- # the true input symbols for the decoder with feed_previous=False.
- dec_fp_true = sess.run(dec_op_fp_true)
- output_symbols_fp_true = np.argmax(dec_fp_true, axis=2)
- dec_inp_fp_false = np.vstack((dec_inp_fp_true[0].eval(),
- output_symbols_fp_true[:-1]))
- sess.run(update_fp_true)
- sess.run(update_fp_false,
- {holder: inp for holder, inp in zip(dec_inp_holder_fp_false,
- dec_inp_fp_false)})
-
- for v_true, v_false in matched_variables:
- self.assertAllClose(v_true.eval(), v_false.eval())
-
- def EmbeddingRNNSeq2SeqF(enc_inp, dec_inp, feed_previous):
- cell = tf.nn.rnn_cell.BasicLSTMCell(2, state_is_tuple=True)
- return tf.nn.seq2seq.embedding_rnn_seq2seq(
- enc_inp, dec_inp, cell, num_encoder_symbols,
- num_decoder_symbols, embedding_size=2, feed_previous=feed_previous)
-
- def EmbeddingRNNSeq2SeqNoTupleF(enc_inp, dec_inp, feed_previous):
- cell = tf.nn.rnn_cell.BasicLSTMCell(2, state_is_tuple=False)
- return tf.nn.seq2seq.embedding_rnn_seq2seq(
- enc_inp, dec_inp, cell, num_encoder_symbols,
- num_decoder_symbols, embedding_size=2, feed_previous=feed_previous)
-
- def EmbeddingTiedRNNSeq2Seq(enc_inp, dec_inp, feed_previous):
- cell = tf.nn.rnn_cell.BasicLSTMCell(2, state_is_tuple=True)
- return tf.nn.seq2seq.embedding_tied_rnn_seq2seq(
- enc_inp, dec_inp, cell, num_decoder_symbols, embedding_size=2,
- feed_previous=feed_previous)
-
- def EmbeddingTiedRNNSeq2SeqNoTuple(enc_inp, dec_inp, feed_previous):
- cell = tf.nn.rnn_cell.BasicLSTMCell(2, state_is_tuple=False)
- return tf.nn.seq2seq.embedding_tied_rnn_seq2seq(
- enc_inp, dec_inp, cell, num_decoder_symbols, embedding_size=2,
- feed_previous=feed_previous)
-
- def EmbeddingAttentionSeq2Seq(enc_inp, dec_inp, feed_previous):
- cell = tf.nn.rnn_cell.BasicLSTMCell(2, state_is_tuple=True)
- return tf.nn.seq2seq.embedding_attention_seq2seq(
- enc_inp, dec_inp, cell, num_encoder_symbols,
- num_decoder_symbols, embedding_size=2, feed_previous=feed_previous)
-
- def EmbeddingAttentionSeq2SeqNoTuple(enc_inp, dec_inp, feed_previous):
- cell = tf.nn.rnn_cell.BasicLSTMCell(2, state_is_tuple=False)
- return tf.nn.seq2seq.embedding_attention_seq2seq(
- enc_inp, dec_inp, cell, num_encoder_symbols,
- num_decoder_symbols, embedding_size=2, feed_previous=feed_previous)
-
- for model in (EmbeddingRNNSeq2SeqF, EmbeddingRNNSeq2SeqNoTupleF,
- EmbeddingTiedRNNSeq2Seq, EmbeddingTiedRNNSeq2SeqNoTuple,
- EmbeddingAttentionSeq2Seq, EmbeddingAttentionSeq2SeqNoTuple):
- TestModel(model)
-
-
-if __name__ == "__main__":
- tf.test.main()