混合训练神经网络 - 遗传算法

Mixing Trained Neural Networks - Genetic Algorithm

我有两个 Keras 模型,我们称它们为 model1 和 model2。这两个模型都是一个简单的感知器。这是设置model1的代码; model2 相同。

model1 = keras.Sequential([
    keras.layers.Dense(100, activation=tf.nn.relu),
    keras.layers.Dropout(0.5, noise_shape=None, seed=None),
    keras.layers.Dense(26, activation=tf.nn.softmax)
])

model1.compile(optimizer='sgd', 
               loss='sparse_categorical_crossentropy',
               metrics=['accuracy'])

我想在训练后混合这两个模型,这样生成的模型是模型 1 和模型 2 的权重和偏差的随机采样。因此,例如,如果权重由 [x1,x2,x3,x4...] 和 [y1,y2,y3.y4...] 表示,结果将是 [x1, y2, y3] 的随机组合, x4...]

我研究了 Keras 的合并层,但在 API 中没有看到实现此目的的明确方法。我正在寻找有关如何构建一个新模型的见解,该模型由 model1 和 model2 的权重和偏差的随机 ~50/50 分割组成。关于如何实现这一点有什么想法吗?

好吧,又​​在 table 上敲了一个星期的脑袋,我终于意识到自己是多么的愚蠢。这是我为解决这个问题而创建的功能,它非常简单。

#Initialize and train model1 and model2, they are the inputs to this function.
def mateKerasNN(net1,net2):
    net1weights = net1.get_weights()
    net2weights = net2.get_weights()
    net3weights = net1.get_weights()
    for i in range(len(net1weights)):
        for j in range(len(net1weights[i])):
            net3weights[i][j] = random.choice([net1weights[i][j],net2weights[i][j]])

    return net3weights

model3weights = mateKerasNN(model1,model2)
model3.set_weights(model3weights)

请注意,这实际上将每个神经元的权重随机化为一个组。因此,具有 40 个权重的神经元 1 都作为一组移动到新模型中,神经元 2 到 784 也是如此。我将构建一个所有权重都是随机的版本,但这段代码是一个好的开始。