new_contents: """
  Adapted from: https://github.com/Lasagne/Recipes/blob/master/modelzoo/vgg16.py
  """
  
  # VGG-16, 16-layer model from the paper:
  # "Very Deep Convolutional Networks for Large-Scale Image Recognition"
  # Original source: https://gist.github.com/ksimonyan/211839e770f7b538e2d8
  # License: see http://www.robots.ox.ac.uk/~vgg/research/very_deep/
  
  # Download pretrained weights from:
  # https://s3.amazonaws.com/lasagne/recipes/pretrained/imagenet/vgg16.pkl
  
  from lasagne.layers import InputLayer
  from lasagne.layers import DenseLayer
  from lasagne.layers import NonlinearityLayer
  from lasagne.layers import DropoutLayer
  from lasagne.layers import Pool2DLayer as PoolLayer
  from lasagne.layers.dnn import Conv2DDNNLayer as ConvLayer
  from lasagne.nonlinearities import softmax
  
  
  def build_model(input_var):
      net = {}
      net['input'] = InputLayer((None, 3, 224, 224), input_var=input_var)
      net['conv1_1'] = ConvLayer(net['input'], 64, 3, pad=1, flip_filters=False)
      net['conv1_2'] = ConvLayer(net['conv1_1'], 64, 3, pad=1, flip_filters=False)
      net['pool1'] = PoolLayer(net['conv1_2'], 2)
      net['conv2_1'] = ConvLayer(net['pool1'], 128, 3, pad=1, flip_filters=False)
      net['conv2_2'] = ConvLayer(net['conv2_1'], 128, 3, pad=1, flip_filters=False)
      net['pool2'] = PoolLayer(net['conv2_2'], 2)
      net['conv3_1'] = ConvLayer(net['pool2'], 256, 3, pad=1, flip_filters=False)
      net['conv3_2'] = ConvLayer(net['conv3_1'], 256, 3, pad=1, flip_filters=False)
      net['conv3_3'] = ConvLayer(net['conv3_2'], 256, 3, pad=1, flip_filters=False)
      net['pool3'] = PoolLayer(net['conv3_3'], 2)
      net['conv4_1'] = ConvLayer(net['pool3'], 512, 3, pad=1, flip_filters=False)
      net['conv4_2'] = ConvLayer(net['conv4_1'], 512, 3, pad=1, flip_filters=False)
      net['conv4_3'] = ConvLayer(net['conv4_2'], 512, 3, pad=1, flip_filters=False)
      net['pool4'] = PoolLayer(net['conv4_3'], 2)
      net['conv5_1'] = ConvLayer(net['pool4'], 512, 3, pad=1, flip_filters=False)
      net['conv5_2'] = ConvLayer(net['conv5_1'], 512, 3, pad=1, flip_filters=False)
      net['conv5_3'] = ConvLayer(net['conv5_2'], 512, 3, pad=1, flip_filters=False)
      net['pool5'] = PoolLayer(net['conv5_3'], 2)
      net['fc6'] = DenseLayer(net['pool5'], num_units=4096)
      net['fc6_dropout'] = DropoutLayer(net['fc6'], p=0.5)
      net['fc7'] = DenseLayer(net['fc6_dropout'], num_units=4096)
      net['fc7_dropout'] = DropoutLayer(net['fc7'], p=0.5)
      net['fc8'] = DenseLayer(net['fc7_dropout'], num_units=1000, nonlinearity=None)
      net['prob'] = NonlinearityLayer(net['fc8'], softmax)
  
      return net
  
  import time
  import numpy as np
  import theano
  import theano.tensor as T
  import lasagne
  
  input_var = T.tensor4('inputs')
  target_var = T.ivector('targets')
  
  network = build_model(input_var)
  
  prediction = lasagne.layers.get_output(network['prob'])
  loss = lasagne.objectives.categorical_crossentropy(prediction, target_var)
  loss = loss.mean()
  
  params = lasagne.layers.get_all_params(network['prob'], trainable=True)
  updates = lasagne.updates.nesterov_momentum(loss, params, learning_rate=0.01, momentum=0.9)
  
  train_fn = theano.function([input_var, target_var], loss, updates=updates)
  
  width = 224
  height = 224
  batch_size = 16
  
  x = np.zeros((batch_size, 3, width, height), dtype=np.float32)
  y = np.zeros((batch_size), dtype=np.int32)
  
  # warmup
  train_fn(x, y)
  
  t0 = time.time()
  n = 0
  while n < 100:
      tstart = time.time()
      train_fn(x, y)
      tend = time.time()
      print "Iteration: %d train on batch time: %7.3f ms." %( n, (tend - tstart)*1000 )
      n += 1
  t1 = time.time()
  
  print "Batch size: %d" %(batch_size)
  print "Iterations: %d" %(n)
  print "Time per iteration: %7.3f ms" %((t1 - t0) *1000 / n)
  
subject: Add Lasagne benchmark