code: # -*- coding: utf-8 -*-
  """TF2.0 Mirrored Strategy.ipynb
  
  Automatically generated by Colaboratory.
  
  Original file is located at
      https://colab.research.google.com/drive/1e7_N_vVQGyfa3Wz9ND0smWnnsHsQUs_k
  """
  
  # Commented out IPython magic to ensure Python compatibility.
  from tensorflow.keras.models import Model
  from tensorflow.keras.layers import Input, Conv2D, Dense, Flatten, Dropout, GlobalMaxPooling2D, MaxPooling2D, BatchNormalization
  import matplotlib.pyplot as plt
  import numpy as np
  import tensorflow as tf
  print(tf.__version__)
  
  # additional imports
  
  
  # Load in the data
  cifar10 = tf.keras.datasets.cifar10
  
  (x_train, y_train), (x_test, y_test) = cifar10.load_data()
  x_train, x_test = x_train / 255.0, x_test / 255.0
  y_train, y_test = y_train.flatten(), y_test.flatten()
  print("x_train.shape:", x_train.shape)
  print("y_train.shape", y_train.shape)
  
  # number of classes
  K = len(set(y_train))
  print("number of classes:", K)
  
  # Build the model using the functional API
  
  
  def create_model():
      i = Input(shape=x_train[0].shape)
  
      x = Conv2D(32, (3, 3), activation='relu', padding='same')(i)
      x = BatchNormalization()(x)
      x = Conv2D(32, (3, 3), activation='relu', padding='same')(x)
      x = BatchNormalization()(x)
      x = MaxPooling2D((2, 2))(x)
      x = Conv2D(64, (3, 3), activation='relu', padding='same')(x)
      x = BatchNormalization()(x)
      x = Conv2D(64, (3, 3), activation='relu', padding='same')(x)
      x = BatchNormalization()(x)
      x = MaxPooling2D((2, 2))(x)
      x = Conv2D(128, (3, 3), activation='relu', padding='same')(x)
      x = BatchNormalization()(x)
      x = Conv2D(128, (3, 3), activation='relu', padding='same')(x)
      x = BatchNormalization()(x)
      x = MaxPooling2D((2, 2))(x)
  
      x = Flatten()(x)
      x = Dropout(0.2)(x)
      x = Dense(1024, activation='relu')(x)
      x = Dropout(0.2)(x)
      x = Dense(K, activation='softmax')(x)
  
      model = Model(i, x)
      return model
  
  
  strategy = tf.distribute.MirroredStrategy()
  # strategy = tf.distribute.experimental.CentralStorageStrategy()
  
  print(f'Number of devices: {strategy.num_replicas_in_sync}')
  
  with strategy.scope():
      model = create_model()
  
      model.compile(loss='sparse_categorical_crossentropy',
                    optimizer='adam',
                    metrics=['accuracy'])
  
  # Fit
  r = model.fit(x_train, y_train, validation_data=(x_test, y_test), epochs=5)
  
  50000/391
  
  10000/79
  
  # Compare this to non-distributed training
  model2 = create_model()
  model2.compile(loss='sparse_categorical_crossentropy',
                 optimizer='adam',
                 metrics=['accuracy'])
  r = model2.fit(x_train, y_train, validation_data=(x_test, y_test), epochs=5)
  
apis: tensorflow.keras.layers.Flatten tensorflow.keras.layers.Dropout tensorflow.keras.layers.MaxPooling2D tensorflow.keras.models.Model tensorflow.keras.layers.BatchNormalization tensorflow.distribute.MirroredStrategy tensorflow.keras.layers.Dense tensorflow.keras.layers.Conv2D tensorflow.keras.layers.Input