Смешение обученных нейронных сетей - генетический алгоритм - PullRequest
1 голос
/ 05 марта 2019

У меня есть две модели Keras, назовем их model1 и model2. Обе модели представляют собой простой персептрон. Вот код для настройки model1; модель2 идентична.

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 , х4 ...]

Я рассмотрел слияние слоев Keras, но не вижу четкого способа сделать это в API. Я ищу понимание того, как построить новую модель, которая состоит из случайного ~ 50/50 разделения весов и смещений модели1 и модели2. Есть идеи, как этого добиться?

1 Ответ

0 голосов
/ 15 марта 2019

Ладно, после еще одной недели, когда я бился головой о стол, я, наконец, осознал, какой я глупец. Вот функция, которую я сделал, чтобы решить эту проблему, и это невероятно просто.

#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)

Обратите внимание, это фактически рандомизирует вес каждого нейрона как группы. Таким образом, нейрон 1 с его 40 весами перемещается как одна группа в новую модель, как и нейроны со 2 по 784. Я буду строить версию, в которой все веса рандомизированы, но этот код - хорошее начало.

...