Skip to content

Commit

Permalink
Distance (#4)
Browse files Browse the repository at this point in the history
* deleted redundant graph test

* edit_distance implemented
  • Loading branch information
haifeng-jin committed Mar 17, 2018
1 parent 3e727a2 commit 1cc1d6b
Show file tree
Hide file tree
Showing 3 changed files with 39 additions and 53 deletions.
53 changes: 38 additions & 15 deletions autokeras/bayesian.py
@@ -1,26 +1,49 @@
import math
import numpy as np
from scipy.linalg import cholesky, cho_solve
from scipy.optimize import linear_sum_assignment


def edit_distance(x, y):
ret = 0
ret += abs(x.n_conv - y.n_conv)
ret += abs(x.n_dense - y.n_dense)
def layer_distance(a, b):
return abs(a - b) * 1.0 / max(a, b)


def layers_distance(list_a, list_b):
len_a = len(list_a)
len_b = len(list_b)
f = np.zeros((len_a + 1, len_b + 1))
f[-1][-1] = 0
for i in range(-1, len_a):
f[i][-1] = i + 1
for j in range(-1, len_b):
f[-1][j] = j + 1
for i in range(len_a):
for j in range(len_b):
f[i][j] = min(f[i][j - 1] + 1, f[i - 1][j] + 1, f[i - 1][j - 1] + layer_distance(list_a[i], list_b[j]))
return f[len_a][len_b]

for i in range(min(x.n_conv, y.n_conv)):
a = x.conv_widths[i]
b = y.conv_widths[i]
ret += abs(a - b) / max(a, b)

for i in range(min(x.n_dense, y.n_dense)):
a = x.dense_widths[i]
b = y.dense_widths[i]
ret += abs(a - b) / max(a, b)
def skip_connection_distance(a, b):
if a[2] != b[2]:
return 1.0
len_a = abs(a[1] - a[0])
len_b = abs(b[1] - b[0])
return abs(a[0] - b[0]) + abs(len_a - len_b)

for connection in x.skip_connections:
if connection not in y.skip_connections:
ret += 1

def skip_connections_distance(list_a, list_b):
distance_matrix = np.zeros((len(list_a), len(list_b)))
for i, a in enumerate(list_a):
for j, b in enumerate(list_b):
distance_matrix[i][j] = skip_connection_distance(a, b)
return distance_matrix[linear_sum_assignment(distance_matrix)].sum() + abs(len(list_a) - len(list_b))


def edit_distance(x, y):
ret = 0
ret += layers_distance(x.conv_widths, y.conv_widths)
ret += layers_distance(x.dense_widths, y.dense_widths)
ret += skip_connections_distance(x.skip_connections, y.skip_connections)
return ret


Expand Down
2 changes: 1 addition & 1 deletion tests/test_bayesian.py
Expand Up @@ -6,7 +6,7 @@
def test_edit_distance():
descriptor1 = Graph(get_add_skip_model()).extract_descriptor()
descriptor2 = Graph(get_concat_skip_model()).extract_descriptor()
assert edit_distance(descriptor1, descriptor2) == 3
assert edit_distance(descriptor1, descriptor2) == 2.0


def test_gpr():
Expand Down
37 changes: 0 additions & 37 deletions tests/test_graph.py
Expand Up @@ -98,19 +98,6 @@ def test_dense_wider():
assert np.sum(np.abs(output1 - output2)) < 1e-4


def test_skip_add():
model = get_conv_model()
graph = NetworkMorphismGraph(model)
graph.to_add_skip_model(graph.layer_to_id[model.layers[1]], graph.layer_to_id[model.layers[4]])
new_model = graph.produce_model()
input_data = get_conv_data()

output1 = model.predict_on_batch(input_data).flatten()
output2 = new_model.predict_on_batch(input_data).flatten()

assert np.array_equal(output1, output2)


def test_skip_add_over_pooling_stub():
model = to_stub_model(get_pooling_model())
graph = Graph(model)
Expand All @@ -133,19 +120,6 @@ def test_skip_add_over_pooling():
assert np.array_equal(output1, output2)


def test_skip_concatenate():
model = get_add_skip_model()
graph = NetworkMorphismGraph(model)
graph.to_concat_skip_model(graph.layer_to_id[model.layers[4]], graph.layer_to_id[model.layers[4]])
new_model = graph.produce_model()
input_data = get_conv_data()

output1 = model.predict_on_batch(input_data).flatten()
output2 = new_model.predict_on_batch(input_data).flatten()

assert np.sum(np.abs(output1 - output2)) < 3e-1


def test_skip_concat_over_pooling_stub():
model = to_stub_model(get_pooling_model())
graph = Graph(model)
Expand All @@ -170,17 +144,6 @@ def test_skip_concat_over_pooling():
assert np.sum(np.abs(output1 - output2)) < 4e-1


def test_copy_model():
model = get_add_skip_model()
new_model = NetworkMorphismGraph(model).produce_model()
input_data = get_conv_data()

output1 = model.predict_on_batch(input_data).flatten()
output2 = new_model.predict_on_batch(input_data).flatten()

assert np.sum(output1 - output2) == 0


def test_extract_descriptor_add():
model = get_add_skip_model()
descriptor = Graph(model).extract_descriptor()
Expand Down

0 comments on commit 1cc1d6b

Please sign in to comment.