# Copyright (c) Microsoft Corporation. All rights reserved. # Licensed under the MIT License. import mlflow import mlflow.keras import numpy as np import warnings import keras from keras.models import Sequential from keras.layers import Dense from keras.optimizers import RMSprop print("Keras version:", keras.__version__) # Enable auto-logging to MLflow to capture Keras metrics. mlflow.keras.autolog() # Model / data parameters n_inputs = 28 * 28 n_h1 = 300 n_h2 = 100 n_outputs = 10 learning_rate = 0.001 # the data, split between train and test sets (x_train, y_train), (x_test, y_test) = keras.datasets.mnist.load_data() # Scale images to the [0, 1] range x_train = x_train.astype("float32") / 255 x_test = x_test.astype("float32") / 255 # Flatten image to be (n, 28 * 28) x_train = x_train.reshape(len(x_train), -1) x_test = x_test.reshape(len(x_test), -1) print("x_train shape:", x_train.shape) print(x_train.shape[0], "train samples") print(x_test.shape[0], "test samples") # convert class vectors to binary class matrices y_train = keras.utils.to_categorical(y_train, n_outputs) y_test = keras.utils.to_categorical(y_test, n_outputs) def driver(): warnings.filterwarnings("ignore") with mlflow.start_run() as run: # Build a simple MLP model model = Sequential() # first hidden layer model.add(Dense(n_h1, activation='relu', input_shape=(n_inputs,))) # second hidden layer model.add(Dense(n_h2, activation='relu')) # output layer model.add(Dense(n_outputs, activation='softmax')) model.summary() batch_size = 128 epochs = 5 model.compile(loss='categorical_crossentropy', optimizer=RMSprop(lr=learning_rate), metrics=['accuracy']) model.fit(x_train, y_train, batch_size=batch_size, epochs=epochs, validation_split=0.1) score = model.evaluate(x_test, y_test, verbose=0) print('Test loss:', score[0]) print('Test accuracy:', score[1]) return run if __name__ == "__main__": driver()