混合训练神经网络 - 遗传算法
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 也是如此。我将构建一个所有权重都是随机的版本,但这段代码是一个好的开始。
我有两个 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 也是如此。我将构建一个所有权重都是随机的版本,但这段代码是一个好的开始。