text: """multiple_eta
  ~~~~~~~~~~~~~~~
  
  This program shows how different values for the learning rate affect
  training.  In particular, we'll plot out how the cost changes using
  three different values for eta.
  
  """
  
  # Standard library
  import json
  import random
  import sys
  
  # My library
  sys.path.append('../code/')
  import mnist_loader
  import network2
  
  # Third-party libraries
  import matplotlib.pyplot as plt
  import numpy as np
  
  # Constants
  LEARNING_RATES = [0.025, 0.25, 2.5]
  COLORS = ['#2A6EA6', '#FFCD33', '#FF7033']
  NUM_EPOCHS = 30
  
  def main():
      run_networks()
      make_plot()
  
  def run_networks():
      """Train networks using three different values for the learning rate,
      and store the cost curves in the file ``multiple_eta.json``, where
      they can later be used by ``make_plot``.
  
      """
      # Make results more easily reproducible
      random.seed(12345678)
      np.random.seed(12345678)
      training_data, validation_data, test_data = mnist_loader.load_data_wrapper()
      results = []
      for eta in LEARNING_RATES:
          print "\nTrain a network using eta = "+str(eta)
          net = network2.Network([784, 30, 10])
          results.append(
              net.SGD(training_data, NUM_EPOCHS, 10, eta, lmbda=5.0,
                      evaluation_data=validation_data, 
                      monitor_training_cost=True))
      f = open("multiple_eta.json", "w")
      json.dump(results, f)
      f.close()
  
  def make_plot():
      f = open("multiple_eta.json", "r")
      results = json.load(f)
      f.close()
      fig = plt.figure()
      ax = fig.add_subplot(111)
      for eta, result, color in zip(LEARNING_RATES, results, COLORS):
          _, _, training_cost, _ = result
          ax.plot(np.arange(NUM_EPOCHS), training_cost, "o-",
                  label="$\eta$ = "+str(eta),
                  color=color)
      ax.set_xlim([0, NUM_EPOCHS])
      ax.set_xlabel('Epoch')
      ax.set_ylabel('Cost')
      plt.legend(loc='upper right')
      plt.show()
  
  if __name__ == "__main__":
      main()
  