def test_lgbm_classifier(tmp_dir): x_train = np.random.rand(11, 32) y_train = np.array([[1, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 1, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 1, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 1, 0, 0], [0, 0, 0, 0, 0, 1, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 1], [0, 0, 0, 0, 0, 0, 0, 1, 0, 0], [1, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 1, 0, 0, 0, 0, 0, 0], [0, 0, 0, 1, 0, 0, 0, 0, 0, 0]]) input_node = ak.Input() output_node = input_node output_node = preprocessor.LightGBMClassifier()(output_node) output_node = block.IdentityBlock()(output_node) output_node = head.EmptyHead(loss='categorical_crossentropy', metrics=['accuracy'])(output_node) auto_model = ak.GraphAutoModel(input_node, output_node, directory=tmp_dir, max_trials=1) auto_model.fit(x_train, y_train, epochs=1, validation_data=(x_train, y_train)) result = auto_model.predict(x_train) auto_model.tuner.get_best_models()[0].summary() assert result.shape == (11, 10)
def test_merge(tmp_dir): x_train = np.random.rand(100, 32) y_train = np.random.rand(100) input_node1 = ak.Input() input_node2 = ak.Input() output_node1 = ak.DenseBlock()(input_node1) output_node2 = ak.DenseBlock()(input_node2) output_node = ak.Merge()([output_node1, output_node2]) output_node = ak.RegressionHead()(output_node) input_node1.shape = (32, ) input_node2.shape = (32, ) output_node[0].shape = (1, ) graph = ak.GraphAutoModel([input_node1, input_node2], output_node, directory=tmp_dir) model = graph.build(kerastuner.HyperParameters()) model.fit([x_train, x_train], y_train, epochs=1, batch_size=100, verbose=False) result = model.predict([x_train, x_train]) assert result.shape == (100, 1)
def test_preprocessing(tmp_dir): x_train = np.random.rand(100, 32) y_train = np.random.rand(100) input_node1 = ak.Input() temp_node1 = ak.Normalize()(input_node1) output_node1 = ak.DenseBlock()(temp_node1) output_node3 = ak.Normalize()(temp_node1) output_node3 = ak.DenseBlock()(output_node3) input_node2 = ak.Input() output_node2 = ak.Normalize()(input_node2) output_node2 = ak.DenseBlock()(output_node2) output_node = ak.Merge()([output_node1, output_node2, output_node3]) output_node = ak.RegressionHead()(output_node) graph = ak.GraphAutoModel([input_node1, input_node2], output_node, directory=tmp_dir, max_trials=1) graph.fit([x_train, x_train], y_train, epochs=1, batch_size=100, validation_data=([x_train, x_train], y_train), validation_split=0.5, verbose=False) result = graph.predict([x_train, x_train]) assert result.shape == (100, 1)
def test_evaluate(tuner_fn, tmp_dir): pg = mock.Mock() pg.preprocess.return_value = (mock.Mock(), mock.Mock()) tuner_class = tuner_fn.return_value tuner = tuner_class.return_value tuner.get_best_model.return_value = (pg, mock.Mock()) x_train = np.random.rand(100, 32) y_train = np.random.rand(100, 1) input_node = ak.Input() output_node = input_node output_node = ak.DenseBlock()(output_node) output_node = ak.RegressionHead()(output_node) auto_model = ak.GraphAutoModel(input_node, output_node, directory=tmp_dir, max_trials=1) auto_model.fit(x_train, y_train, epochs=1, validation_data=(x_train, y_train)) auto_model.evaluate(x_train, y_train) assert tuner_fn.called assert tuner_class.called assert tuner.get_best_model.called
def test_functional_api(tmp_dir): # Prepare the data. num_instances = 20 (image_x, train_y), (test_x, test_y) = mnist.load_data() (text_x, train_y), (test_x, test_y) = common.imdb_raw() (structured_data_x, train_y), (test_x, test_y) = common.dataframe_numpy() image_x = image_x[:num_instances] text_x = text_x[:num_instances] structured_data_x = structured_data_x[:num_instances] classification_y = common.generate_one_hot_labels( num_instances=num_instances, num_classes=3) regression_y = common.generate_data(num_instances=num_instances, shape=(1, )) # Build model and train. image_input = ak.ImageInput() output = ak.Normalization()(image_input) output = ak.ImageAugmentation()(output) outputs1 = ak.ResNetBlock(version='next')(image_input) outputs2 = ak.XceptionBlock()(image_input) image_output = ak.Merge()((outputs1, outputs2)) structured_data_input = ak.StructuredDataInput( column_names=common.COLUMN_NAMES_FROM_CSV, column_types=common.COLUMN_TYPES_FROM_CSV) structured_data_output = ak.FeatureEngineering()(structured_data_input) structured_data_output = ak.DenseBlock()(structured_data_output) text_input = ak.TextInput() outputs1 = ak.TextToIntSequence()(text_input) outputs1 = ak.EmbeddingBlock()(outputs1) outputs1 = ak.ConvBlock(separable=True)(outputs1) outputs1 = ak.SpatialReduction()(outputs1) outputs2 = ak.TextToNgramVector()(text_input) outputs2 = ak.DenseBlock()(outputs2) text_output = ak.Merge()((outputs1, outputs2)) merged_outputs = ak.Merge()( (structured_data_output, image_output, text_output)) regression_outputs = ak.RegressionHead()(merged_outputs) classification_outputs = ak.ClassificationHead()(merged_outputs) automodel = ak.GraphAutoModel( inputs=[image_input, text_input, structured_data_input], directory=tmp_dir, outputs=[regression_outputs, classification_outputs], max_trials=2, seed=common.SEED) automodel.fit((image_x, text_x, structured_data_x), (regression_y, classification_y), validation_split=0.2, epochs=2)
def test_input_missing(tmp_dir): input_node1 = ak.Input() input_node2 = ak.Input() output_node1 = ak.DenseBlock()(input_node1) output_node2 = ak.DenseBlock()(input_node2) output_node = ak.Merge()([output_node1, output_node2]) output_node = ak.RegressionHead()(output_node) with pytest.raises(ValueError) as info: ak.GraphAutoModel(input_node1, output_node, directory=tmp_dir) assert str(info.value).startswith('A required input is missing for HyperModel')
def functional_api(): (x_train, y_train), (x_test, y_test) = mnist.load_data() input_node = ak.ImageInput() output_node = input_node output_node = ak.Normalization()(output_node) output_node = ak.ConvBlock()(output_node) output_node = ak.SpatialReduction()(output_node) output_node = ak.DenseBlock()(output_node) output_node = ak.ClassificationHead()(output_node) clf = ak.GraphAutoModel(input_node, output_node, seed=5, max_trials=3) clf.fit(x_train, y_train, validation_split=0.2) return clf.evaluate(x_test, y_test)
def test_input_output_disconnect(tmp_dir): input_node1 = ak.Input() output_node = input_node1 _ = ak.DenseBlock()(output_node) input_node = ak.Input() output_node = input_node output_node = ak.DenseBlock()(output_node) output_node = ak.RegressionHead()(output_node) with pytest.raises(ValueError) as info: ak.GraphAutoModel(input_node1, output_node, directory=tmp_dir) assert str(info.value) == 'Inputs and outputs not connected.'
def test_hyper_graph_cycle(tmp_dir): input_node1 = ak.Input() input_node2 = ak.Input() output_node1 = ak.DenseBlock()(input_node1) output_node2 = ak.DenseBlock()(input_node2) output_node = ak.Merge()([output_node1, output_node2]) head = ak.RegressionHead() output_node = head(output_node) head.outputs = output_node1 with pytest.raises(ValueError) as info: ak.GraphAutoModel([input_node1, input_node2], output_node, directory=tmp_dir) assert str(info.value) == 'The network has a cycle.'
def test_auto_model_basic(tmp_dir): x_train = np.random.rand(100, 32) y_train = np.random.rand(100) input_node = ak.Input() output_node = input_node output_node = ak.DenseBlock()(output_node) output_node = ak.RegressionHead()(output_node) auto_model = ak.GraphAutoModel(input_node, output_node, directory=tmp_dir) ak.const.Constant.NUM_TRAILS = 2 auto_model.fit(x_train, y_train, epochs=2) result = auto_model.predict(x_train) assert result.shape == (100, 1)
def test_input_missing(tmp_dir): input_node1 = ak.Input() input_node2 = ak.Input() output_node1 = ak.DenseBlock()(input_node1) output_node2 = ak.DenseBlock()(input_node2) output_node = ak.Merge()([output_node1, output_node2]) output_node = ak.RegressionHead()(output_node) input_node1.shape = (32,) input_node2.shape = (32,) output_node[0].shape = (1,) with pytest.raises(ValueError) as info: graph = ak.GraphAutoModel(input_node1, output_node, directory=tmp_dir) graph.build(kerastuner.HyperParameters()) assert str(info.value).startswith('A required input is missing for HyperModel')
def test_graph_auto_model_basic(tmp_dir): x_train = np.random.rand(100, 32) y_train = np.random.rand(100) input_node = ak.Input() output_node = input_node output_node = ak.DenseBlock()(output_node) output_node = ak.RegressionHead()(output_node) graph = ak.GraphAutoModel(input_node, output_node, directory=tmp_dir, max_trials=1) graph.fit(x_train, y_train, epochs=1, validation_data=(x_train, y_train)) result = graph.predict(x_train) assert result.shape == (100, 1)
def test_input_output_disconnect(tmp_dir): input_node1 = ak.Input() output_node = input_node1 _ = ak.DenseBlock()(output_node) input_node = ak.Input() output_node = input_node output_node = ak.DenseBlock()(output_node) output_node = ak.RegressionHead()(output_node) input_node.shape = (32, ) output_node[0].shape = (1, ) with pytest.raises(ValueError) as info: graph = ak.GraphAutoModel(input_node1, output_node, directory=tmp_dir) graph.build(kerastuner.HyperParameters()) assert str(info.value) == 'Inputs and outputs not connected.'
def test_evaluate(tmp_dir): x_train = np.random.rand(100, 32) y_train = np.random.rand(100, 1) input_node = ak.Input() output_node = input_node output_node = ak.DenseBlock()(output_node) output_node = ak.RegressionHead()(output_node) auto_model = ak.GraphAutoModel(input_node, output_node, directory=tmp_dir, max_trials=1) auto_model.fit(x_train, y_train, epochs=1, validation_data=(x_train, y_train)) auto_model.evaluate(x_train, y_train)
def test_resnet_block(_, tmp_dir): x_train = np.random.rand(100, 32, 32, 3) y_train = np.random.randint(10, size=100) y_train = tf.keras.utils.to_categorical(y_train) input_node = ak.Input() output_node = input_node output_node = ak.ResNetBlock()(output_node) output_node = ak.ClassificationHead()(output_node) graph = ak.GraphAutoModel(input_node, output_node, directory=tmp_dir, max_trials=1) graph.fit(x_train, y_train, epochs=1, batch_size=100, verbose=False, validation_split=0.2)
def test_hyper_graph_basic(tmp_dir): x_train = np.random.rand(100, 32) y_train = np.random.rand(100) input_node = ak.Input() output_node = input_node output_node = ak.DenseBlock()(output_node) output_node = ak.RegressionHead()(output_node) input_node.shape = (32,) output_node[0].shape = (1,) graph = ak.GraphAutoModel(input_node, output_node, directory=tmp_dir) model = graph.build(kerastuner.HyperParameters()) model.fit(x_train, y_train, epochs=1, batch_size=100, verbose=False) result = model.predict(x_train) assert result.shape == (100, 1)
def test_xception_block(tmp_dir): x_train = np.random.rand(100, 32, 32, 3) y_train = np.random.randint(10, size=100) y_train = tf.keras.utils.to_categorical(y_train) input_node = ak.Input() output_node = input_node output_node = ak.XceptionBlock()(output_node) output_node = ak.ClassificationHead()(output_node) input_node.shape = (32, 32, 3) output_node[0].shape = (10, ) graph = ak.GraphAutoModel(input_node, output_node, directory=tmp_dir) model = graph.build(kerastuner.HyperParameters()) model.fit(x_train, y_train, epochs=1, batch_size=100, verbose=False) result = model.predict(x_train) assert result.shape == (100, 10)
def test_merge(tmp_dir): x_train = np.random.rand(100, 32) y_train = np.random.rand(100) input_node1 = ak.Input() input_node2 = ak.Input() output_node1 = ak.DenseBlock()(input_node1) output_node2 = ak.DenseBlock()(input_node2) output_node = ak.Merge()([output_node1, output_node2]) output_node = ak.RegressionHead()(output_node) graph = ak.GraphAutoModel([input_node1, input_node2], output_node, directory=tmp_dir, max_trials=1) graph.fit([x_train, x_train], y_train, epochs=1, batch_size=100, verbose=False) result = graph.predict([x_train, x_train]) assert result.shape == (100, 1)
def test_hyper_graph_cycle(tmp_dir): input_node1 = ak.Input() input_node2 = ak.Input() output_node1 = ak.DenseBlock()(input_node1) output_node2 = ak.DenseBlock()(input_node2) output_node = ak.Merge()([output_node1, output_node2]) head = ak.RegressionHead() output_node = head(output_node) head.outputs = output_node1 input_node1.shape = (32,) input_node2.shape = (32,) output_node[0].shape = (1,) with pytest.raises(ValueError) as info: graph = ak.GraphAutoModel([input_node1, input_node2], output_node, directory=tmp_dir) graph.build(kerastuner.HyperParameters()) assert str(info.value) == 'The network has a cycle.'
def test_lgbm_regressor(tmp_dir): x_train = np.random.rand(11, 32) y_train = np.array([1.1, 2.1, 4.2, 0.3, 2.4, 8.5, 7.3, 8.4, 9.4, 4.3]) input_node = ak.Input() output_node = input_node output_node = preprocessor.LightGBMRegressor()(output_node) output_node = block.IdentityBlock()(output_node) output_node = head.EmptyHead(loss='mean_squared_error', metrics=['mean_squared_error'])(output_node) auto_model = ak.GraphAutoModel(input_node, output_node, directory=tmp_dir, max_trials=1) auto_model.fit(x_train, y_train, epochs=1, validation_data=(x_train, y_train)) result = auto_model.predict(x_train) auto_model.tuner.get_best_models()[0].summary() assert result.shape == (11, 1)
def functional_api(): max_features = 20000 max_words = 400 (x_train, y_train), (x_test, y_test) = tf.keras.datasets.imdb.load_data( num_words=max_features, index_from=3) x_train = tf.keras.preprocessing.sequence.pad_sequences(x_train, maxlen=max_words) x_test = tf.keras.preprocessing.sequence.pad_sequences(x_test, maxlen=max_words) print(x_train.dtype) print(x_train[:10]) input_node = ak.Input() output_node = input_node output_node = ak.EmbeddingBlock(max_features=max_features)(output_node) output_node = ak.ConvBlock()(output_node) output_node = ak.SpatialReduction()(output_node) output_node = ak.DenseBlock()(output_node) output_node = ak.ClassificationHead()(output_node) clf = ak.GraphAutoModel(input_node, output_node, seed=5, max_trials=3) clf.fit(x_train, y_train, validation_split=0.2) return clf.evaluate(x_test, y_test)
def test_evaluate(graph, tuner, tmp_dir): mc = graph.return_value mc.preprocess.return_value = (mock.Mock(), mock.Mock()) x_train = np.random.rand(100, 32) y_train = np.random.rand(100, 1) input_node = ak.Input() output_node = input_node output_node = ak.DenseBlock()(output_node) output_node = ak.RegressionHead()(output_node) auto_model = ak.GraphAutoModel(input_node, output_node, directory=tmp_dir, max_trials=1) auto_model.fit(x_train, y_train, epochs=1, validation_data=(x_train, y_train)) auto_model.evaluate(x_train, y_train) assert tuner.called assert graph.called
def test_structured_data_input(tmp_dir): num_data = 500 data = common.structured_data(num_data) x_train = data y = np.random.randint(0, 3, num_data) y_train = y input_node = ak.StructuredDataInput( column_names=common.COLUMN_NAMES_FROM_NUMPY, column_types=common.COLUMN_TYPES_FROM_NUMPY) output_node = input_node output_node = ak.StructuredDataBlock()(output_node) output_node = ak.ClassificationHead(loss='categorical_crossentropy', metrics=['accuracy'])(output_node) auto_model = ak.GraphAutoModel(input_node, output_node, directory=tmp_dir, max_trials=1) auto_model.fit(x_train, y_train, epochs=1, validation_data=(x_train, y_train)) auto_model.predict(x_train)
def test_conv_block(tmp_dir): x_train = np.random.rand(100, 3, 3, 3) y_train = np.random.randint(10, size=100) y_train = tf.keras.utils.to_categorical(y_train) input_node = ak.Input() output_node = input_node output_node = ak.ConvBlock()(output_node) output_node = ak.ClassificationHead()(output_node) input_node.shape = (3, 3, 3) output_node[0].shape = (10,) graph = ak.GraphAutoModel(input_node, output_node, directory=tmp_dir, max_trials=1) graph.fit(x_train, y_train, epochs=1, batch_size=100, verbose=False, validation_split=0.2) result = graph.predict(x_train) assert result.shape == (100, 10)
y_test = y_test[:data_slice] x_image = x_train.reshape(x_train.shape + (1,)) x_test = x_test.reshape(x_test.shape + (1,)) x_structured = np.random.rand(x_train.shape[0], 100) y_regression = np.random.rand(x_train.shape[0], 1) y_classification = y_classification.reshape(-1, 1) # Build model and train. inputs = ak.ImageInput(shape=(28, 28, 1)) outputs1 = ak.ResNetBlock(version='next')(inputs) outputs2 = ak.XceptionBlock()(inputs) image_outputs = ak.Merge()((outputs1, outputs2)) structured_inputs = ak.StructuredDataInput() structured_outputs = ak.DenseBlock()(structured_inputs) merged_outputs = ak.Merge()((structured_outputs, image_outputs)) classification_outputs = ak.ClassificationHead()(merged_outputs) regression_outputs = ak.RegressionHead()(merged_outputs) automodel = ak.GraphAutoModel(inputs=[inputs, structured_inputs], outputs=[regression_outputs, classification_outputs]) automodel.fit((x_image, x_structured), (y_regression, y_classification), # trials=100, validation_split=0.2, epochs=200, callbacks=[tf.keras.callbacks.EarlyStopping()])
# Simple (x_train, y_train), (x_test, y_test) = tf.keras.datasets.mnist.load_data() auto_pipeline = ak.ImageClassifier(shape, num_classes) # Loss, optimizer are picked automatically auto_pipeline.fit(x_train, y_train) # The predict function should output the labels instead of numerical vectors. auto_pipeline.predict(x_test) # Intermediate inputs = ak.ImageInput(shape=...) x = ak.ImageBlock(inputs) head = ak.ClassificationHead(num_classes, metrics=['accuracy']) outputs = head(x) automodel = ak.GraphAutoModel(inputs=inputs, outputs=outputs) # Loss, optimizer are picked automatically automodel.fit(x_train, y_train) # Advanced inputs = ak.ImageInput(shape=...) outputs1 = ak.ResNetBlock()(inputs) outputs2 = ak.XceptionBlock()(inputs) outputs = ak.Merge()((outputs1, outputs2)) outputs = ak.ClassificationHead(num_classes)(outputs) automodel = ak.GraphAutoModel(inputs=inputs, outputs=outputs) learning_rate = 1.0 automodel.compile(optimizer=tf.keras.optimizers.Adam(learning_rate),
# Prepare the data. (x_train, y_classification), (x_test, y_test) = mnist.load_data() x_image = x_train.reshape(x_train.shape + (1,)) x_test = x_test.reshape(x_test.shape + (1,)) x_structured = np.random.rand(x_train.shape[0], 100) y_regression = np.random.rand(x_train.shape[0], 1) # Build model and train. inputs = ak.ImageInput(shape=(28, 28, 1)) outputs1 = ak.ResNetBlock(version='next')(inputs) outputs2 = ak.XceptionBlock()(inputs) image_outputs = ak.Merge()((outputs1, outputs2)) structured_inputs = ak.StructuredInput() structured_outputs = ak.DenseBlock()(structured_inputs) merged_outputs = ak.Merge()((image_outputs, structured_outputs)) classification_outputs = ak.ClassificationHead()(merged_outputs) regression_outputs = ak.RegressionHead()(merged_outputs) automodel = ak.GraphAutoModel(inputs=inputs, outputs=[regression_outputs, classification_outputs]) automodel.fit((x_image, x_structured), (y_regression, y_classification), trials=100, epochs=200, callbacks=[tf.keras.callbacks.EarlyStopping(), tf.keras.callbacks.LearningRateScheduler()])