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

时间:2019-03-05 19:47:58

标签: tensorflow keras neural-network genetic-algorithm

我有两个Keras模型,我们称它们为model1和model2。两种模型都是一个简单的感知器。这是设置模型1的代码; 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'])

我想在训练它们后将这两个模型混合使用,以使得到的模型是对model1和model2的权重和偏差的随机采样。因此,例如,如果权重由[x1,x2,x3,x4 ...]和[y1,y2,y3.y4 ...]表示,则结果将是[x1,y2,y3 ,x4 ...]

我已经研究了Keras的合并层,但是在API中看不到实现此目的的明确方法。我正在寻找关于如何建立一个新模型的见识,该模型包括对model1和model2的权重和偏差的随机〜50/50拆分。关于如何实现此目标的任何想法?

1 个答案:

答案 0 :(得分:0)

好吧,在又一个星期在桌子上殴打我的头之后,我终于意识到自己有多沉迷。这是我用来解决此问题的函数,它是如此的简单。

#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都作为一个组移动到新模型中。我将构建一个将所有权重都随机化的版本,但这是一个很好的开始。