TensorFlow联合-适应现有的keras模型

时间:2019-04-18 17:05:14

标签: python-3.x tensorflow tensorflow-federated

我无法适应现有的Keras模型与TenforFlow Federated一起使用。

现有模型是一维卷积自动编码器(详细信息如下所示)

现有模型:

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的{​​{1}}的形式传递。

从概念上讲,这表示102天的数据价值,每个数据包含48个值。如果可以帮助回答,我可以提供一个示例。

我尝试转换模型的情况如下所示。

转换后的模型:

(102, 48, 1)

这会产生错误:

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)

到目前为止,我无法解决此问题。 这是与模型未正确编译有关的问题,还是由于我传递数据的方式?

在解决此问题方面的任何帮助将不胜感激,谢谢!

1 个答案:

答案 0 :(得分:1)

样本批次应该可以传递给tff.learning.Model.forward_passbatch_input参数。

对于包装好的Keras模型,这必须是字典,其键与tf.keras.models.Model.test_on_batch的参数相匹配。

对于这种情况,我认为您可以使用单个x键将样本批次包装到字典中:

numpy_sample_batch = train // numpy.ndarray
sample_batch = {'x': numpy_sample_batch}