我正在尝试训练一个模型,保存下来。 (没问题!) 然后,我想创建一个新模型,与保存的模型相比,该模型多了一层。 (没问题!) 然后,我想将权重从旧模型的通用层转移到新模型。 (没问题!)
最后,我只想训练最新的图层。
问题是,我似乎无法将优化器限制为动态变量列表。我已阅读并尝试了一些程序来使其正常工作。我宁愿不使用占位符,因为它会使以后为模型提供服务变得复杂。但是,我不知道如何将列表更新到模型类,并且在尝试使用张量值进行索引时遇到了问题。
我几乎可以使用的HACK是使用我用tf.assign更新的变量并读取该变量的形状。这里的问题是,不使用validate_shape = False参数就无法更改形状,这似乎阻止了模型在训练期间更新值。
最后一次尝试使用变量的简单整数值tf.gather(),但我没有成功。
有人可以看到我可能做错了什么吗?看起来人们已经成功地使非常相似的事物得以工作。尽管这些示例并非处于类结构中,并且本质上并不是动态的。 “动态”是指需要初始化模型的变量,以便可以权重tf.assign'。然后,将其余变量放置在var_list中。
class MostMinimal():
def __init__(self):
self.inputs = tf.placeholder(shape=[None, 1], dtype=tf.float32, name='num2Double')
self.outputTruths = tf.placeholder(shape=[None, 1], dtype=tf.float32, name='outputTruths')
self.trVarIndex = tf.Variable(initial_value=[], trainable=False, name='varIndex')
self.learningRate = tf.Variable(initial_value=0.01, dtype=tf.float32, trainable=False, name='lr')
self.hidden = tf.keras.layers.Dense(units=10, activation=tf.nn.relu, use_bias=True, name='hide')(inputs=self.inputs)
self.hidden2 = tf.keras.layers.Dense(units=10, activation=tf.nn.relu, use_bias=True, name='hide')(inputs=self.hidden)
self.inferredOutput = tf.keras.layers.Dense(units=1, activation=tf.nn.relu, use_bias=False, name='getOut')(self.hidden2)
self.loss = tf.losses.mean_squared_error(self.outputTruths, self.inferredOutput)
self.optimizer = tf.train.AdamOptimizer(learning_rate=self.learningRate)
self.update_ops = tf.get_collection(tf.GraphKeys.UPDATE_OPS)
with tf.control_dependencies(self.update_ops):
# this works!!!!! var_list=tf.trainable_variables()[2:]
# this kinda works! var_list=tf.trainable_variables()[self.trVarIndex.shape[0]:])
# but tf does not like to receive values of different shapes
# using the Variable does not var_list=tf.trainable_variables()[self.trVarIndex:])
# trying using the shape of some odd tensor passed to the Variable
self.grads = self.optimizer.compute_gradients(loss=self.loss,
var_list=tf.trainable_variables()[self.trVarIndex.shape[0]:])
gradientLists = [(g, v) for g, v in self.grads]
self.train_op = self.optimizer.apply_gradients(gradientLists)
那是模型。如果需要,我可以展示该模型是如何实现的。
keyInputs = np.array([[1], [2], [3], [4], [5], [6], [7], [8], [9], [10]], dtype=np.float32)
truthValues = keyInputs*2
然后,像这样;
tf.reset_default_graph()
tf.set_random_seed(100)
model = MostMinimal(modelName="modelB")
init = tf.global_variables_initializer()
with tf.Session() as sess:
sess.run(init)
sess.run(tf.assign( transfer weights from common layers ))
# somehow update var_list here
loss, opt, out = sess.run(fetches=[model.loss,
model.train_op,
model.inferredOutput],
feed_dict={model.inputs: keyInputs,
model.outputTruths: truthValues})