【问题标题】:How to transfer weights from baseline model to federated model?如何将权重从基线模型转移到联合模型?
【发布时间】:2020-06-16 00:00:17
【问题描述】:
def create_keras_model():
model = Sequential([
    Conv2D(16, 3, padding='same', activation='relu'),
    MaxPooling2D(),
    Conv2D(32, 3, padding='same', activation='relu'),
    MaxPooling2D(),
    Conv2D(64, 3, padding='same', activation='relu'),
    MaxPooling2D(),
    Flatten(),
    Dense(512, activation='relu', kernel_regularizer=tf.keras.regularizers.l2(0.001)),
    Dropout(0.5),
    Dense(1, activation='sigmoid')
])

model.load_weights('/content/drive/My Drive/localmodel/weights')
return model

在 Colab 中尝试过类似的操作,但我得到 errno 21,是一个目录。

然后我尝试了另一种方法,如下图,

tff_model = create_keras_model() #now this function doesnt load weights, just returns a Sequential model   
tff.learning.assign_weights_to_keras_model(tff_model, model_with_weights)

就像 assign_weights_to_keras_model() 将权重从 tff_model 转移到 keras 模型一样,我想将权重从 keras 模型转移到 tff_model。如何做到这一点?

【问题讨论】:

  • Re: errno 21model.load_weights 正在调用tf.keras.Model.load_weights(),它似乎指向的路径可能不是由配对的tf.keras.Model.save_weights() 生成的?
  • 并非如此。确定它是正确的道路。
  • 此错误来自 TF 核心内的 Keras 库,与 TFF 无关。在 tensorflow 标记中专门询问有关此错误的问题可能会很好。
  • 好的,我明白了。是的,我已经标记了 tf.让我们充满希望!

标签: tensorflow tensorflow-federated federated-learning


【解决方案1】:

这里model_with_weights必须是代表模型权重的TFF值,例如:

def model_fn():

    keras_model = create_keras_model()

  return tff.learning.from_keras_model(keras_model)

fed_avg = tff.learning.build_federated_averaging_process(model_fn, ...)
state = fed_avg.initialize()
state = fed_avg.next(state, ...)
...
tff.learning.assign_weights_to_keras_model(keras_model, state.model)

【讨论】:

  • 谢谢@Ayness。但是,我想将基线模型的权重分配给 tff 模型,而不是相反。假设我的基线模型给出了 70% 的准确度。我希望我的 tff 模型从那里开始训练。知道怎么做吗?
【解决方案2】:

我刚刚知道如何做到这一点。 这个想法是使用:

tff.learning.state_with_new_model_weights(state, trainable_weights_numpy, non_trainable_weights_numpy)

Documentation here

其中可训练的权重取自基线模型并转换为 numpy 格式。

trainable_weights = []

for weights in baseline_model.trainable_weights:
    trainable_weights.append(weights.numpy())

这在服务器有部分数据而客户端有相似数据时特别有用。可能这可以用于迁移学习。

【讨论】:

  • 应该早点发现这一点——另见answer here,指向相同的解决方案。
  • 感谢您的参考。刚刚看了看。希望我早点看过它。
猜你喜欢
  • 2020-07-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-26
  • 1970-01-01
  • 1970-01-01
  • 2014-01-02
  • 2019-10-26
相关资源
最近更新 更多