我有两个具有相同架构但使用不同损失函数训练的模型。
这些模型给出了不同的结果。我想通过线性组合它们的权重来在这些模型之间「平衡」:
combined_weights = k * weights_a + (1 - k) * weights_b
我正在处理的问题允许这种方法。有人认为这种方法比插值输出更有效。
我还有一种PyTorch实现的这种方法:
k = 0.3model_a = torch.load(...)model_b = torch.load(...)combined_model = OrderedDict()for i, v_a in model_a.items(): v_b = model_b[i] combined_model[i] = k * v_a + (1 - k) * v_btorch.save(combined_model, ...)
我在TensorFlow中如何实现同样的功能?我尝试通过组合模型的权重来实现:
k = 0.3weights_a = model_a.get_weights()weights_b = model_b.get_weights()combined_weights = k * weights_a + (1 - k) * weights_bcombined_model.set_weights(combined_weights)
但在k * weights_a
处得到了一个错误:
can't multiply sequence by non-int of type 'float'
那么,我该如何实现呢?
回答:
这是因为类型不匹配。 weights_a
和 weights_b
只是普通的Python列表,不能被浮点数相乘(这不是你想要的操作)。
权重是以ndarray
格式存储在这些列表中的元素。可能最简单的方法是遍历权重,并对每个ndarray
执行操作
k = 0.3weights_a = ...weights_b = ...combined = []for i in range(len(weights_a)): c = k * weights_a[i] + (1 - k) * weights_b[i] combined.append(c)