Tensorflow - Усреднение весов моделей из восстановленных моделей - PullRequest
0 голосов
/ 16 мая 2018

Учитывая, что я обучил несколько разных моделей на одних и тех же данных, и все обученные нейронные сети имеют одинаковую архитектуру, я хотел бы знать, возможно ли восстановить эти модели, усреднить их веса и инициализировать мои веса, используя среднее значение.

Это пример того, как может выглядеть график.В основном мне нужно среднее значение весов, которые я собираюсь загрузить.

import tensorflow as tf
import numpy as np

#init model1 weights
weights = {
    'w1': tf.Variable(),
    'w2': tf.Variable()
}
# init model1 biases
biases = {
    'b1': tf.Variable(),
    'b2': tf.Variable()
}
#init model2 weights
weights2 = {
    'w1': tf.Variable(),
    'w2': tf.Variable()
}
# init model2 biases
biases2 = {
    'b1': tf.Variable(),
    'b2': tf.Variable(),
}

# this the average I want to create
w = {
    'w1': tf.Variable(
        tf.add(weights["w1"], weights2["w1"])/2
    ),
    'w2': tf.Variable(
        tf.add(weights["w2"], weights2["w2"])/2
    ),
    'w3': tf.Variable(
        tf.add(weights["w3"], weights2["w3"])/2
    )
}
# init biases
b = {
    'b1': tf.Variable(
        tf.add(biases["b1"], biases2["b1"])/2
    ),
    'b2': tf.Variable(
        tf.add(biases["b2"], biases2["b2"])/2
    ),
    'b3': tf.Variable(
        tf.add(biases["b3"], biases2["b3"])/2
    )
}

weights_saver = tf.train.Saver({
    'w1' : weights['w1'],
    'w2' : weights['w2'],
    'b1' : biases['b1'],
    'b2' : biases['b2']
    })
weights_saver2 = tf.train.Saver({
    'w1' : weights2['w1'],
    'w2' : weights2['w2'],
    'b1' : biases2['b1'],
    'b2' : biases2['b2']
    })

И это то, что я хочу получить, когда я запускаю сеанс tf.c содержит веса, которые я хочу использовать, чтобы начать тренировку.

# Create a session for running operations in the Graph.
init_op = tf.global_variables_initializer()
init_op2 = tf.local_variables_initializer()

with tf.Session() as sess:
    coord = tf.train.Coordinator()
    # Initialize the variables (like the epoch counter).
    sess.run(init_op)
    sess.run(init_op2)
    weights_saver.restore(
        sess,
        'my_model1/model_weights.ckpt'
    )
    weights_saver2.restore(
        sess,
        'my_model2/model_weights.ckpt'
    )
    a = sess.run(weights)
    b = sess.run(weights2)
    c = sess.run(w)

1 Ответ

0 голосов
/ 16 мая 2018

Во-первых, я предполагаю, что структура модели точно такая же (одинаковое количество слоев, одинаковое количество узлов / слой).Если это не так, у вас будут проблемы с отображением переменных (в одной модели будут переменные, а в другой нет.

То, что вы хотите сделать, - это 3 сеанса. Первые 2 загружаются из контрольных точек, последняя будетудерживайте среднее значение. Это нужно, потому что каждый сеанс будет содержать версию значений переменных.

После загрузки модели используйте tf.trainable_variables(), чтобы получить список всех переменных в модели. Вы можетепередайте его в sess.run, чтобы получить переменные в виде пустых массивов. После вычисления средних значений используйте tf.assign для создания операций по изменению переменных. Вы также можете использовать список для изменения инициализаторов, но это означает передачу в модель(не всегда вариант).

Примерно:

graph = tf.Graph()
session1 = tf.Session()
session2 = tf.Session()
session3 = tf.Session()

# Omitted code: Restore session1 and session2.
# Optionally initialize session3.

all_vars = tf.trainable_variables()
values1 = session1.run(all_vars)
values2 = session2.run(all_vars)

all_assign = []
for var, val1, val2 in zip(all_vars, values1, values2):
  all_assign.append(tf.assign(var, (val1 + val2)/ 2))

session3.run(all_assign)

# Do whatever you want with session 3.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...