In [1]:
import numpy as np
from keras.models import Model
from keras.layers import Input, Dense, RepeatVector
from keras.layers.merge import Add, Subtract, Multiply, Average, Maximum, Minimum, Concatenate, Dot
from keras import backend as K
import json
from collections import OrderedDict


Using TensorFlow backend.

In [2]:
def format_decimal(arr, places=6):
    return [round(x * 10**places) / 10**places for x in arr]

In [3]:
DATA = OrderedDict()

[merge.Average.0]


In [4]:
random_seed = 100
data_in_shape = (6,)

layer_0 = Input(shape=data_in_shape)
layer_1a = Dense(2, activation='linear')(layer_0)
layer_1b = Dense(2, activation='linear')(layer_0)
layer_2 = Average()([layer_1a, layer_1b])
model = Model(inputs=layer_0, outputs=layer_2)

np.random.seed(random_seed)
data_in = np.expand_dims(2 * np.random.random(data_in_shape) - 1, axis=0)

# set weights to random (use seed for reproducibility)
weights = []
for i, w in enumerate(model.get_weights()):
    np.random.seed(random_seed + i)
    weights.append(2 * np.random.random(w.shape) - 1)
model.set_weights(weights)

result = model.predict(data_in)
data_out_shape = result[0].shape
data_in_formatted = format_decimal(data_in.ravel().tolist())
data_out_formatted = format_decimal(result[0].ravel().tolist())

DATA['merge.Average.0'] = {
    'input': {'data': data_in_formatted, 'shape': data_in_shape},
    'weights': [{'data': format_decimal(w.ravel().tolist()), 'shape': w.shape} for w in weights],
    'expected': {'data': data_out_formatted, 'shape': data_out_shape}
}

[merge.Average.1]


In [5]:
random_seed = 100
data_in_shape = (6,)

layer_0 = Input(shape=data_in_shape)
layer_1a = Dense(2, activation='linear')(layer_0)
layer_1b = Dense(2, activation='linear')(layer_0)
layer_1c = Dense(2, activation='linear')(layer_0)
layer_2 = Average()([layer_1a, layer_1b, layer_1c])
model = Model(inputs=layer_0, outputs=layer_2)

np.random.seed(random_seed)
data_in = np.expand_dims(2 * np.random.random(data_in_shape) - 1, axis=0)

# set weights to random (use seed for reproducibility)
weights = []
for i, w in enumerate(model.get_weights()):
    np.random.seed(random_seed + i)
    weights.append(2 * np.random.random(w.shape) - 1)
model.set_weights(weights)

result = model.predict(data_in)
data_out_shape = result[0].shape
data_in_formatted = format_decimal(data_in.ravel().tolist())
data_out_formatted = format_decimal(result[0].ravel().tolist())

DATA['merge.Average.1'] = {
    'input': {'data': data_in_formatted, 'shape': data_in_shape},
    'weights': [{'data': format_decimal(w.ravel().tolist()), 'shape': w.shape} for w in weights],
    'expected': {'data': data_out_formatted, 'shape': data_out_shape}
}

[merge.Average.2]


In [6]:
random_seed = 100
data_in_shape = (6,)

layer_0 = Input(shape=data_in_shape)
layer_1a = Dense(2, activation='linear')(layer_0)
layer_1b = Dense(2, activation='linear')(layer_0)
layer_1c = Dense(2, activation='linear')(layer_0)
layer_1d = Dense(2, activation='linear')(layer_0)
layer_2 = Average()([layer_1a, layer_1b, layer_1c, layer_1d])
model = Model(inputs=layer_0, outputs=layer_2)

np.random.seed(random_seed)
data_in = np.expand_dims(2 * np.random.random(data_in_shape) - 1, axis=0)

# set weights to random (use seed for reproducibility)
weights = []
for i, w in enumerate(model.get_weights()):
    np.random.seed(random_seed + i)
    weights.append(2 * np.random.random(w.shape) - 1)
model.set_weights(weights)

result = model.predict(data_in)
data_out_shape = result[0].shape
data_in_formatted = format_decimal(data_in.ravel().tolist())
data_out_formatted = format_decimal(result[0].ravel().tolist())

DATA['merge.Average.2'] = {
    'input': {'data': data_in_formatted, 'shape': data_in_shape},
    'weights': [{'data': format_decimal(w.ravel().tolist()), 'shape': w.shape} for w in weights],
    'expected': {'data': data_out_formatted, 'shape': data_out_shape}
}

export for Keras.js tests


In [7]:
import os

filename = '../../../test/data/layers/merge/Average.json'
if not os.path.exists(os.path.dirname(filename)):
    os.makedirs(os.path.dirname(filename))
with open(filename, 'w') as f:
    json.dump(DATA, f)

In [8]:
print(json.dumps(DATA))


{"merge.Average.0": {"input": {"data": [0.08681, -0.443261, -0.150965, 0.689552, -0.990562, -0.756862], "shape": [6]}, "weights": [{"data": [0.08681, -0.443261, -0.150965, 0.689552, -0.990562, -0.756862, 0.341498, 0.651706, -0.726587, 0.150187, 0.782644, -0.581596], "shape": [6, 2]}, {"data": [0.032797, 0.141335], "shape": [2]}, {"data": [0.195363, 0.351974, -0.401437, 0.461481, 0.157479, 0.618035, -0.665503, -0.37571, -0.284137, -0.016505, -0.019604, 0.78882], "shape": [6, 2]}, {"data": [-0.135778, -0.651569], "shape": [2]}], "expected": {"data": [0.246195, -0.553178], "shape": [2]}}, "merge.Average.1": {"input": {"data": [0.08681, -0.443261, -0.150965, 0.689552, -0.990562, -0.756862], "shape": [6]}, "weights": [{"data": [0.08681, -0.443261, -0.150965, 0.689552, -0.990562, -0.756862, 0.341498, 0.651706, -0.726587, 0.150187, 0.782644, -0.581596], "shape": [6, 2]}, {"data": [0.032797, 0.141335], "shape": [2]}, {"data": [0.195363, 0.351974, -0.401437, 0.461481, 0.157479, 0.618035, -0.665503, -0.37571, -0.284137, -0.016505, -0.019604, 0.78882], "shape": [6, 2]}, {"data": [-0.135778, -0.651569], "shape": [2]}, {"data": [-0.704159, -0.543403, 0.614987, -0.403051, -0.628587, 0.544275, -0.189121, 0.991809, -0.028349, 0.30284, 0.201092, -0.953154], "shape": [6, 2]}, {"data": [-0.83252, -0.332987], "shape": [2]}], "expected": {"data": [-0.27783, -0.094899], "shape": [2]}}, "merge.Average.2": {"input": {"data": [0.08681, -0.443261, -0.150965, 0.689552, -0.990562, -0.756862], "shape": [6]}, "weights": [{"data": [0.08681, -0.443261, -0.150965, 0.689552, -0.990562, -0.756862, 0.341498, 0.651706, -0.726587, 0.150187, 0.782644, -0.581596], "shape": [6, 2]}, {"data": [0.032797, 0.141335], "shape": [2]}, {"data": [0.195363, 0.351974, -0.401437, 0.461481, 0.157479, 0.618035, -0.665503, -0.37571, -0.284137, -0.016505, -0.019604, 0.78882], "shape": [6, 2]}, {"data": [-0.135778, -0.651569], "shape": [2]}, {"data": [-0.704159, -0.543403, 0.614987, -0.403051, -0.628587, 0.544275, -0.189121, 0.991809, -0.028349, 0.30284, 0.201092, -0.953154], "shape": [6, 2]}, {"data": [-0.83252, -0.332987], "shape": [2]}, {"data": [-0.98287, 0.908613, -0.10087, 0.220438, 0.70412, 0.47762, 0.948863, 0.714924, 0.710821, 0.719052, -0.295442, -0.575936], "shape": [6, 2]}, {"data": [-0.67459, 0.509562], "shape": [2]}], "expected": {"data": [-0.3703, 0.087635], "shape": [2]}}}