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

问题描述 投票:1回答:1

我有两个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中实现这一点的明确方法。我正在寻找有关如何构建一个新模型的见解,该模型包含模型1和模型2的权重和偏差的随机~50 / 50分割。有关如何实现这一目标的任何想法?

tensorflow keras neural-network genetic-algorithm
1个回答
0
投票

Aight,经过一个星期的撞击桌子后,我终于意识到我正在做多少事情。这是我为解决这个问题所做的功能,它简直令人难以置信。

#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也是如此。我将构建一个所有权重随机化的版本,但这个代码是一个好的开始。

© www.soinside.com 2019 - 2024. All rights reserved.