def _custom_model_saving(model_filepath, save_fn, load_fn): iris = datasets.load_iris() X = iris.data Y = iris.target # Create a custom model inputs = tf.keras.layers.Input(shape=(X.shape[-1], )) x = tf.keras.layers.Dense(8, activation='relu')(inputs) custom_model = tf.keras.Model(inputs, x) model = Ivis(k=15, batch_size=16, epochs=2, model=custom_model) model.fit(X, Y) save_fn(model, model_filepath) model_2 = load_fn(model_filepath) # Check that model embeddings are same assert np.all(model.transform(X) == model_2.transform(X)) # Check that model supervised predictions are same assert np.all(model.score_samples(X) == model_2.score_samples(X)) _validate_network_equality(model, model_2) # Train new model y_pred_2 = model_2.fit_transform(X, Y)
def test_supervised_model_saving(model_filepath): model = Ivis(k=15, batch_size=16, epochs=5, supervision_metric='sparse_categorical_crossentropy') iris = datasets.load_iris() X = iris.data Y = iris.target model.fit(X, Y) model.save_model(model_filepath, overwrite=True) model_2 = Ivis() model_2.load_model(model_filepath) # Check that model embeddings are same assert np.all(model.transform(X) == model_2.transform(X)) # Check that model supervised predictions are same assert np.all(model.score_samples(X) == model_2.score_samples(X)) # Serializable dict eles same assert model.__getstate__() == model_2.__getstate__() # Check all weights are the same for model_layer, model_2_layer in zip(model.encoder.layers, model_2.encoder.layers): model_layer_weights = model_layer.get_weights() model_2_layer_weights = model_2_layer.get_weights() for i in range(len(model_layer_weights)): assert np.all(model_layer_weights[i] == model_2_layer_weights[i]) # Check optimizer weights are the same for w1, w2 in zip(model.model_.optimizer.get_weights(), model_2.model_.optimizer.get_weights()): assert np.all(w1 == w2) # Check that trying to save over an existing folder raises an Exception with pytest.raises(FileExistsError) as exception_info: model.save_model(model_filepath) assert isinstance(exception_info.value, FileExistsError) # Check that can overwrite existing model if requested model.save_model(model_filepath, overwrite=True) # Train new model y_pred_2 = model_2.fit_transform(X, Y)
def test_custom_model_saving(model_filepath): iris = datasets.load_iris() X = iris.data Y = iris.target # Create a custom model inputs = tf.keras.layers.Input(shape=(X.shape[-1], )) x = tf.keras.layers.Dense(128, activation='relu')(inputs) custom_model = tf.keras.Model(inputs, x) model = Ivis(k=15, batch_size=16, epochs=5, supervision_metric='sparse_categorical_crossentropy', model=custom_model) model.fit(X, Y) model.save_model(model_filepath, overwrite=True) model_2 = Ivis() model_2.load_model(model_filepath) # Check that model embeddings are same assert np.all(model.transform(X) == model_2.transform(X)) # Check that model supervised predictions are same assert np.all(model.score_samples(X) == model_2.score_samples(X)) # Serializable dict eles same assert model.__getstate__() == model_2.__getstate__() # Check all weights are the same for model_layer, model_2_layer in zip(model.encoder.layers, model_2.encoder.layers): model_layer_weights = model_layer.get_weights() model_2_layer_weights = model_2_layer.get_weights() for i in range(len(model_layer_weights)): assert np.all(model_layer_weights[i] == model_2_layer_weights[i]) # Check optimizer weights are the same for w1, w2 in zip(model.model_.optimizer.get_weights(), model_2.model_.optimizer.get_weights()): assert np.all(w1 == w2) # Train new model y_pred_2 = model_2.fit_transform(X, Y)
def test_score_samples_unsupervised(): iris = datasets.load_iris() x = iris.data y = iris.target ivis_iris = Ivis(k=15, batch_size=16, epochs=2) embeddings = ivis_iris.fit_transform(x) # Unsupervised model cannot classify with pytest.raises(Exception): y_pred = ivis_iris.score_samples(x)
def test_regression(): (x_train, y_train), (x_test, y_test) = boston_housing.load_data() supervision_metric = 'mae' ivis_boston = Ivis(k=15, batch_size=16, epochs=5, supervision_metric=supervision_metric) ivis_boston.fit(x_train, y_train) embeddings = ivis_boston.transform(x_train) y_pred = ivis_boston.score_samples(x_train) assert ivis_boston.model_.loss['supervised'] == 'mae' assert ivis_boston.model_.layers[-1].activation.__name__ == 'linear' assert ivis_boston.model_.layers[-1].output_shape[-1] == 1
def _supervised_model_save_test(model_filepath, save_fn, load_fn): model = Ivis(k=15, batch_size=16, epochs=2, supervision_metric='sparse_categorical_crossentropy') iris = datasets.load_iris() X = iris.data Y = iris.target model.fit(X, Y) save_fn(model, model_filepath) model_2 = load_fn(model_filepath) # Check that model embeddings are same assert np.all(model.transform(X) == model_2.transform(X)) # Check that model supervised predictions are same assert np.all(model.score_samples(X) == model_2.score_samples(X)) _validate_network_equality(model, model_2) # Train new model y_pred_2 = model_2.fit_transform(X, Y)
def test_score_samples(): iris = datasets.load_iris() x = iris.data y = iris.target supervision_metric = 'sparse_categorical_crossentropy' ivis_iris = Ivis(k=15, batch_size=16, epochs=5, supervision_metric=supervision_metric) embeddings = ivis_iris.fit_transform(x, y) y_pred = ivis_iris.score_samples(x) # Softmax probabilities add to one, correct shape assert np.sum(y_pred, axis=-1) == pytest.approx(1, 0.01) assert y_pred.shape[0] == x.shape[0] assert y_pred.shape[1] == len(np.unique(y)) # Check that loss function and activation are correct assert ivis_iris.model_.loss['supervised'] == supervision_metric assert ivis_iris.model_.layers[-1].activation.__name__ == 'softmax'
def test_svm_score_samples(): iris = datasets.load_iris() x = iris.data y = iris.target supervision_metric = 'categorical_hinge' ivis_iris = Ivis(k=15, batch_size=16, epochs=2, supervision_metric=supervision_metric) # Correctly formatted one-hot labels train successfully y = to_categorical(y) embeddings = ivis_iris.fit_transform(x, y) y_pred = ivis_iris.score_samples(x) loss_name = ivis_iris.model_.loss['supervised'].__name__ assert losses.get(loss_name).__name__ == losses.get( supervision_metric).__name__ assert ivis_iris.model_.layers[-1].activation.__name__ == 'linear' assert ivis_iris.model_.layers[-1].kernel_regularizer is not None assert ivis_iris.model_.layers[-1].output_shape[-1] == y.shape[-1]
def test_svm_score_samples(): iris = datasets.load_iris() x = iris.data y = iris.target supervision_metric = 'categorical_hinge' ivis_iris = Ivis(k=15, batch_size=16, epochs=5, supervision_metric=supervision_metric) # Incorrectly formatted labels from SVM with pytest.raises(ValueError): embeddings = ivis_iris.fit_transform(x, y) # Correctly formatted labels train successfully y = to_categorical(y) * 2 - 1 embeddings = ivis_iris.fit_transform(x, y) y_pred = ivis_iris.score_samples(x) assert ivis_iris.model_.loss['supervised'] == supervision_metric assert ivis_iris.model_.layers[-1].activation.__name__ == 'linear' assert ivis_iris.model_.layers[-1].kernel_regularizer is not None assert ivis_iris.model_.layers[-1].output_shape[-1] == y.shape[-1]