TensorFlow Federated - адаптация существующей модели керас

У меня проблемы с адаптацией существующей модели Keras для работы с TenforFlow Federated.

Существующая модель представляет собой 1D сверточный автоэнкодер (подробности показаны ниже)

Существующая модель:

input_window = Input(shape=(window_length,1))

x = Conv1D(16, 3, activation="relu", padding="same")(input_window)
x = MaxPooling1D(2, padding="same")(x)
x = Conv1D(1, 3, activation="relu", padding="same")(x)

encoded = MaxPooling1D(2, padding="same")(x)
encoder = Model(input_window, encoded)

x = Conv1D(1, 3, activation="relu", padding="same")(encoded)
x = UpSampling1D(2)(x)
x = Conv1D(16, 1, activation='relu')(x)
x = UpSampling1D(2)(x)

decoded = Conv1D(1, 3, activation='sigmoid', padding='same')(x)

autoencoder = Model(input_window, decoded)

Тренировочные данные передаются как numpy.ndarray формы (102, 48, 1),

Концептуально это представляет данные за 102 дня, каждое из которых содержит 48 значений. Я могу привести пример этого, если это поможет ответить.

Моя попытка конвертировать модель показана ниже.

Конвертированная модель:

def create_compiled_keras_model():

    input_window = tf.keras.layers.Input(shape=(window_length,1))

    x = tf.keras.layers.Conv1D(16, 3, activation="relu", padding="same")(input_window)
    x = tf.keras.layers.MaxPooling1D(2, padding="same")(x)
    x = tf.keras.layers.Conv1D(1, 3, activation="relu", padding="same")(x)

    encoded = tf.keras.layers.MaxPooling1D(2, padding="same")(x)
    encoder = tf.keras.Model(input_window, encoded)

    x = tf.keras.layers.Conv1D(1, 3, activation="relu", padding="same")(encoded)
    x = tf.keras.layers.UpSampling1D(2)(x)
    x = tf.keras.layers.Conv1D(16, 1, activation='relu')(x)
    x = tf.keras.layers.UpSampling1D(2)(x)

    decoded = tf.keras.layers.Conv1D(1, 3, activation='sigmoid', padding='same')(x)

    autoencoder = tf.keras.Model(input_window, decoded)
    autoencoder.compile(optimizer='adam', loss='MSE')
    return autoencoder



sample_batch = train // numpy.ndarray of shape (102, 48, 1)


def model_fn():
    keras_model = create_compiled_keras_model()
    return tff.learning.from_compiled_keras_model(keras_model, train)

Это приводит к ошибке:

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-397-9bed171c79be> in <module>
----> 1 model = model_fn()

<ipython-input-396-13bc1955a7f2> in model_fn()
      1 def model_fn():
      2     keras_model = create_compiled_keras_model()
----> 3     return tff.learning.from_compiled_keras_model(keras_model, train)

~/miniconda3/lib/python3.6/site-packages/tensorflow_federated/python/learning/model_utils.py in from_compiled_keras_model(keras_model, dummy_batch)
    190     raise ValueError('`keras_model` must be compiled. Use from_keras_model() '
    191                      'instead.')
--> 192   return enhance(_TrainableKerasModel(keras_model, dummy_batch))
    193 
    194 

~/miniconda3/lib/python3.6/site-packages/tensorflow_federated/python/learning/model_utils.py in __init__(self, inner_model, dummy_batch)
    434     # until the model has been called on input. The work-around is to call
    435     # Model.test_on_batch() once before asking for metrics.
--> 436     inner_model.test_on_batch(**dummy_batch)
    437     # This must occur after test_on_batch()
    438     if len(inner_model.loss_functions) != 1:

TypeError: test_on_batch() argument after ** must be a mapping, not numpy.ndarray

До сих пор я не смог решить эту проблему. Это проблема, связанная с неправильной компиляцией моей модели или из-за способа передачи данных?

Любая помощь в решении этой проблемы будет принята с благодарностью, спасибо!

1 ответ

Образец партии должен быть чем-то, что можно передать batch_input аргумент tff.learning.Model.forward_pass.

Для обернутых моделей Keras это должен быть дикт с ключами, совпадающими с аргументами tf.keras.models.Model.test_on_batch.

В этом случае, я думаю, что вы можете просто обернуть образец партии в файл с одним ключом x:

numpy_sample_batch = train // numpy.ndarray
sample_batch = {'x': numpy_sample_batch}
Другие вопросы по тегам