1
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。如何才能做到这一点?

4

2 回答 2

3

这里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)
于 2020-06-16T12:12:07.570 回答
1

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

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

文档在这里

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

trainable_weights = []

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

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

于 2020-06-17T00:19:01.060 回答