TV Script Generation

In this project, you'll generate your own Simpsons TV scripts using RNNs. You'll be using part of the Simpsons dataset of scripts from 27 seasons. The Neural Network you'll build will generate a new TV script for a scene at Moe's Tavern.

Get the Data

The data is already provided for you. You'll be using a subset of the original dataset. It consists of only the scenes in Moe's Tavern. This doesn't include other versions of the tavern, like "Moe's Cavern", "Flaming Moe's", "Uncle Moe's Family Feed-Bag", etc..


In [1]:
"""
DON'T MODIFY ANYTHING IN THIS CELL
"""
import helper

data_dir = './data/simpsons/moes_tavern_lines.txt'
text = helper.load_data(data_dir)
# Ignore notice, since we don't use it for analysing the data
text = text[81:]

Explore the Data

Play around with view_sentence_range to view different parts of the data.


In [2]:
view_sentence_range = (0, 10)

"""
DON'T MODIFY ANYTHING IN THIS CELL
"""
import numpy as np

print('Dataset Stats')
print('Roughly the number of unique words: {}'.format(len({word: None for word in text.split()})))
scenes = text.split('\n\n')
print('Number of scenes: {}'.format(len(scenes)))
sentence_count_scene = [scene.count('\n') for scene in scenes]
print('Average number of sentences in each scene: {}'.format(np.average(sentence_count_scene)))

sentences = [sentence for scene in scenes for sentence in scene.split('\n')]
print('Number of lines: {}'.format(len(sentences)))
word_count_sentence = [len(sentence.split()) for sentence in sentences]
print('Average number of words in each line: {}'.format(np.average(word_count_sentence)))

print()
print('The sentences {} to {}:'.format(*view_sentence_range))
print('\n'.join(text.split('\n')[view_sentence_range[0]:view_sentence_range[1]]))


Dataset Stats
Roughly the number of unique words: 11492
Number of scenes: 262
Average number of sentences in each scene: 15.248091603053435
Number of lines: 4257
Average number of words in each line: 11.50434578341555

The sentences 0 to 10:
Moe_Szyslak: (INTO PHONE) Moe's Tavern. Where the elite meet to drink.
Bart_Simpson: Eh, yeah, hello, is Mike there? Last name, Rotch.
Moe_Szyslak: (INTO PHONE) Hold on, I'll check. (TO BARFLIES) Mike Rotch. Mike Rotch. Hey, has anybody seen Mike Rotch, lately?
Moe_Szyslak: (INTO PHONE) Listen you little puke. One of these days I'm gonna catch you, and I'm gonna carve my name on your back with an ice pick.
Moe_Szyslak: What's the matter Homer? You're not your normal effervescent self.
Homer_Simpson: I got my problems, Moe. Give me another one.
Moe_Szyslak: Homer, hey, you should not drink to forget your problems.
Barney_Gumble: Yeah, you should only drink to enhance your social skills.


Implement Preprocessing Functions

The first thing to do to any dataset is preprocessing. Implement the following preprocessing functions below:

  • Lookup Table
  • Tokenize Punctuation

Lookup Table

To create a word embedding, you first need to transform the words to ids. In this function, create two dictionaries:

  • Dictionary to go from the words to an id, we'll call vocab_to_int
  • Dictionary to go from the id to word, we'll call int_to_vocab

Return these dictionaries in the following tuple (vocab_to_int, int_to_vocab)


In [3]:
import numpy as np
import problem_unittests as tests

def create_lookup_tables(text):
    """
    Create lookup tables for vocabulary
    :param text: The text of tv scripts split into words
    :return: A tuple of dicts (vocab_to_int, int_to_vocab)
    """
    
    unique_words = set(text)
    
    vocab_to_int = { word : idx for idx, word in enumerate(unique_words) }
    int_to_vocab = { vocab_to_int[word] : word for word in unique_words }
    
    return vocab_to_int, int_to_vocab


"""
DON'T MODIFY ANYTHING IN THIS CELL THAT IS BELOW THIS LINE
"""
tests.test_create_lookup_tables(create_lookup_tables)


Tests Passed

Tokenize Punctuation

We'll be splitting the script into a word array using spaces as delimiters. However, punctuations like periods and exclamation marks make it hard for the neural network to distinguish between the word "bye" and "bye!".

Implement the function token_lookup to return a dict that will be used to tokenize symbols like "!" into "||Exclamation_Mark||". Create a dictionary for the following symbols where the symbol is the key and value is the token:

  • Period ( . )
  • Comma ( , )
  • Quotation Mark ( " )
  • Semicolon ( ; )
  • Exclamation mark ( ! )
  • Question mark ( ? )
  • Left Parentheses ( ( )
  • Right Parentheses ( ) )
  • Dash ( -- )
  • Return ( \n )

This dictionary will be used to token the symbols and add the delimiter (space) around it. This separates the symbols as it's own word, making it easier for the neural network to predict on the next word. Make sure you don't use a token that could be confused as a word. Instead of using the token "dash", try using something like "||dash||".


In [4]:
def token_lookup():
    """
    Generate a dict to turn punctuation into a token.
    :return: Tokenize dictionary where the key is the punctuation and the value is the token
    """
    
    punctuation_tokens = \
    {
        '.' : '<<period>>',
        ',' : '<<comma>>',
        '"' : '<<quote>>',
        ';' : '<<semi>>',
        '!' : '<<exclam>>',
        '?' : '<<ques>>',
        '(' : '<<left_par>>',
        ')' : '<<rght_par>>',
        '--' : '<<dash>>',
        '\n' : '<<ret>>'
    }
    
    return punctuation_tokens

"""
DON'T MODIFY ANYTHING IN THIS CELL THAT IS BELOW THIS LINE
"""
tests.test_tokenize(token_lookup)


Tests Passed

Preprocess all the data and save it

Running the code cell below will preprocess all the data and save it to file.


In [5]:
"""
DON'T MODIFY ANYTHING IN THIS CELL
"""
# Preprocess Training, Validation, and Testing Data
helper.preprocess_and_save_data(data_dir, token_lookup, create_lookup_tables)

Check Point

This is your first checkpoint. If you ever decide to come back to this notebook or have to restart the notebook, you can start from here. The preprocessed data has been saved to disk.


In [6]:
"""
DON'T MODIFY ANYTHING IN THIS CELL
"""
import helper
import numpy as np
import problem_unittests as tests

int_text, vocab_to_int, int_to_vocab, token_dict = helper.load_preprocess()

Build the Neural Network

You'll build the components necessary to build a RNN by implementing the following functions below:

  • get_inputs
  • get_init_cell
  • get_embed
  • build_rnn
  • build_nn
  • get_batches

Check the Version of TensorFlow and Access to GPU


In [7]:
"""
DON'T MODIFY ANYTHING IN THIS CELL
"""
from distutils.version import LooseVersion
import warnings
import tensorflow as tf

# Check TensorFlow Version
assert LooseVersion(tf.__version__) >= LooseVersion('1.0'), 'Please use TensorFlow version 1.0 or newer'
print('TensorFlow Version: {}'.format(tf.__version__))

# Check for a GPU
if not tf.test.gpu_device_name():
    warnings.warn('No GPU found. Please use a GPU to train your neural network.')
else:
    print('Default GPU Device: {}'.format(tf.test.gpu_device_name()))


TensorFlow Version: 1.1.0
Default GPU Device: /gpu:0

Input

Implement the get_inputs() function to create TF Placeholders for the Neural Network. It should create the following placeholders:

  • Input text placeholder named "input" using the TF Placeholder name parameter.
  • Targets placeholder
  • Learning Rate placeholder

Return the placeholders in the following tuple (Input, Targets, LearningRate)


In [8]:
def get_inputs():
    """
    Create TF Placeholders for input, targets, and learning rate.
    :return: Tuple (input, targets, learning rate)
    """
    inputs = tf.placeholder(tf.int32, [None, None], name= 'input')
    targets = tf.placeholder(tf.int32, [None, None], name = 'targets')
    learning_rate = tf.placeholder(tf.float32, name = 'learning_rate')
    return inputs, targets, learning_rate


"""
DON'T MODIFY ANYTHING IN THIS CELL THAT IS BELOW THIS LINE
"""
tests.test_get_inputs(get_inputs)


Tests Passed

Build RNN Cell and Initialize

Stack one or more BasicLSTMCells in a MultiRNNCell.

  • The Rnn size should be set using rnn_size
  • Initalize Cell State using the MultiRNNCell's zero_state() function
    • Apply the name "initial_state" to the initial state using tf.identity()

Return the cell and initial state in the following tuple (Cell, InitialState)


In [9]:
def get_init_cell(batch_size, rnn_size):
    """
    Create an RNN Cell and initialize it.
    :param batch_size: Size of batches
    :param rnn_size: Size of RNNs
    :return: Tuple (cell, initialize state)
    """
    
    lstm = tf.contrib.rnn.BasicLSTMCell(rnn_size)
    # lstm = tf.contrib.rnn.DropoutWrapper(lstm, output_keep_prob=0.75)
    lstm = tf.contrib.rnn.MultiRNNCell([lstm] * 1)
    
    lstm_initial_state = lstm.zero_state(batch_size, tf.int32)
    lstm_initial_state = tf.identity(lstm_initial_state, name = 'initial_state')
    
    return lstm, lstm_initial_state


"""
DON'T MODIFY ANYTHING IN THIS CELL THAT IS BELOW THIS LINE
"""
tests.test_get_init_cell(get_init_cell)


Tests Passed

Word Embedding

Apply embedding to input_data using TensorFlow. Return the embedded sequence.


In [10]:
def get_embed(input_data, vocab_size, embed_dim):
    """
    Create embedding for <input_data>.
    :param input_data: TF placeholder for text input.
    :param vocab_size: Number of words in vocabulary.
    :param embed_dim: Number of embedding dimensions
    :return: Embedded input.
    """
    
    word_embeddings = tf.get_variable('embeddings', [vocab_size, embed_dim])
    embedded_words = tf.nn.embedding_lookup(word_embeddings, input_data)
    
    return embedded_words


"""
DON'T MODIFY ANYTHING IN THIS CELL THAT IS BELOW THIS LINE
"""
tests.test_get_embed(get_embed)


Tests Passed

Build RNN

You created a RNN Cell in the get_init_cell() function. Time to use the cell to create a RNN.

Return the outputs and final_state state in the following tuple (Outputs, FinalState)


In [11]:
def build_rnn(cell, inputs):
    """
    Create a RNN using a RNN Cell
    :param cell: RNN Cell
    :param inputs: Input text data
    :return: Tuple (Outputs, Final State)
    """
    
    outputs, final_state = tf.nn.dynamic_rnn(cell, inputs, dtype = tf.float32)
    
    final_state = tf.identity(final_state, name = 'final_state')
    
    return outputs, final_state


"""
DON'T MODIFY ANYTHING IN THIS CELL THAT IS BELOW THIS LINE
"""
tests.test_build_rnn(build_rnn)


Tests Passed

Build the Neural Network

Apply the functions you implemented above to:

  • Apply embedding to input_data using your get_embed(input_data, vocab_size, embed_dim) function.
  • Build RNN using cell and your build_rnn(cell, inputs) function.
  • Apply a fully connected layer with a linear activation and vocab_size as the number of outputs.

Return the logits and final state in the following tuple (Logits, FinalState)


In [12]:
def build_nn(cell, rnn_size, input_data, vocab_size, embed_dim):
    """
    Build part of the neural network
    :param cell: RNN cell
    :param rnn_size: Size of rnns
    :param input_data: Input data
    :param vocab_size: Vocabulary size
    :param embed_dim: Number of embedding dimensions
    :return: Tuple (Logits, FinalState)
    """
    
    embeddings = get_embed(input_data, vocab_size, rnn_size)
    output, final_state = build_rnn(cell, embeddings)
    output = tf.contrib.layers.fully_connected(output, vocab_size, activation_fn = None)
    
    return output, final_state


"""
DON'T MODIFY ANYTHING IN THIS CELL THAT IS BELOW THIS LINE
"""
tests.test_build_nn(build_nn)


Tests Passed

Batches

Implement get_batches to create batches of input and targets using int_text. The batches should be a Numpy array with the shape (number of batches, 2, batch size, sequence length). Each batch contains two elements:

  • The first element is a single batch of input with the shape [batch size, sequence length]
  • The second element is a single batch of targets with the shape [batch size, sequence length]

If you can't fill the last batch with enough data, drop the last batch.

For exmple, get_batches([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20], 3, 2) would return a Numpy array of the following:

[
  # First Batch
  [
    # Batch of Input
    [[ 1  2], [ 7  8], [13 14]]
    # Batch of targets
    [[ 2  3], [ 8  9], [14 15]]
  ]

  # Second Batch
  [
    # Batch of Input
    [[ 3  4], [ 9 10], [15 16]]
    # Batch of targets
    [[ 4  5], [10 11], [16 17]]
  ]

  # Third Batch
  [
    # Batch of Input
    [[ 5  6], [11 12], [17 18]]
    # Batch of targets
    [[ 6  7], [12 13], [18  1]]
  ]
]

Notice that the last target value in the last batch is the first input value of the first batch. In this case, 1. This is a common technique used when creating sequence batches, although it is rather unintuitive.


In [13]:
noop_func = lambda x : None

def get_batches(int_text, batch_size, seq_length, func = noop_func):
    """
    Return batches of input and target
    :param int_text: Text with the words replaced by their ids
    :param batch_size: The size of batch
    :param seq_length: The length of sequence
    :return: Batches as a Numpy array
    """
    
    import math
    
    block_size = batch_size * seq_length; func(block_size)
    number_of_batches = math.floor(len(int_text) / block_size); func(number_of_batches)
    qualified_length = number_of_batches * block_size
    
    int_input = np.array(int_text[:qualified_length]); func(int_input)
    int_target = np.concatenate((int_input[1:qualified_length], int_input[0:1])); func(int_target)
    
    int_input = np.reshape(int_input, [batch_size, number_of_batches, seq_length]); func(int_input)
    int_target = np.reshape(int_target, [batch_size, number_of_batches, seq_length]); func(int_target)
    
    int_input = np.transpose(int_input, axes = [1, 0, 2]); func(int_input)
    int_target = np.transpose(int_target, axes = [1, 0, 2]); func(int_target)
        
    return np.array(list(zip(int_input, int_target)))

# get_batches([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 ], 2, 2, print)
# get_batches([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20], 3, 2, print)

"""
DON'T MODIFY ANYTHING IN THIS CELL THAT IS BELOW THIS LINE
"""
tests.test_get_batches(get_batches)


Tests Passed

Neural Network Training

Hyperparameters

Tune the following parameters:

  • Set num_epochs to the number of epochs.
  • Set batch_size to the batch size.
  • Set rnn_size to the size of the RNNs.
  • Set embed_dim to the size of the embedding.
  • Set seq_length to the length of sequence.
  • Set learning_rate to the learning rate.
  • Set show_every_n_batches to the number of batches the neural network should print progress.

In [37]:
# Number of Epochs
num_epochs = 512
# Batch Size
batch_size = 256
# RNN Size
rnn_size = 256
# Embedding Dimension Size
embed_dim = 128
# Sequence Length
seq_length = 8
# Learning Rate
learning_rate = .001
# Show stats for every n number of batches
show_every_n_batches = 32

"""
DON'T MODIFY ANYTHING IN THIS CELL THAT IS BELOW THIS LINE
"""
save_dir = './save'

Build the Graph

Build the graph using the neural network you implemented.


In [38]:
"""
DON'T MODIFY ANYTHING IN THIS CELL
"""
from tensorflow.contrib import seq2seq

train_graph = tf.Graph()
with train_graph.as_default():
    vocab_size = len(int_to_vocab)
    input_text, targets, lr = get_inputs()
    input_data_shape = tf.shape(input_text)
    cell, initial_state = get_init_cell(input_data_shape[0], rnn_size)
    logits, final_state = build_nn(cell, rnn_size, input_text, vocab_size, embed_dim)

    # Probabilities for generating words
    probs = tf.nn.softmax(logits, name='probs')

    # Loss function
    cost = seq2seq.sequence_loss(
        logits,
        targets,
        tf.ones([input_data_shape[0], input_data_shape[1]]))

    # Optimizer
    optimizer = tf.train.AdamOptimizer(lr)

    # Gradient Clipping
    gradients = optimizer.compute_gradients(cost)
    capped_gradients = [(tf.clip_by_value(grad, -1., 1.), var) for grad, var in gradients if grad is not None]
    train_op = optimizer.apply_gradients(capped_gradients)

Train

Train the neural network on the preprocessed data. If you have a hard time getting a good loss, check the forums to see if anyone is having the same problem.


In [39]:
"""
DON'T MODIFY ANYTHING IN THIS CELL
"""
batches = get_batches(int_text, batch_size, seq_length)

with tf.Session(graph=train_graph) as sess:
    sess.run(tf.global_variables_initializer())

    for epoch_i in range(num_epochs):
        state = sess.run(initial_state, {input_text: batches[0][0]})

        for batch_i, (x, y) in enumerate(batches):
            feed = {
                input_text: x,
                targets: y,
                initial_state: state,
                lr: learning_rate}
            train_loss, state, _ = sess.run([cost, final_state, train_op], feed)

            # Show every <show_every_n_batches> batches
            if (epoch_i * len(batches) + batch_i) % show_every_n_batches == 0:
                print('Epoch {:>3} Batch {:>4}/{}   train_loss = {:.3f}'.format(
                    epoch_i,
                    batch_i,
                    len(batches),
                    train_loss))

    # Save Model
    saver = tf.train.Saver()
    saver.save(sess, save_dir)
    print('Model Trained and Saved')


Epoch   0 Batch    0/33   train_loss = 8.822
Epoch   0 Batch   32/33   train_loss = 6.817
Epoch   1 Batch   31/33   train_loss = 6.350
Epoch   2 Batch   30/33   train_loss = 5.917
Epoch   3 Batch   29/33   train_loss = 5.919
Epoch   4 Batch   28/33   train_loss = 5.686
Epoch   5 Batch   27/33   train_loss = 5.628
Epoch   6 Batch   26/33   train_loss = 5.545
Epoch   7 Batch   25/33   train_loss = 5.457
Epoch   8 Batch   24/33   train_loss = 5.378
Epoch   9 Batch   23/33   train_loss = 5.152
Epoch  10 Batch   22/33   train_loss = 5.169
Epoch  11 Batch   21/33   train_loss = 5.185
Epoch  12 Batch   20/33   train_loss = 4.947
Epoch  13 Batch   19/33   train_loss = 4.959
Epoch  14 Batch   18/33   train_loss = 4.754
Epoch  15 Batch   17/33   train_loss = 4.878
Epoch  16 Batch   16/33   train_loss = 4.794
Epoch  17 Batch   15/33   train_loss = 4.800
Epoch  18 Batch   14/33   train_loss = 4.715
Epoch  19 Batch   13/33   train_loss = 4.621
Epoch  20 Batch   12/33   train_loss = 4.682
Epoch  21 Batch   11/33   train_loss = 4.650
Epoch  22 Batch   10/33   train_loss = 4.521
Epoch  23 Batch    9/33   train_loss = 4.458
Epoch  24 Batch    8/33   train_loss = 4.443
Epoch  25 Batch    7/33   train_loss = 4.323
Epoch  26 Batch    6/33   train_loss = 4.202
Epoch  27 Batch    5/33   train_loss = 4.271
Epoch  28 Batch    4/33   train_loss = 4.254
Epoch  29 Batch    3/33   train_loss = 4.115
Epoch  30 Batch    2/33   train_loss = 4.169
Epoch  31 Batch    1/33   train_loss = 4.107
Epoch  32 Batch    0/33   train_loss = 4.054
Epoch  32 Batch   32/33   train_loss = 4.070
Epoch  33 Batch   31/33   train_loss = 4.077
Epoch  34 Batch   30/33   train_loss = 3.935
Epoch  35 Batch   29/33   train_loss = 4.000
Epoch  36 Batch   28/33   train_loss = 3.946
Epoch  37 Batch   27/33   train_loss = 3.952
Epoch  38 Batch   26/33   train_loss = 3.874
Epoch  39 Batch   25/33   train_loss = 3.848
Epoch  40 Batch   24/33   train_loss = 3.785
Epoch  41 Batch   23/33   train_loss = 3.742
Epoch  42 Batch   22/33   train_loss = 3.741
Epoch  43 Batch   21/33   train_loss = 3.767
Epoch  44 Batch   20/33   train_loss = 3.603
Epoch  45 Batch   19/33   train_loss = 3.622
Epoch  46 Batch   18/33   train_loss = 3.564
Epoch  47 Batch   17/33   train_loss = 3.597
Epoch  48 Batch   16/33   train_loss = 3.542
Epoch  49 Batch   15/33   train_loss = 3.551
Epoch  50 Batch   14/33   train_loss = 3.523
Epoch  51 Batch   13/33   train_loss = 3.460
Epoch  52 Batch   12/33   train_loss = 3.459
Epoch  53 Batch   11/33   train_loss = 3.442
Epoch  54 Batch   10/33   train_loss = 3.332
Epoch  55 Batch    9/33   train_loss = 3.322
Epoch  56 Batch    8/33   train_loss = 3.309
Epoch  57 Batch    7/33   train_loss = 3.177
Epoch  58 Batch    6/33   train_loss = 3.189
Epoch  59 Batch    5/33   train_loss = 3.197
Epoch  60 Batch    4/33   train_loss = 3.203
Epoch  61 Batch    3/33   train_loss = 3.096
Epoch  62 Batch    2/33   train_loss = 3.095
Epoch  63 Batch    1/33   train_loss = 3.123
Epoch  64 Batch    0/33   train_loss = 3.057
Epoch  64 Batch   32/33   train_loss = 2.993
Epoch  65 Batch   31/33   train_loss = 2.978
Epoch  66 Batch   30/33   train_loss = 2.967
Epoch  67 Batch   29/33   train_loss = 2.971
Epoch  68 Batch   28/33   train_loss = 2.988
Epoch  69 Batch   27/33   train_loss = 3.027
Epoch  70 Batch   26/33   train_loss = 2.901
Epoch  71 Batch   25/33   train_loss = 2.884
Epoch  72 Batch   24/33   train_loss = 2.845
Epoch  73 Batch   23/33   train_loss = 2.826
Epoch  74 Batch   22/33   train_loss = 2.826
Epoch  75 Batch   21/33   train_loss = 2.806
Epoch  76 Batch   20/33   train_loss = 2.776
Epoch  77 Batch   19/33   train_loss = 2.675
Epoch  78 Batch   18/33   train_loss = 2.782
Epoch  79 Batch   17/33   train_loss = 2.715
Epoch  80 Batch   16/33   train_loss = 2.700
Epoch  81 Batch   15/33   train_loss = 2.656
Epoch  82 Batch   14/33   train_loss = 2.651
Epoch  83 Batch   13/33   train_loss = 2.622
Epoch  84 Batch   12/33   train_loss = 2.572
Epoch  85 Batch   11/33   train_loss = 2.545
Epoch  86 Batch   10/33   train_loss = 2.495
Epoch  87 Batch    9/33   train_loss = 2.513
Epoch  88 Batch    8/33   train_loss = 2.521
Epoch  89 Batch    7/33   train_loss = 2.413
Epoch  90 Batch    6/33   train_loss = 2.469
Epoch  91 Batch    5/33   train_loss = 2.428
Epoch  92 Batch    4/33   train_loss = 2.477
Epoch  93 Batch    3/33   train_loss = 2.372
Epoch  94 Batch    2/33   train_loss = 2.341
Epoch  95 Batch    1/33   train_loss = 2.434
Epoch  96 Batch    0/33   train_loss = 2.365
Epoch  96 Batch   32/33   train_loss = 2.285
Epoch  97 Batch   31/33   train_loss = 2.233
Epoch  98 Batch   30/33   train_loss = 2.287
Epoch  99 Batch   29/33   train_loss = 2.260
Epoch 100 Batch   28/33   train_loss = 2.344
Epoch 101 Batch   27/33   train_loss = 2.350
Epoch 102 Batch   26/33   train_loss = 2.230
Epoch 103 Batch   25/33   train_loss = 2.241
Epoch 104 Batch   24/33   train_loss = 2.216
Epoch 105 Batch   23/33   train_loss = 2.189
Epoch 106 Batch   22/33   train_loss = 2.194
Epoch 107 Batch   21/33   train_loss = 2.142
Epoch 108 Batch   20/33   train_loss = 2.181
Epoch 109 Batch   19/33   train_loss = 2.016
Epoch 110 Batch   18/33   train_loss = 2.190
Epoch 111 Batch   17/33   train_loss = 2.120
Epoch 112 Batch   16/33   train_loss = 2.128
Epoch 113 Batch   15/33   train_loss = 2.047
Epoch 114 Batch   14/33   train_loss = 2.067
Epoch 115 Batch   13/33   train_loss = 2.053
Epoch 116 Batch   12/33   train_loss = 1.990
Epoch 117 Batch   11/33   train_loss = 1.987
Epoch 118 Batch   10/33   train_loss = 1.947
Epoch 119 Batch    9/33   train_loss = 1.985
Epoch 120 Batch    8/33   train_loss = 1.992
Epoch 121 Batch    7/33   train_loss = 1.914
Epoch 122 Batch    6/33   train_loss = 1.955
Epoch 123 Batch    5/33   train_loss = 1.902
Epoch 124 Batch    4/33   train_loss = 1.948
Epoch 125 Batch    3/33   train_loss = 1.891
Epoch 126 Batch    2/33   train_loss = 1.841
Epoch 127 Batch    1/33   train_loss = 1.966
Epoch 128 Batch    0/33   train_loss = 1.905
Epoch 128 Batch   32/33   train_loss = 1.810
Epoch 129 Batch   31/33   train_loss = 1.759
Epoch 130 Batch   30/33   train_loss = 1.813
Epoch 131 Batch   29/33   train_loss = 1.781
Epoch 132 Batch   28/33   train_loss = 1.892
Epoch 133 Batch   27/33   train_loss = 1.859
Epoch 134 Batch   26/33   train_loss = 1.737
Epoch 135 Batch   25/33   train_loss = 1.795
Epoch 136 Batch   24/33   train_loss = 1.765
Epoch 137 Batch   23/33   train_loss = 1.735
Epoch 138 Batch   22/33   train_loss = 1.759
Epoch 139 Batch   21/33   train_loss = 1.716
Epoch 140 Batch   20/33   train_loss = 1.778
Epoch 141 Batch   19/33   train_loss = 1.603
Epoch 142 Batch   18/33   train_loss = 1.801
Epoch 143 Batch   17/33   train_loss = 1.706
Epoch 144 Batch   16/33   train_loss = 1.734
Epoch 145 Batch   15/33   train_loss = 1.651
Epoch 146 Batch   14/33   train_loss = 1.672
Epoch 147 Batch   13/33   train_loss = 1.645
Epoch 148 Batch   12/33   train_loss = 1.570
Epoch 149 Batch   11/33   train_loss = 1.569
Epoch 150 Batch   10/33   train_loss = 1.554
Epoch 151 Batch    9/33   train_loss = 1.593
Epoch 152 Batch    8/33   train_loss = 1.595
Epoch 153 Batch    7/33   train_loss = 1.545
Epoch 154 Batch    6/33   train_loss = 1.584
Epoch 155 Batch    5/33   train_loss = 1.531
Epoch 156 Batch    4/33   train_loss = 1.563
Epoch 157 Batch    3/33   train_loss = 1.534
Epoch 158 Batch    2/33   train_loss = 1.448
Epoch 159 Batch    1/33   train_loss = 1.582
Epoch 160 Batch    0/33   train_loss = 1.527
Epoch 160 Batch   32/33   train_loss = 1.454
Epoch 161 Batch   31/33   train_loss = 1.373
Epoch 162 Batch   30/33   train_loss = 1.451
Epoch 163 Batch   29/33   train_loss = 1.404
Epoch 164 Batch   28/33   train_loss = 1.529
Epoch 165 Batch   27/33   train_loss = 1.504
Epoch 166 Batch   26/33   train_loss = 1.414
Epoch 167 Batch   25/33   train_loss = 1.438
Epoch 168 Batch   24/33   train_loss = 1.467
Epoch 169 Batch   23/33   train_loss = 1.391
Epoch 170 Batch   22/33   train_loss = 1.408
Epoch 171 Batch   21/33   train_loss = 1.368
Epoch 172 Batch   20/33   train_loss = 1.415
Epoch 173 Batch   19/33   train_loss = 1.274
Epoch 174 Batch   18/33   train_loss = 1.473
Epoch 175 Batch   17/33   train_loss = 1.375
Epoch 176 Batch   16/33   train_loss = 1.397
Epoch 177 Batch   15/33   train_loss = 1.342
Epoch 178 Batch   14/33   train_loss = 1.342
Epoch 179 Batch   13/33   train_loss = 1.345
Epoch 180 Batch   12/33   train_loss = 1.240
Epoch 181 Batch   11/33   train_loss = 1.249
Epoch 182 Batch   10/33   train_loss = 1.245
Epoch 183 Batch    9/33   train_loss = 1.290
Epoch 184 Batch    8/33   train_loss = 1.280
Epoch 185 Batch    7/33   train_loss = 1.244
Epoch 186 Batch    6/33   train_loss = 1.277
Epoch 187 Batch    5/33   train_loss = 1.203
Epoch 188 Batch    4/33   train_loss = 1.265
Epoch 189 Batch    3/33   train_loss = 1.250
Epoch 190 Batch    2/33   train_loss = 1.156
Epoch 191 Batch    1/33   train_loss = 1.290
Epoch 192 Batch    0/33   train_loss = 1.255
Epoch 192 Batch   32/33   train_loss = 1.189
Epoch 193 Batch   31/33   train_loss = 1.134
Epoch 194 Batch   30/33   train_loss = 1.179
Epoch 195 Batch   29/33   train_loss = 1.151
Epoch 196 Batch   28/33   train_loss = 1.221
Epoch 197 Batch   27/33   train_loss = 1.232
Epoch 198 Batch   26/33   train_loss = 1.144
Epoch 199 Batch   25/33   train_loss = 1.163
Epoch 200 Batch   24/33   train_loss = 1.175
Epoch 201 Batch   23/33   train_loss = 1.118
Epoch 202 Batch   22/33   train_loss = 1.144
Epoch 203 Batch   21/33   train_loss = 1.113
Epoch 204 Batch   20/33   train_loss = 1.168
Epoch 205 Batch   19/33   train_loss = 1.033
Epoch 206 Batch   18/33   train_loss = 1.204
Epoch 207 Batch   17/33   train_loss = 1.126
Epoch 208 Batch   16/33   train_loss = 1.159
Epoch 209 Batch   15/33   train_loss = 1.110
Epoch 210 Batch   14/33   train_loss = 1.097
Epoch 211 Batch   13/33   train_loss = 1.109
Epoch 212 Batch   12/33   train_loss = 1.021
Epoch 213 Batch   11/33   train_loss = 1.019
Epoch 214 Batch   10/33   train_loss = 1.022
Epoch 215 Batch    9/33   train_loss = 1.059
Epoch 216 Batch    8/33   train_loss = 1.061
Epoch 217 Batch    7/33   train_loss = 1.040
Epoch 218 Batch    6/33   train_loss = 1.066
Epoch 219 Batch    5/33   train_loss = 0.984
Epoch 220 Batch    4/33   train_loss = 1.050
Epoch 221 Batch    3/33   train_loss = 1.052
Epoch 222 Batch    2/33   train_loss = 0.962
Epoch 223 Batch    1/33   train_loss = 1.088
Epoch 224 Batch    0/33   train_loss = 1.048
Epoch 224 Batch   32/33   train_loss = 0.996
Epoch 225 Batch   31/33   train_loss = 0.948
Epoch 226 Batch   30/33   train_loss = 0.978
Epoch 227 Batch   29/33   train_loss = 0.972
Epoch 228 Batch   28/33   train_loss = 0.994
Epoch 229 Batch   27/33   train_loss = 1.017
Epoch 230 Batch   26/33   train_loss = 0.957
Epoch 231 Batch   25/33   train_loss = 0.970
Epoch 232 Batch   24/33   train_loss = 0.983
Epoch 233 Batch   23/33   train_loss = 0.923
Epoch 234 Batch   22/33   train_loss = 0.949
Epoch 235 Batch   21/33   train_loss = 0.922
Epoch 236 Batch   20/33   train_loss = 0.973
Epoch 237 Batch   19/33   train_loss = 0.858
Epoch 238 Batch   18/33   train_loss = 1.018
Epoch 239 Batch   17/33   train_loss = 0.943
Epoch 240 Batch   16/33   train_loss = 0.975
Epoch 241 Batch   15/33   train_loss = 0.939
Epoch 242 Batch   14/33   train_loss = 0.914
Epoch 243 Batch   13/33   train_loss = 0.924
Epoch 244 Batch   12/33   train_loss = 0.860
Epoch 245 Batch   11/33   train_loss = 0.860
Epoch 246 Batch   10/33   train_loss = 0.853
Epoch 247 Batch    9/33   train_loss = 0.901
Epoch 248 Batch    8/33   train_loss = 0.885
Epoch 249 Batch    7/33   train_loss = 0.875
Epoch 250 Batch    6/33   train_loss = 0.886
Epoch 251 Batch    5/33   train_loss = 0.828
Epoch 252 Batch    4/33   train_loss = 0.894
Epoch 253 Batch    3/33   train_loss = 0.893
Epoch 254 Batch    2/33   train_loss = 0.800
Epoch 255 Batch    1/33   train_loss = 0.935
Epoch 256 Batch    0/33   train_loss = 0.899
Epoch 256 Batch   32/33   train_loss = 0.855
Epoch 257 Batch   31/33   train_loss = 0.817
Epoch 258 Batch   30/33   train_loss = 0.848
Epoch 259 Batch   29/33   train_loss = 0.843
Epoch 260 Batch   28/33   train_loss = 0.851
Epoch 261 Batch   27/33   train_loss = 0.859
Epoch 262 Batch   26/33   train_loss = 0.826
Epoch 263 Batch   25/33   train_loss = 0.812
Epoch 264 Batch   24/33   train_loss = 0.823
Epoch 265 Batch   23/33   train_loss = 0.794
Epoch 266 Batch   22/33   train_loss = 0.805
Epoch 267 Batch   21/33   train_loss = 0.793
Epoch 268 Batch   20/33   train_loss = 0.838
Epoch 269 Batch   19/33   train_loss = 0.748
Epoch 270 Batch   18/33   train_loss = 0.891
Epoch 271 Batch   17/33   train_loss = 0.812
Epoch 272 Batch   16/33   train_loss = 0.850
Epoch 273 Batch   15/33   train_loss = 0.841
Epoch 274 Batch   14/33   train_loss = 0.802
Epoch 275 Batch   13/33   train_loss = 0.801
Epoch 276 Batch   12/33   train_loss = 0.749
Epoch 277 Batch   11/33   train_loss = 0.746
Epoch 278 Batch   10/33   train_loss = 0.739
Epoch 279 Batch    9/33   train_loss = 0.783
Epoch 280 Batch    8/33   train_loss = 0.776
Epoch 281 Batch    7/33   train_loss = 0.781
Epoch 282 Batch    6/33   train_loss = 0.793
Epoch 283 Batch    5/33   train_loss = 0.732
Epoch 284 Batch    4/33   train_loss = 0.823
Epoch 285 Batch    3/33   train_loss = 0.822
Epoch 286 Batch    2/33   train_loss = 0.730
Epoch 287 Batch    1/33   train_loss = 0.834
Epoch 288 Batch    0/33   train_loss = 0.800
Epoch 288 Batch   32/33   train_loss = 0.765
Epoch 289 Batch   31/33   train_loss = 0.733
Epoch 290 Batch   30/33   train_loss = 0.729
Epoch 291 Batch   29/33   train_loss = 0.748
Epoch 292 Batch   28/33   train_loss = 0.751
Epoch 293 Batch   27/33   train_loss = 0.761
Epoch 294 Batch   26/33   train_loss = 0.741
Epoch 295 Batch   25/33   train_loss = 0.741
Epoch 296 Batch   24/33   train_loss = 0.762
Epoch 297 Batch   23/33   train_loss = 0.740
Epoch 298 Batch   22/33   train_loss = 0.750
Epoch 299 Batch   21/33   train_loss = 0.737
Epoch 300 Batch   20/33   train_loss = 0.767
Epoch 301 Batch   19/33   train_loss = 0.684
Epoch 302 Batch   18/33   train_loss = 0.796
Epoch 303 Batch   17/33   train_loss = 0.729
Epoch 304 Batch   16/33   train_loss = 0.764
Epoch 305 Batch   15/33   train_loss = 0.752
Epoch 306 Batch   14/33   train_loss = 0.727
Epoch 307 Batch   13/33   train_loss = 0.757
Epoch 308 Batch   12/33   train_loss = 0.684
Epoch 309 Batch   11/33   train_loss = 0.686
Epoch 310 Batch   10/33   train_loss = 0.687
Epoch 311 Batch    9/33   train_loss = 0.716
Epoch 312 Batch    8/33   train_loss = 0.686
Epoch 313 Batch    7/33   train_loss = 0.689
Epoch 314 Batch    6/33   train_loss = 0.710
Epoch 315 Batch    5/33   train_loss = 0.643
Epoch 316 Batch    4/33   train_loss = 0.711
Epoch 317 Batch    3/33   train_loss = 0.726
Epoch 318 Batch    2/33   train_loss = 0.639
Epoch 319 Batch    1/33   train_loss = 0.737
Epoch 320 Batch    0/33   train_loss = 0.703
Epoch 320 Batch   32/33   train_loss = 0.691
Epoch 321 Batch   31/33   train_loss = 0.650
Epoch 322 Batch   30/33   train_loss = 0.647
Epoch 323 Batch   29/33   train_loss = 0.669
Epoch 324 Batch   28/33   train_loss = 0.658
Epoch 325 Batch   27/33   train_loss = 0.664
Epoch 326 Batch   26/33   train_loss = 0.647
Epoch 327 Batch   25/33   train_loss = 0.633
Epoch 328 Batch   24/33   train_loss = 0.655
Epoch 329 Batch   23/33   train_loss = 0.627
Epoch 330 Batch   22/33   train_loss = 0.638
Epoch 331 Batch   21/33   train_loss = 0.637
Epoch 332 Batch   20/33   train_loss = 0.658
Epoch 333 Batch   19/33   train_loss = 0.602
Epoch 334 Batch   18/33   train_loss = 0.694
Epoch 335 Batch   17/33   train_loss = 0.642
Epoch 336 Batch   16/33   train_loss = 0.663
Epoch 337 Batch   15/33   train_loss = 0.663
Epoch 338 Batch   14/33   train_loss = 0.625
Epoch 339 Batch   13/33   train_loss = 0.650
Epoch 340 Batch   12/33   train_loss = 0.593
Epoch 341 Batch   11/33   train_loss = 0.597
Epoch 342 Batch   10/33   train_loss = 0.592
Epoch 343 Batch    9/33   train_loss = 0.636
Epoch 344 Batch    8/33   train_loss = 0.610
Epoch 345 Batch    7/33   train_loss = 0.617
Epoch 346 Batch    6/33   train_loss = 0.637
Epoch 347 Batch    5/33   train_loss = 0.573
Epoch 348 Batch    4/33   train_loss = 0.639
Epoch 349 Batch    3/33   train_loss = 0.658
Epoch 350 Batch    2/33   train_loss = 0.575
Epoch 351 Batch    1/33   train_loss = 0.656
Epoch 352 Batch    0/33   train_loss = 0.627
Epoch 352 Batch   32/33   train_loss = 0.626
Epoch 353 Batch   31/33   train_loss = 0.590
Epoch 354 Batch   30/33   train_loss = 0.594
Epoch 355 Batch   29/33   train_loss = 0.615
Epoch 356 Batch   28/33   train_loss = 0.591
Epoch 357 Batch   27/33   train_loss = 0.603
Epoch 358 Batch   26/33   train_loss = 0.594
Epoch 359 Batch   25/33   train_loss = 0.571
Epoch 360 Batch   24/33   train_loss = 0.600
Epoch 361 Batch   23/33   train_loss = 0.574
Epoch 362 Batch   22/33   train_loss = 0.580
Epoch 363 Batch   21/33   train_loss = 0.586
Epoch 364 Batch   20/33   train_loss = 0.608
Epoch 365 Batch   19/33   train_loss = 0.564
Epoch 366 Batch   18/33   train_loss = 0.626
Epoch 367 Batch   17/33   train_loss = 0.596
Epoch 368 Batch   16/33   train_loss = 0.612
Epoch 369 Batch   15/33   train_loss = 0.614
Epoch 370 Batch   14/33   train_loss = 0.578
Epoch 371 Batch   13/33   train_loss = 0.605
Epoch 372 Batch   12/33   train_loss = 0.554
Epoch 373 Batch   11/33   train_loss = 0.558
Epoch 374 Batch   10/33   train_loss = 0.550
Epoch 375 Batch    9/33   train_loss = 0.592
Epoch 376 Batch    8/33   train_loss = 0.566
Epoch 377 Batch    7/33   train_loss = 0.580
Epoch 378 Batch    6/33   train_loss = 0.592
Epoch 379 Batch    5/33   train_loss = 0.530
Epoch 380 Batch    4/33   train_loss = 0.599
Epoch 381 Batch    3/33   train_loss = 0.617
Epoch 382 Batch    2/33   train_loss = 0.543
Epoch 383 Batch    1/33   train_loss = 0.621
Epoch 384 Batch    0/33   train_loss = 0.596
Epoch 384 Batch   32/33   train_loss = 0.594
Epoch 385 Batch   31/33   train_loss = 0.560
Epoch 386 Batch   30/33   train_loss = 0.555
Epoch 387 Batch   29/33   train_loss = 0.578
Epoch 388 Batch   28/33   train_loss = 0.558
Epoch 389 Batch   27/33   train_loss = 0.554
Epoch 390 Batch   26/33   train_loss = 0.542
Epoch 391 Batch   25/33   train_loss = 0.538
Epoch 392 Batch   24/33   train_loss = 0.565
Epoch 393 Batch   23/33   train_loss = 0.537
Epoch 394 Batch   22/33   train_loss = 0.544
Epoch 395 Batch   21/33   train_loss = 0.554
Epoch 396 Batch   20/33   train_loss = 0.572
Epoch 397 Batch   19/33   train_loss = 0.536
Epoch 398 Batch   18/33   train_loss = 0.590
Epoch 399 Batch   17/33   train_loss = 0.558
Epoch 400 Batch   16/33   train_loss = 0.576
Epoch 401 Batch   15/33   train_loss = 0.583
Epoch 402 Batch   14/33   train_loss = 0.540
Epoch 403 Batch   13/33   train_loss = 0.570
Epoch 404 Batch   12/33   train_loss = 0.520
Epoch 405 Batch   11/33   train_loss = 0.520
Epoch 406 Batch   10/33   train_loss = 0.522
Epoch 407 Batch    9/33   train_loss = 0.558
Epoch 408 Batch    8/33   train_loss = 0.548
Epoch 409 Batch    7/33   train_loss = 0.559
Epoch 410 Batch    6/33   train_loss = 0.566
Epoch 411 Batch    5/33   train_loss = 0.512
Epoch 412 Batch    4/33   train_loss = 0.568
Epoch 413 Batch    3/33   train_loss = 0.580
Epoch 414 Batch    2/33   train_loss = 0.513
Epoch 415 Batch    1/33   train_loss = 0.575
Epoch 416 Batch    0/33   train_loss = 0.551
Epoch 416 Batch   32/33   train_loss = 0.554
Epoch 417 Batch   31/33   train_loss = 0.531
Epoch 418 Batch   30/33   train_loss = 0.525
Epoch 419 Batch   29/33   train_loss = 0.554
Epoch 420 Batch   28/33   train_loss = 0.533
Epoch 421 Batch   27/33   train_loss = 0.525
Epoch 422 Batch   26/33   train_loss = 0.511
Epoch 423 Batch   25/33   train_loss = 0.509
Epoch 424 Batch   24/33   train_loss = 0.533
Epoch 425 Batch   23/33   train_loss = 0.502
Epoch 426 Batch   22/33   train_loss = 0.507
Epoch 427 Batch   21/33   train_loss = 0.526
Epoch 428 Batch   20/33   train_loss = 0.539
Epoch 429 Batch   19/33   train_loss = 0.505
Epoch 430 Batch   18/33   train_loss = 0.560
Epoch 431 Batch   17/33   train_loss = 0.525
Epoch 432 Batch   16/33   train_loss = 0.544
Epoch 433 Batch   15/33   train_loss = 0.554
Epoch 434 Batch   14/33   train_loss = 0.519
Epoch 435 Batch   13/33   train_loss = 0.547
Epoch 436 Batch   12/33   train_loss = 0.495
Epoch 437 Batch   11/33   train_loss = 0.493
Epoch 438 Batch   10/33   train_loss = 0.495
Epoch 439 Batch    9/33   train_loss = 0.531
Epoch 440 Batch    8/33   train_loss = 0.516
Epoch 441 Batch    7/33   train_loss = 0.524
Epoch 442 Batch    6/33   train_loss = 0.535
Epoch 443 Batch    5/33   train_loss = 0.492
Epoch 444 Batch    4/33   train_loss = 0.539
Epoch 445 Batch    3/33   train_loss = 0.553
Epoch 446 Batch    2/33   train_loss = 0.490
Epoch 447 Batch    1/33   train_loss = 0.542
Epoch 448 Batch    0/33   train_loss = 0.521
Epoch 448 Batch   32/33   train_loss = 0.530
Epoch 449 Batch   31/33   train_loss = 0.505
Epoch 450 Batch   30/33   train_loss = 0.495
Epoch 451 Batch   29/33   train_loss = 0.528
Epoch 452 Batch   28/33   train_loss = 0.504
Epoch 453 Batch   27/33   train_loss = 0.496
Epoch 454 Batch   26/33   train_loss = 0.485
Epoch 455 Batch   25/33   train_loss = 0.486
Epoch 456 Batch   24/33   train_loss = 0.513
Epoch 457 Batch   23/33   train_loss = 0.481
Epoch 458 Batch   22/33   train_loss = 0.481
Epoch 459 Batch   21/33   train_loss = 0.504
Epoch 460 Batch   20/33   train_loss = 0.515
Epoch 461 Batch   19/33   train_loss = 0.487
Epoch 462 Batch   18/33   train_loss = 0.530
Epoch 463 Batch   17/33   train_loss = 0.504
Epoch 464 Batch   16/33   train_loss = 0.524
Epoch 465 Batch   15/33   train_loss = 0.533
Epoch 466 Batch   14/33   train_loss = 0.497
Epoch 467 Batch   13/33   train_loss = 0.526
Epoch 468 Batch   12/33   train_loss = 0.480
Epoch 469 Batch   11/33   train_loss = 0.478
Epoch 470 Batch   10/33   train_loss = 0.479
Epoch 471 Batch    9/33   train_loss = 0.509
Epoch 472 Batch    8/33   train_loss = 0.497
Epoch 473 Batch    7/33   train_loss = 0.509
Epoch 474 Batch    6/33   train_loss = 0.520
Epoch 475 Batch    5/33   train_loss = 0.476
Epoch 476 Batch    4/33   train_loss = 0.518
Epoch 477 Batch    3/33   train_loss = 0.535
Epoch 478 Batch    2/33   train_loss = 0.476
Epoch 479 Batch    1/33   train_loss = 0.523
Epoch 480 Batch    0/33   train_loss = 0.505
Epoch 480 Batch   32/33   train_loss = 0.515
Epoch 481 Batch   31/33   train_loss = 0.489
Epoch 482 Batch   30/33   train_loss = 0.479
Epoch 483 Batch   29/33   train_loss = 0.516
Epoch 484 Batch   28/33   train_loss = 0.490
Epoch 485 Batch   27/33   train_loss = 0.483
Epoch 486 Batch   26/33   train_loss = 0.474
Epoch 487 Batch   25/33   train_loss = 0.473
Epoch 488 Batch   24/33   train_loss = 0.502
Epoch 489 Batch   23/33   train_loss = 0.468
Epoch 490 Batch   22/33   train_loss = 0.471
Epoch 491 Batch   21/33   train_loss = 0.493
Epoch 492 Batch   20/33   train_loss = 0.505
Epoch 493 Batch   19/33   train_loss = 0.476
Epoch 494 Batch   18/33   train_loss = 0.513
Epoch 495 Batch   17/33   train_loss = 0.497
Epoch 496 Batch   16/33   train_loss = 0.509
Epoch 497 Batch   15/33   train_loss = 0.523
Epoch 498 Batch   14/33   train_loss = 0.485
Epoch 499 Batch   13/33   train_loss = 0.515
Epoch 500 Batch   12/33   train_loss = 0.467
Epoch 501 Batch   11/33   train_loss = 0.469
Epoch 502 Batch   10/33   train_loss = 0.469
Epoch 503 Batch    9/33   train_loss = 0.499
Epoch 504 Batch    8/33   train_loss = 0.489
Epoch 505 Batch    7/33   train_loss = 0.504
Epoch 506 Batch    6/33   train_loss = 0.508
Epoch 507 Batch    5/33   train_loss = 0.467
Epoch 508 Batch    4/33   train_loss = 0.512
Epoch 509 Batch    3/33   train_loss = 0.528
Epoch 510 Batch    2/33   train_loss = 0.466
Epoch 511 Batch    1/33   train_loss = 0.518
Model Trained and Saved

Save Parameters

Save seq_length and save_dir for generating a new TV script.


In [41]:
"""
DON'T MODIFY ANYTHING IN THIS CELL
"""
# Save parameters for checkpoint
helper.save_params((seq_length, save_dir))

Checkpoint


In [42]:
"""
DON'T MODIFY ANYTHING IN THIS CELL
"""
import tensorflow as tf
import numpy as np
import helper
import problem_unittests as tests

_, vocab_to_int, int_to_vocab, token_dict = helper.load_preprocess()
seq_length, load_dir = helper.load_params()

Implement Generate Functions

Get Tensors

Get tensors from loaded_graph using the function get_tensor_by_name(). Get the tensors using the following names:

  • "input:0"
  • "initial_state:0"
  • "final_state:0"
  • "probs:0"

Return the tensors in the following tuple (InputTensor, InitialStateTensor, FinalStateTensor, ProbsTensor)


In [43]:
def get_tensors(loaded_graph):
    """
    Get input, initial state, final state, and probabilities tensor from <loaded_graph>
    :param loaded_graph: TensorFlow graph loaded from file
    :return: Tuple (InputTensor, InitialStateTensor, FinalStateTensor, ProbsTensor)
    """
    
    input_tensor = loaded_graph.get_tensor_by_name('input:0')
    initial_state_tensor = loaded_graph.get_tensor_by_name('initial_state:0')
    final_state_tensor = loaded_graph.get_tensor_by_name('final_state:0')
    probs_tensor = loaded_graph.get_tensor_by_name('probs:0')
    
    return input_tensor, initial_state_tensor, final_state_tensor, probs_tensor


"""
DON'T MODIFY ANYTHING IN THIS CELL THAT IS BELOW THIS LINE
"""
tests.test_get_tensors(get_tensors)


Tests Passed

Choose Word

Implement the pick_word() function to select the next word using probabilities.


In [44]:
def pick_word(probabilities, int_to_vocab):
    """
    Pick the next word in the generated text
    :param probabilities: Probabilites of the next word
    :param int_to_vocab: Dictionary of word ids as the keys and words as the values
    :return: String of the predicted word
    """
    
    import random
    
    num_words = len(probabilities)
    
    while True:
        
        idx = random.randint(0, num_words - 1)
        if probabilities[idx] < random.random(): continue
        selected_word = int_to_vocab[idx]
        break
    
    return selected_word


"""
DON'T MODIFY ANYTHING IN THIS CELL THAT IS BELOW THIS LINE
"""
tests.test_pick_word(pick_word)


Tests Passed

Generate TV Script

This will generate the TV script for you. Set gen_length to the length of TV script you want to generate.


In [45]:
gen_length = 256
# homer_simpson, moe_szyslak, or Barney_Gumble
prime_word = 'moe_szyslak'

"""
DON'T MODIFY ANYTHING IN THIS CELL THAT IS BELOW THIS LINE
"""
loaded_graph = tf.Graph()
with tf.Session(graph=loaded_graph) as sess:
    # Load saved model
    loader = tf.train.import_meta_graph(load_dir + '.meta')
    loader.restore(sess, load_dir)

    # Get Tensors from loaded model
    input_text, initial_state, final_state, probs = get_tensors(loaded_graph)

    # Sentences generation setup
    gen_sentences = [prime_word + ':']
    prev_state = sess.run(initial_state, {input_text: np.array([[1]])})

    # Generate sentences
    for n in range(gen_length):
        # Dynamic Input
        dyn_input = [[vocab_to_int[word] for word in gen_sentences[-seq_length:]]]
        dyn_seq_length = len(dyn_input[0])

        # Get Prediction
        probabilities, prev_state = sess.run(
            [probs, final_state],
            {input_text: dyn_input, initial_state: prev_state})
        
        pred_word = pick_word(probabilities[dyn_seq_length-1], int_to_vocab)

        gen_sentences.append(pred_word)
    
    # Remove tokens
    tv_script = ' '.join(gen_sentences)
    for key, token in token_dict.items():
        ending = ' ' if key in ['\n', '(', '"'] else ''
        tv_script = tv_script.replace(' ' + token.lower(), key)
    tv_script = tv_script.replace('\n ', '\n')
    tv_script = tv_script.replace('( ', '(')
        
    print(tv_script)


INFO:tensorflow:Restoring parameters from ./save
moe_szyslak: no, i tells ya.
homer_simpson: or what?
jasper_beardly:(reaching for a long. i'm a little break, there.
moe_szyslak: you know what mom i take me a" you're one, but / be nice to moe you up) huh?


homer_simpson: ned, you've got it for a special.
seymour_skinner:(love after" stripes!
homer_simpson: okay, i'm gonna help you reopen your back, you're trying to get better to the beer up when i really expect it to give you?
homer_simpson: i guess... edna asked me!
moe_szyslak: and i'd be friends yet?
homer_simpson: i will mean that really? you came to be the rats.
marge_simpson: i make a great way.
moe_szyslak: come on, guys, homer. you insulted you'd be done.
homer_simpson: they come here?
chief_wiggum:(presses chuckle) well please, don't give her-- the point of a guy a day? my think it's time.
homer_simpson: you know, i really shouldn't" go to the texas.
homer_simpson:(to the pipes) i really wanna be all of you going to do?
joey_kramer: yeah? you got done and it was.
kirk_van_houten: god! it's worse than i thought.


jimbo's_dad:(to camera) see, i really

The TV Script is Nonsensical

It's ok if the TV script doesn't make any sense. We trained on less than a megabyte of text. In order to get good results, you'll have to use a smaller vocabulary or get more data. Luckly there's more data! As we mentioned in the begging of this project, this is a subset of another dataset. We didn't have you train on all the data, because that would take too long. However, you are free to train your neural network on all the data. After you complete the project, of course.

Submitting This Project

When submitting this project, make sure to run all the cells before saving the notebook. Save the notebook file as "dlnd_tv_script_generation.ipynb" and save it as a HTML file under "File" -> "Download as". Include the "helper.py" and "problem_unittests.py" files in your submission.


In [ ]: