You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

test_seq2seq_with_attention.py 3.6 kB

4 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. import os
  4. import unittest
  5. os.environ['TF_CPP_MIN_LOG_LEVEL'] = '3'
  6. import numpy as np
  7. import tensorflow as tf
  8. import tensorlayer as tl
  9. from tqdm import tqdm
  10. from sklearn.utils import shuffle
  11. from tensorlayer.models.seq2seq_with_attention import Seq2seqLuongAttention
  12. from tests.utils import CustomTestCase
  13. from tensorlayer.cost import cross_entropy_seq
  14. class Model_SEQ2SEQ_WITH_ATTENTION_Test(CustomTestCase):
  15. @classmethod
  16. def setUpClass(cls):
  17. cls.batch_size = 16
  18. cls.vocab_size = 200
  19. cls.embedding_size = 32
  20. cls.dec_seq_length = 5
  21. cls.pure_time = np.linspace(-1, 1, 21)
  22. cls.pure_signal = 100 * np.sin(cls.pure_time)
  23. cls.dataset = np.zeros((100, 21))
  24. for i in range(100):
  25. noise = 100 + 1 * np.random.normal(0, 1, cls.pure_signal.shape)
  26. cls.dataset[i] = cls.pure_signal + noise
  27. cls.dataset = cls.dataset.astype(int)
  28. np.random.shuffle(cls.dataset)
  29. cls.trainX = cls.dataset[:80, :15]
  30. cls.trainY = cls.dataset[:80, 15:]
  31. cls.testX = cls.dataset[80:, :15]
  32. cls.testY = cls.dataset[80:, 15:]
  33. cls.trainY[:, 0] = 0 # start_token == 0
  34. cls.testY[:, 0] = 0 # start_token == 0
  35. # Parameters
  36. cls.src_len = len(cls.trainX)
  37. cls.tgt_len = len(cls.trainY)
  38. assert cls.src_len == cls.tgt_len
  39. cls.num_epochs = 500
  40. cls.n_step = cls.src_len // cls.batch_size
  41. @classmethod
  42. def tearDownClass(cls):
  43. pass
  44. def test_basic_simpleSeq2Seq(self):
  45. model_ = Seq2seqLuongAttention(
  46. hidden_size=128, cell=tf.keras.layers.SimpleRNNCell,
  47. embedding_layer=tl.layers.Embedding(vocabulary_size=self.vocab_size,
  48. embedding_size=self.embedding_size), method='dot'
  49. )
  50. optimizer = tf.optimizers.Adam(learning_rate=0.001)
  51. for epoch in range(self.num_epochs):
  52. model_.train()
  53. trainX, trainY = shuffle(self.trainX, self.trainY)
  54. total_loss, n_iter = 0, 0
  55. for X, Y in tqdm(tl.iterate.minibatches(inputs=trainX, targets=trainY, batch_size=self.batch_size,
  56. shuffle=False), total=self.n_step,
  57. desc='Epoch[{}/{}]'.format(epoch + 1, self.num_epochs), leave=False):
  58. dec_seq = Y[:, :-1]
  59. target_seq = Y[:, 1:]
  60. with tf.GradientTape() as tape:
  61. ## compute outputs
  62. output = model_(inputs=[X, dec_seq])
  63. # print(output)
  64. output = tf.reshape(output, [-1, self.vocab_size])
  65. loss = cross_entropy_seq(logits=output, target_seqs=target_seq)
  66. grad = tape.gradient(loss, model_.trainable_weights)
  67. optimizer.apply_gradients(zip(grad, model_.trainable_weights))
  68. total_loss += loss
  69. n_iter += 1
  70. model_.eval()
  71. test_sample = self.testX[:5, :].tolist() # Can't capture the sequence.
  72. top_n = 1
  73. for i in range(top_n):
  74. prediction = model_([test_sample], seq_length=self.dec_seq_length, sos=0)
  75. print("Prediction: >>>>> ", prediction, "\n Target: >>>>> ", self.testY[:5, 1:], "\n\n")
  76. # printing average loss after every epoch
  77. print('Epoch [{}/{}]: loss {:.4f}'.format(epoch + 1, self.num_epochs, total_loss / n_iter))
  78. if __name__ == '__main__':
  79. unittest.main()

TensorLayer3.0 是一款兼容多种深度学习框架为计算后端的深度学习库。计划兼容TensorFlow, Pytorch, MindSpore, Paddle.