![](/img/trans.png)
[英]Modifying the weights and biases of a restored CNN model in TensorFlow
[英]Tensorflow - Averaging model weights from restored models
鉴于我在相同的数据上训练了几个不同的模型,并且我训练的所有神经网络都具有相同的架构,我想知道是否有可能恢复这些模型,平均它们的权重并使用平均值初始化我的权重。
这是图表外观的示例。 基本上我需要的是我要加载的重量的平均值。
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)
首先,我假设模型结构完全相同(相同的层数,相同的节点/层数)。 如果不是,您将在映射变量时遇到问题(一个模型中会有变量,而另一个模型中没有。
你想要做的是有3个会话。 从检查点加载的前 2 个,最后一个将保持平均值。 您希望这样做是因为每个会话都将包含变量值的一个版本。
加载模型后,使用tf.trainable_variables()
获取模型中所有变量的列表。 您可以将其传递给sess.run
以将变量作为 numpy 数组获取。 计算平均值后,使用 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, tf.reduce_mean([val1,val2], axis=0)))
session3.run(all_assign)
# Do whatever you want with session 3.
您可以使用tf.train.list_variables
和tf.train.load_checkpoint
以非常通用的方式为任何检查点、任何模型实现这tf.train.load_checkpoint
。
您可以在此处找到示例。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.