我无法适应现有的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)
到目前为止,我无法解决此问题。 这是与模型未正确编译有关的问题,还是由于我传递数据的方式?
在解决此问题方面的任何帮助将不胜感激,谢谢!
答案 0 :(得分:1)
样本批次应该可以传递给tff.learning.Model.forward_pass的batch_input
参数。
对于包装好的Keras模型,这必须是字典,其键与tf.keras.models.Model.test_on_batch的参数相匹配。
对于这种情况,我认为您可以使用单个x
键将样本批次包装到字典中:
numpy_sample_batch = train // numpy.ndarray
sample_batch = {'x': numpy_sample_batch}