如何仅在张量流中保存最小结果误差的权重

时间:2018-02-05 14:50:38

标签: python tensorflow

我正在使用Python 3.5和Tensorflow 1.4创建不同类型的神经网络。我使用成本函数来训练/优化这些网。在培训期间,可能会出现由此产生的成本在一个水平上保持一段时间甚至上升但可能在以后减少。所以可能问题是,在我的训练结束时(由固定数量的时期给出),我的模型可能会比训练期间的某些其他点返回更糟糕的结果。

要在培训结束时始终获得最知名的模型权重,我会在培训期间将变量(tf.Saver)保存到文件中,只要成本低于之前的最低成本。

不幸的是,这显着减缓了培训过程。有没有办法将所有模型变量保存到python变量而不是磁盘并稍后恢复它们?我尝试用tf.get_collection(tf.GraphKeys.TRAINABLE_VARIABLES)做到这一点,但我无法弄清楚如何让它们回到我的张量流模型中。

提前致谢!



UPDATE:

我找到了解决方案的一部分。我没有将权重保存为python变量,而是在张量流图中创建备份变量。据我所知,这有一个缺点:当我实现了很多不同的图表时,我必须调整我的解决方案。您可以在下面找到多层感知器的解决方案。但我不知道如何使用tf.contrib.rnn.BasicLSTMCell来做到这一点。所以我希望有一个只保存所有变量的解决方案,让我以后恢复它们。

多层感知器的当前解决方案

# Prepare inputData
[...]

# Placeholder for tensorflow input
X = tf.placeholder("float", [None, len(netInputVariables)])
Y = tf.placeholder("float", [None, len(netOutputVariables)])

# Weights and Biases are stored in a dictionary
Weights = {
    'hidden1': tf.Variable(tf.random_normal([len(netInputVariables), 20])),
    'output': tf.Variable(tf.random_normal([20, len(netOutputVariables)]))
}

Biases = {
    'hidden1': tf.Variable(tf.random_normal([20])),
    'output': tf.Variable(tf.random_normal([len(netOutputVariables)]))
}

# Building the graph
hiddenLayer1 = tf.tanh(tf.add(tf.matmul(x, Weights['hidden1']), Biases['hidden1']))
yOut= tf.matmul(hiddenLayer1, Weights['output']) + Biases['output']

# Mean Square Error
CostFunction = tf.reduce_mean(tf.square(Y - YOut))

# Training Operation
Optimizer = tf.train.AdadeltaOptimizer(learning_rate=0.1)
TrainingFunction = Optimizer.minimize(CostFunction)

# Save optimal weights
WeightsBackup = {
    'hidden1': tf.Variable(tf.zeros([len(netInputVariables), 20])),
    'output': tf.Variable(tf.zeros([20, len(netOutputVariables)]))
}
BiasesBackup = {
    'hidden1': tf.Variable(tf.zeros([20])),
    'output': tf.Variable(tf.zeros([len(netOutputVariables)]))
}

newCostLower = [WeightsBackup[key].assign(Weights[key]) for key in Weights] + [BiasesBackup[key].assign(Biases[key]) for key in Biases]
BackupWeights = tf.group(*newCostLower)

# Restore Operation
loadOptimalWeights = [Weights[key].assign(WeightsBackup[key]) for key in Weights] + [Biases[key].assign(BiasesBackup[key]) for key in Biases]
LoadOptimalWeights = tf.group(*loadOptimalWeights)

# Training
with tf.Session() as session:
    session.run(tf.global_variables_initializer())
    lowestCosts = 100

    for epoch in range(10000):
        _, costs = session.run([TrainingFunction, CostFunction], feed_dict={X: xData, Y: yData})

        # Save weights if costs have decreased
        if costs < lowestCosts:
            lowestCosts = costs
            session.run(BackupWeights)

# Restore bests weights at the end of training
session.run(LoadOptimalWeights)

# Do some kind of evaluation
[...]

0 个答案:

没有答案