【问题标题】:TensorFlow Federated - Adapting existing keras modelTensorFlow Federated - 适应现有的 keras 模型
【发布时间】:2019-04-18 17:05:14
【问题描述】:

我无法调整现有的 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 形状(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

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

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

【问题讨论】:

  • @Zaher88abd 感谢您的评论,我有什么办法可以调整它以使用 numpy 数组?

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


【解决方案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}

【讨论】:

  • 感谢您的评论,这似乎解决了问题,但引发了以下问题:InvalidArgumentError: You must feed a value for placeholder tensor 'conv1d_68_target' with dtype float and shape [?,?,?] [[{{node conv1d_68_target}}]]您能建议如何解决这个问题吗?
  • 如果无法重现(需要完整的堆栈跟踪、python 代码和数据集),这有点难以分辨。几乎看起来 Keras 模型的定义方式会导致尺寸不匹配。如果移除所有 TFF 包装,Keras 模型是否按预期工作?
  • 感谢您的帮助,有什么方法可以与您共享 Jupyter 笔记本吗?
  • 我首先测试 Keras 模型是否按预期设置(没有任何 TFF)。一种方法是在create_compiled_keras_model() 返回的对象上尝试model.fit(dataset)。如果这不起作用,我会使用 tensorflow 或 keras 标签发布堆栈溢出问题。如果这确实有效,我会用最少的代码集为 tensorflow-federated 标签打开一个新问题,以重现错误。共享笔记本会使以后遇到类似问题的其他人更难找到解决方案,因此我鼓励使用 SO。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-04-24
  • 2021-11-03
  • 2021-12-21
  • 1970-01-01
  • 2019-09-27
  • 1970-01-01
  • 2020-01-06
相关资源
最近更新 更多